From c944effedc628b14348a89802486c2379b43a243 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 22:47:36 +0000 Subject: [PATCH 0001/1224] Bump redis.clients:jedis from 5.1.0 to 5.1.3 in /examples Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.0 to 5.1.3. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.0...v5.1.3) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 383ba2b8d48..db211e021b3 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:5.1.0' + implementation 'redis.clients:jedis:5.1.3' implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 79ebab4d131..edad61a7849 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:5.1.0' + implementation 'redis.clients:jedis:5.1.3' implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 37f68bb5f0f..65655f004d1 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { - implementation 'redis.clients:jedis:5.1.0' + implementation 'redis.clients:jedis:5.1.3' implementation 'com.google.code.gson:gson:2.10.1' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From 172f65085f4859f57f11427da9f115b19c883263 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 22:47:39 +0000 Subject: [PATCH 0002/1224] Bump org.postgresql:postgresql from 42.7.1 to 42.7.3 in /examples Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.1 to 42.7.3. - [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.7.1...REL42.7.3) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 1febab7cdc2..6f4740da76c 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.36' implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'org.json:json:20231013' - testRuntimeOnly 'org.postgresql:postgresql:42.7.1' + testRuntimeOnly 'org.postgresql:postgresql:42.7.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:postgresql' testImplementation 'org.assertj:assertj-core:3.25.3' From dd229a72ccc3e6b435cf84bcfa822f328b51305f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 May 2024 22:47:56 +0000 Subject: [PATCH 0003/1224] Bump io.lettuce:lettuce-core in /examples Bumps [io.lettuce:lettuce-core](https://github.com/lettuce-io/lettuce-core) from 6.3.1.RELEASE to 6.3.2.RELEASE. - [Release notes](https://github.com/lettuce-io/lettuce-core/releases) - [Changelog](https://github.com/redis/lettuce/blob/6.3.2.RELEASE/RELEASE-NOTES.md) - [Commits](https://github.com/lettuce-io/lettuce-core/compare/6.3.1.RELEASE...6.3.2.RELEASE) --- updated-dependencies: - dependency-name: io.lettuce:lettuce-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 73353512e03..2d2b5b084cc 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.3.1.RELEASE" + api "io.lettuce:lettuce-core:6.3.2.RELEASE" testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index d6f3e3089bf..6b1f70a366e 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.3.1.RELEASE" + api "io.lettuce:lettuce-core:6.3.2.RELEASE" testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.2" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.2" diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index 77991d80a99..292d3786851 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - api "io.lettuce:lettuce-core:6.3.1.RELEASE" + api "io.lettuce:lettuce-core:6.3.2.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(":spock") testImplementation 'ch.qos.logback:logback-classic:1.3.14' From 079caa62a91a4ca1099428d3b7f5b507c248e5ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Jun 2024 22:21:47 +0000 Subject: [PATCH 0004/1224] Bump org.freemarker:freemarker in /modules/redpanda Bumps org.freemarker:freemarker from 2.3.32 to 2.3.33. --- updated-dependencies: - dependency-name: org.freemarker:freemarker dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 895a4da4882..3af8b5d9e7a 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: Redpanda" dependencies { api project(':testcontainers') - shaded 'org.freemarker:freemarker:2.3.32' + shaded 'org.freemarker:freemarker:2.3.33' testImplementation 'org.apache.kafka:kafka-clients:3.7.0' testImplementation 'org.assertj:assertj-core:3.25.3' From 3a7dba000da647d8ed04af1272913dab52b72e14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 10 Jul 2024 15:38:12 -0600 Subject: [PATCH 0005/1224] Add grafana module (#8851) Add Grafana Otel LGTM container implementation. Expose ports for Grafana (3000), OTLP GRPC (4317), OTLP HTTP (4318) and Prometheus (9090). Also, utility methods to get URLs. Co-authored-by: Kevin Wittek --- .github/ISSUE_TEMPLATE/bug_report.yaml | 1 + .github/ISSUE_TEMPLATE/enhancement.yaml | 1 + .github/ISSUE_TEMPLATE/feature.yaml | 1 + .github/dependabot.yml | 5 ++ .github/labeler.yml | 4 + .github/settings.yml | 3 + docs/modules/grafana.md | 28 +++++++ mkdocs.yml | 1 + modules/grafana/build.gradle | 23 ++++++ .../grafana/LgtmStackContainer.java | 64 ++++++++++++++++ .../grafana/LgtmStackContainerTest.java | 76 +++++++++++++++++++ .../src/test/resources/logback-test.xml | 16 ++++ 12 files changed, 223 insertions(+) create mode 100644 docs/modules/grafana.md create mode 100644 modules/grafana/build.gradle create mode 100644 modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java create mode 100644 modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java create mode 100644 modules/grafana/src/test/resources/logback-test.xml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 1458b89d2f7..5a9cba69083 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -27,6 +27,7 @@ body: - Dynalite - Elasticsearch - GCloud + - Grafana - HiveMQ - InfluxDB - K3S diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index 2baf2be99eb..c6fb9767f60 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -27,6 +27,7 @@ body: - Dynalite - Elasticsearch - GCloud + - Grafana - HiveMQ - InfluxDB - K3S diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index fb5013a41d3..a4fba6a649e 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -27,6 +27,7 @@ body: - Dynalite - Elasticsearch - GCloud + - Grafana - HiveMQ - InfluxDB - K3S diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0bb82dce9f4..4421aeefca4 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -106,6 +106,11 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + - package-ecosystem: "gradle" + directory: "/modules/grafana" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/hivemq" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index 387b1644801..0e33e98096e 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -67,6 +67,10 @@ - changed-files: - any-glob-to-any-file: - modules/gcloud/**/* +"modules/grafana": + - changed-files: + - any-glob-to-any-file: + - modules/grafana/**/* "modules/hivemq": - changed-files: - any-glob-to-any-file: diff --git a/.github/settings.yml b/.github/settings.yml index bcf94d2d711..2bd2289af79 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -145,6 +145,9 @@ labels: - name: modules/gcloud color: '#006b75' + - name: modules/grafana + color: '#006b75' + - name: modules/hivemq color: '#006b75' diff --git a/docs/modules/grafana.md b/docs/modules/grafana.md new file mode 100644 index 00000000000..b1ec7f284ba --- /dev/null +++ b/docs/modules/grafana.md @@ -0,0 +1,28 @@ +# Grafana + +Testcontainers module for [Grafana OTel LGTM](https://hub.docker.com/r/grafana/otel-lgtm). + +## LGTM's usage examples + +You can start a Grafana OTel LGTM container instance from any Java application by using: + + +[Grafana Otel LGTM container](../../modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java) inside_block:container + + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" + ```groovy + testImplementation "org.testcontainers:grafana:{{latest_version}}" + ``` + +=== "Maven" + ```xml + + org.testcontainers + grafana + {{latest_version}} + test + + ``` diff --git a/mkdocs.yml b/mkdocs.yml index 542778488fd..b3e0e16d342 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -81,6 +81,7 @@ nav: - modules/docker_compose.md - modules/elasticsearch.md - modules/gcloud.md + - modules/grafana.md - modules/hivemq.md - modules/k3s.md - modules/k6.md diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle new file mode 100644 index 00000000000..3e2676f4f3d --- /dev/null +++ b/modules/grafana/build.gradle @@ -0,0 +1,23 @@ +description = "Testcontainers :: Grafana" + +dependencies { + api project(':testcontainers') + + testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.1' + testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' +} + +test { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(11) + } +} + +compileTestJava { + javaCompiler = javaToolchains.compilerFor { + languageVersion = JavaLanguageVersion.of(11) + } + options.release.set(11) +} diff --git a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java new file mode 100644 index 00000000000..218b37c0da0 --- /dev/null +++ b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java @@ -0,0 +1,64 @@ +package org.testcontainers.grafana; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.extern.slf4j.Slf4j; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for Grafana OTel LGTM. + *

+ * Supported image: {@code grafana/otel-lgtm} + *

+ * Exposed ports: + *

    + *
  • Grafana: 3000
  • + *
  • OTel Http: 4317
  • + *
  • OTel Grpc: 4318
  • + *
  • Prometheus: 9090
  • + *
+ */ +@Slf4j +public class LgtmStackContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("grafana/otel-lgtm"); + + private static final int GRAFANA_PORT = 3000; + + private static final int OTLP_GRPC_PORT = 4317; + + private static final int OTLP_HTTP_PORT = 4318; + + private static final int PROMETHEUS_PORT = 9090; + + public LgtmStackContainer(String image) { + this(DockerImageName.parse(image)); + } + + public LgtmStackContainer(DockerImageName image) { + super(image); + image.assertCompatibleWith(DEFAULT_IMAGE_NAME); + withExposedPorts(GRAFANA_PORT, OTLP_GRPC_PORT, OTLP_HTTP_PORT, PROMETHEUS_PORT); + waitingFor( + Wait.forLogMessage(".*The OpenTelemetry collector and the Grafana LGTM stack are up and running.*\\s", 1) + ); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + log.info("Access to the Grafana dashboard: {}", getOtlpHttpUrl()); + } + + public String getOtlpGrpcUrl() { + return "http://" + getHost() + ":" + getMappedPort(OTLP_GRPC_PORT); + } + + public String getOtlpHttpUrl() { + return "http://" + getHost() + ":" + getMappedPort(OTLP_HTTP_PORT); + } + + public String getPromehteusHttpUrl() { + return "http://" + getHost() + ":" + getMappedPort(PROMETHEUS_PORT); + } +} diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java new file mode 100644 index 00000000000..cb5dbaa630b --- /dev/null +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -0,0 +1,76 @@ +package org.testcontainers.grafana; + +import io.micrometer.core.instrument.Clock; +import io.micrometer.core.instrument.Counter; +import io.micrometer.core.instrument.MeterRegistry; +import io.micrometer.registry.otlp.OtlpConfig; +import io.micrometer.registry.otlp.OtlpMeterRegistry; +import io.restassured.RestAssured; +import io.restassured.response.Response; +import org.awaitility.Awaitility; +import org.junit.Test; +import uk.org.webcompere.systemstubs.SystemStubs; + +import java.time.Duration; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LgtmStackContainerTest { + + @Test + public void shouldPublishMetric() throws Exception { + try ( // container { + LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.6.0") + // } + ) { + lgtm.start(); + + String version = RestAssured + .get(String.format("http://%s:%s/api/health", lgtm.getHost(), lgtm.getMappedPort(3000))) + .jsonPath() + .get("version"); + assertThat(version).isEqualTo("11.0.0"); + + OtlpConfig otlpConfig = createOtlpConfig(lgtm); + MeterRegistry meterRegistry = SystemStubs + .withEnvironmentVariable("OTEL_SERVICE_NAME", "testcontainers") + .execute(() -> new OtlpMeterRegistry(otlpConfig, Clock.SYSTEM)); + Counter.builder("test.counter").register(meterRegistry).increment(2); + + Awaitility + .given() + .pollInterval(Duration.ofSeconds(2)) + .atMost(Duration.ofSeconds(5)) + .ignoreExceptions() + .untilAsserted(() -> { + Response response = RestAssured + .given() + .queryParam("query", "test_counter_total{job=\"testcontainers\"}") + .get(String.format("%s/api/v1/query", lgtm.getPromehteusHttpUrl())) + .prettyPeek() + .thenReturn(); + assertThat(response.getStatusCode()).isEqualTo(200); + assertThat(response.body().jsonPath().getList("data.result[0].value")).contains("2"); + }); + } + } + + private static OtlpConfig createOtlpConfig(LgtmStackContainer lgtm) { + return new OtlpConfig() { + @Override + public String url() { + return String.format("%s/v1/metrics", lgtm.getOtlpHttpUrl()); + } + + @Override + public Duration step() { + return Duration.ofSeconds(1); + } + + @Override + public String get(String s) { + return null; + } + }; + } +} diff --git a/modules/grafana/src/test/resources/logback-test.xml b/modules/grafana/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/grafana/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + + From 62976814afdc18e332835abf5e8f1d05887a4dca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:38:58 +0000 Subject: [PATCH 0006/1224] Bump org.assertj:assertj-core in /modules/cassandra Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/cassandra/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index b043f5bec92..3d27fe65cac 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -11,5 +11,5 @@ dependencies { api "com.datastax.cassandra:cassandra-driver-core:3.10.0" testImplementation 'com.datastax.oss:java-driver-core:4.17.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From a05ffc333b4eb586b971d7e8dfa39d294cbdc114 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:38:58 +0000 Subject: [PATCH 0007/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/chromadb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/chromadb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index f1642346871..09ce354f1c0 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: ChromaDB" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.4.0' } From f93efd76d9311a3e205b1c41221e5fd471120452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:02 +0000 Subject: [PATCH 0008/1224] Bump org.assertj:assertj-core in /modules/cockroachdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/cockroachdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 376d742b76c..603c9361065 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.3' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From e0a307e5de1b614f1a33eff2b8972cb2d5148d54 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:02 +0000 Subject: [PATCH 0009/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 12.7.0.jre8-preview to 12.7.1.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 cd8574d6e0e..5249edf9781 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' testImplementation project(':jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.7.0.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.7.1.jre8-preview' testImplementation project(':r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' From 6c21c11913aa5ef1daefe10235d634cde0d2b798 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:03 +0000 Subject: [PATCH 0010/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/neo4j Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 ec1503e852e..073c1f24b25 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -34,5 +34,5 @@ dependencies { api project(":testcontainers") testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.16' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 7fc77db18ab7c305f9cb6af353d5539090f7f845 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:04 +0000 Subject: [PATCH 0011/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/influxdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/influxdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index f8b76c4945c..9cf1e8d5ab0 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -5,7 +5,7 @@ dependencies { compileOnly 'org.influxdb:influxdb-java:2.24' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.influxdb:influxdb-java:2.24' testImplementation "com.influxdb:influxdb-client-java:6.12.0" } From f47045d1a639b65b873b8bd2f832cf6465489f43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:06 +0000 Subject: [PATCH 0012/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/redpanda Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 895a4da4882..af8bea88c05 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -5,6 +5,6 @@ dependencies { shaded 'org.freemarker:freemarker:2.3.32' testImplementation 'org.apache.kafka:kafka-clients:3.7.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.4.0' } From 523f26290e81bb2c431eb02a264dd9fffadd8a97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:07 +0000 Subject: [PATCH 0013/1224] Bump org.assertj:assertj-core in /modules/toxiproxy Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index a484d1018b5..95cc199dca1 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -5,5 +5,5 @@ dependencies { api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' testImplementation 'redis.clients:jedis:3.0.1' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 43e09ec4fdd11589307005ed7d6a9f637b89e44d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:07 +0000 Subject: [PATCH 0014/1224] Bump org.assertj:assertj-core in /modules/mockserver Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/mockserver/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index a189c1d54b9..31f4944a572 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.mock-server:mockserver-client-java:5.15.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 781c6a7eeddc438233a78e44b23de84194408b15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:08 +0000 Subject: [PATCH 0015/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/qdrant Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index e98607f9e22..605a935ceae 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Qdrant" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.qdrant:client:1.9.1' testImplementation platform('io.grpc:grpc-bom:1.64.0') testImplementation 'io.grpc:grpc-stub' From cb7e05e3082665a08e64f18f94fd70b46da043b6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:09 +0000 Subject: [PATCH 0016/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/jdbc Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 bed25425fc2..ef0f675e5a1 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'org.vibur:vibur-dbcp:25.0' testImplementation 'org.apache.tomcat:tomcat-jdbc:10.1.24' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') } From c33902bcc9173543207a48e477748125bfb0d5d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:09 +0000 Subject: [PATCH 0017/1224] Bump io.rest-assured:rest-assured in /modules/grafana Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 3e2676f4f3d..5b914d086ec 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.25.3' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.1' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' } From fd57f3d8a33105be02f4befbd1a8ed501fec987f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:11 +0000 Subject: [PATCH 0018/1224] Bump org.assertj:assertj-core in /modules/couchbase Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 89dccfa7202..c9c3d2f1bdc 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation 'com.couchbase.client:java-client:3.6.2' testImplementation 'org.awaitility:awaitility:4.2.1' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 8a6dab4c31bf249efcb8b58ea6bdf95b7bec01c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:12 +0000 Subject: [PATCH 0019/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/orientdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 881186d91ef..800fb62093e 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -5,7 +5,7 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.29" - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.26" } From f7f1835be5f52c4e6401efedacc3cd9a1c30deb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:13 +0000 Subject: [PATCH 0020/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/azure Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index e2609ca2461..c0306fbcadf 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -5,6 +5,6 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:4.12.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.azure:azure-cosmos:4.60.0' } From 55ef0e8c35829c0c37e75af748c37976b4caf606 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:15 +0000 Subject: [PATCH 0021/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/vault Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 eb9f3324605..88c83619783 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -5,6 +5,6 @@ dependencies { testImplementation 'com.bettercloud:vault-java-driver:5.1.0' testImplementation 'io.rest-assured:rest-assured:5.4.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 7f9c3afe4aabb0365a90ac633f5b9987afb7585e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:15 +0000 Subject: [PATCH 0022/1224] Bump org.assertj:assertj-core in /modules/junit-jupiter Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 3beaefa3cb5..0c2afa77dee 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') } - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.postgresql:postgresql:42.7.3' From c9129465d3b664a48a9a507087adbd95b7d47be9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:15 +0000 Subject: [PATCH 0023/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/activemq Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 300a4d667ae..ef3e8063ebd 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation "org.apache.activemq:activemq-client:6.1.2" testImplementation "org.apache.activemq:artemis-jakarta-client:2.33.0" } From 10851a02cca516d30459d102e308aab1c0539b0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:16 +0000 Subject: [PATCH 0024/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/solace Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 7ef43a44b83..f7ff8eec524 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.2.1' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.solacesystems:sol-jcsmp:10.23.0' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' From c78fb516787265bf45f03a42d834c782db5499f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:17 +0000 Subject: [PATCH 0025/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/db2 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/db2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 65f2b953b68..3a773f21534 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':jdbc-test') testRuntimeOnly 'com.ibm.db2:jcc:11.5.9.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From ddb1f6e2ce3c316fade0fc4d073a6b178cc2cb00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:17 +0000 Subject: [PATCH 0026/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/kafka Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 6dd12daa49e..11f72fce54a 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') testImplementation 'org.apache.kafka:kafka-clients:3.7.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' } From 880b7c625c216ca6113ef3092ac1a80cab672a7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:18 +0000 Subject: [PATCH 0027/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/minio Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index 83af1c868d0..7b73ebaae77 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation("io.minio:minio:8.5.10") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From e019854eb3a9c5caa508e27b590df42499d8f8b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:21 +0000 Subject: [PATCH 0028/1224] Bump org.assertj:assertj-core in /modules/jdbc-test Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 d6c455992cf..ce9476e4416 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'com.googlecode.junit-toolbox:junit-toolbox:2.4' - api 'org.assertj:assertj-core:3.25.3' + api 'org.assertj:assertj-core:3.26.3' api 'org.apache.tomcat:tomcat-jdbc:10.0.27' api 'org.vibur:vibur-dbcp:25.0' From 6eefbf5266779a695987e18b693d50889d67d3dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:21 +0000 Subject: [PATCH 0029/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/consul Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/consul/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index 81b449d6b7e..fcf57ac8082 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.ecwid.consul:consul-api:1.4.5' testImplementation 'io.rest-assured:rest-assured:5.4.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From a3da423a01d79bdcbefeb0f21104ba39a5f5d9cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:22 +0000 Subject: [PATCH 0030/1224] Bump org.assertj:assertj-core in /modules/database-commons Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 c7033d45a0b..2a1ead4c215 100644 --- a/modules/database-commons/build.gradle +++ b/modules/database-commons/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Database-Commons" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 7cdd520a0bc7400ca21e9a4fde682a7bf2faeaf1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:23 +0000 Subject: [PATCH 0031/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/nginx Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/nginx/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index 3021ff03241..13232b4bfce 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') compileOnly 'org.jetbrains:annotations:24.1.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From c0fb4c92bbead24e30e90cc8a7d0ffc31198296e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:25 +0000 Subject: [PATCH 0032/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/questdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 574b6246f86..a2d138b9c30 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -6,7 +6,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.3' testImplementation project(':jdbc-test') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.questdb:questdb:7.3.9' testImplementation 'org.awaitility:awaitility:4.2.1' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' From 653b0c0fc60e3ddde589d0908c3ce055dc28fa3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:25 +0000 Subject: [PATCH 0033/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/openfga Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 1e1fe7c93f0..5bece5f3b9c 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'dev.openfga:openfga-sdk:0.4.2' } From d1775e0bf504dafd29322ea1b7269093078b7e97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:26 +0000 Subject: [PATCH 0034/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/ollama Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/ollama/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index 1f65324bf10..7c2c940633d 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: Ollama" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.4.0' } From 6641d44b2a7e61cca4746cd907412778342856a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:29 +0000 Subject: [PATCH 0035/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/k6 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/k6/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k6/build.gradle b/modules/k6/build.gradle index e59c07d99e8..5bf8d773da0 100644 --- a/modules/k6/build.gradle +++ b/modules/k6/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: k6" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 734d25e2b3678f9458146745c8f051c65e592681 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:30 +0000 Subject: [PATCH 0036/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/k3s Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 3d46e330847..0bd9db8a0d5 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -10,5 +10,5 @@ dependencies { testImplementation 'io.fabric8:kubernetes-client:6.12.1' testImplementation 'io.kubernetes:client-java:20.0.1-legacy' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 158fe0fbe21d7b57a755a38083c1a1e623a69e97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:34 +0000 Subject: [PATCH 0037/1224] Bump org.assertj:assertj-core in /modules/elasticsearch Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 0a9b990ab2e..fe2b32e679d 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.13.4" testImplementation "org.elasticsearch.client:transport:7.17.21" - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 93a6a5f3e847fa148d698dd231e66677aff4cf15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:35 +0000 Subject: [PATCH 0038/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/pulsar Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 efcd24690ce..7e7e4e533b5 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') testImplementation group: 'org.apache.pulsar', name: 'pulsar-client', version: '3.2.3' - testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.25.3' + testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.26.3' testImplementation group: 'org.apache.pulsar', name: 'pulsar-client-admin', version: '3.2.3' } From 78e3aad5678046f041c023f0f7ab2c81a31a441a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:35 +0000 Subject: [PATCH 0039/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/rabbitmq Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 69d7ef6979f..f8959b6c5ea 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") testImplementation 'com.rabbitmq:amqp-client:5.21.0' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' compileOnly 'org.jetbrains:annotations:24.1.0' } From 4046769250341fff64025309c14410fc5dbd1c04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:39 +0000 Subject: [PATCH 0040/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/solr Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solr/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index cb8ed2726a8..d8ff7aeba39 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -6,5 +6,5 @@ dependencies { shaded 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'org.apache.solr:solr-solrj:8.11.3' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From ee12fc7a20309a1ba13e0e86a99d5888d17fb995 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:43 +0000 Subject: [PATCH 0041/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/gcloud Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index daa9da34a0f..ff8b723418f 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -10,5 +10,5 @@ dependencies { testImplementation 'com.google.cloud:google-cloud-pubsub' testImplementation 'com.google.cloud:google-cloud-spanner' testImplementation 'com.google.cloud:google-cloud-bigtable' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 5adcb0dded41913a925072466e923914323dcea2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:46 +0000 Subject: [PATCH 0042/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/r2dbc Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 8ce9c975b79..f2debc68648 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -11,10 +11,10 @@ dependencies { api project(':testcontainers') api 'io.r2dbc:r2dbc-spi:0.9.0.RELEASE' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':postgresql') testFixturesImplementation 'io.projectreactor:reactor-core:3.6.6' - testFixturesImplementation 'org.assertj:assertj-core:3.25.3' + testFixturesImplementation 'org.assertj:assertj-core:3.26.3' } From 5fd14bc6fa01b968206d13b0df4c00eb8fc861ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:46 +0000 Subject: [PATCH 0043/1224] Bump org.mongodb:mongodb-driver-sync in /modules/mongodb Bumps [org.mongodb:mongodb-driver-sync](https://github.com/mongodb/mongo-java-driver) from 5.1.0 to 5.1.2. - [Release notes](https://github.com/mongodb/mongo-java-driver/releases) - [Commits](https://github.com/mongodb/mongo-java-driver/compare/r5.1.0...r5.1.2) --- updated-dependencies: - dependency-name: org.mongodb:mongodb-driver-sync dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/mongodb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index ffcb89cebb5..10f63aeae07 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: MongoDB" dependencies { api project(':testcontainers') - testImplementation("org.mongodb:mongodb-driver-sync:5.1.0") + testImplementation("org.mongodb:mongodb-driver-sync:5.1.2") testImplementation 'org.assertj:assertj-core:3.25.3' } From 00fec0843fab2cb64acd42eb43c56eab71a51592 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 21:39:53 +0000 Subject: [PATCH 0044/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/selenium Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/selenium/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index c84a0fd88eb..da8ad97f933 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.mortbay.jetty:jetty:6.1.26' testImplementation project(':nginx') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' compileOnly 'org.jetbrains:annotations:24.1.0' } From a9db0a9968ac8f76d17173fa881465c5668fbd15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 10 Jul 2024 15:42:31 -0600 Subject: [PATCH 0045/1224] Remove unused ImageNameSubstitutor service (#8873) --- .../services/org.testcontainers.utility.ImageNameSubstitutor | 1 - 1 file changed, 1 deletion(-) delete mode 100644 core/src/main/resources/META-INF/services/org.testcontainers.utility.ImageNameSubstitutor diff --git a/core/src/main/resources/META-INF/services/org.testcontainers.utility.ImageNameSubstitutor b/core/src/main/resources/META-INF/services/org.testcontainers.utility.ImageNameSubstitutor deleted file mode 100644 index 069dc7ee710..00000000000 --- a/core/src/main/resources/META-INF/services/org.testcontainers.utility.ImageNameSubstitutor +++ /dev/null @@ -1 +0,0 @@ -org.testcontainers.utility.DefaultImageNameSubstitutor From e1520a0a2b46032a3eb34ced18d59547a9782fc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 10 Jul 2024 16:30:13 -0600 Subject: [PATCH 0046/1224] Add smoke test to dependabot (#8928) --- .github/dependabot.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4421aeefca4..0eea5afdd43 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -376,6 +376,13 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "com.diffplug.spotless" update-types: [ "version-update:semver-minor" ] + + # Smoke test + - package-ecosystem: "gradle" + directory: "/smoke-test" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 # GitHub Actions - package-ecosystem: "github-actions" From d94fec3dcfbe387564457fd7af2571b1411c8833 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Jul 2024 22:31:24 +0000 Subject: [PATCH 0047/1224] Bump org.seleniumhq.selenium:selenium-api in /smoke-test Bumps [org.seleniumhq.selenium:selenium-api](https://github.com/SeleniumHQ/selenium) from 4.21.0 to 4.22.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.21.0...selenium-4.22.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index fa752256d29..d900109b1c9 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(":mysql") testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation "org.seleniumhq.selenium:selenium-api:4.21.0" + testImplementation "org.seleniumhq.selenium:selenium-api:4.22.0" testImplementation 'org.assertj:assertj-core:3.25.3' } From 5fbffbd59d66a4653282ec43ede8a2895f0b4b9c Mon Sep 17 00:00:00 2001 From: Maarten Vercruysse <67873169+MV-GH@users.noreply.github.com> Date: Thu, 11 Jul 2024 11:41:58 +0200 Subject: [PATCH 0048/1224] Clarify reuse property setting in docs (#8872) --- .../testcontainers/utility/TestcontainersConfiguration.java | 1 - docs/features/reuse.md | 6 +++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java index 921e36f80cd..e67a0b83ee2 100644 --- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java +++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java @@ -181,7 +181,6 @@ public boolean isDisableChecks() { @UnstableAPI public boolean environmentSupportsReuse() { - // specifically not supported as an environment variable or classpath property return Boolean.parseBoolean(getEnvVarOrUserProperty("testcontainers.reuse.enable", "false")); } diff --git a/docs/features/reuse.md b/docs/features/reuse.md index b36669876c2..f7d8062138c 100644 --- a/docs/features/reuse.md +++ b/docs/features/reuse.md @@ -16,7 +16,11 @@ opt-in mechanism per environment. To reuse a container, the container configurat ## How to use it -* Enable `Reusable Containers` in `~/.testcontainers.properties`, by adding `testcontainers.reuse.enable=true` +* Enable `Reusable Containers` + * through environment variable `TESTCONTAINERS_REUSE_ENABLE=true` + * through user property file `~/.testcontainers.properties`, by adding `testcontainers.reuse.enable=true` + * **not** through classpath properties file [see this comment](https://github.com/testcontainers/testcontainers-java/issues/5364#issuecomment-1125907734) + * Define a container and subscribe to reuse the container using `withReuse(true)` ```java From 242e7287ada39cb32c75c476c53f155645165e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 11 Jul 2024 13:02:45 -0600 Subject: [PATCH 0049/1224] Update docker-java version to 3.4.0 (#8942) --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 41f6a8279fe..ddc4c5ffacb 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -88,8 +88,8 @@ dependencies { shaded 'org.awaitility:awaitility:4.2.1' - api platform('com.github.docker-java:docker-java-bom:3.3.6') - shaded platform('com.github.docker-java:docker-java-bom:3.3.6') + api platform('com.github.docker-java:docker-java-bom:3.4.0') + shaded platform('com.github.docker-java:docker-java-bom:3.4.0') api "com.github.docker-java:docker-java-api" From 90b098bca5eb2e4260167783535907f076df7b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 11 Jul 2024 16:14:13 -0500 Subject: [PATCH 0050/1224] Exclude testcontainers from milvus dependency --- modules/milvus/build.gradle | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index c24931be45f..8f1a4a5f804 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,5 +4,8 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.25.3' - testImplementation 'io.milvus:milvus-sdk-java:2.4.1' + testImplementation('io.milvus:milvus-sdk-java:2.4.1') { + exclude(group: 'org.testcontainers', module: 'milvus') + exclude(group: 'org.testcontainers', module: 'junit-jupiter') + } } From 18a7c277bc749057bf5783a50ee3d1a052fab022 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 11 Jul 2024 17:18:01 -0600 Subject: [PATCH 0051/1224] Load `ImageNameSubstitutor` from Service Loaders mechanism (#8866) Add additional mechanism to load `ImageNameSubstitutor`. --- .../utility/ImageNameSubstitutor.java | 53 +++++++++++------- .../utility/ImageNameSubstitutorTest.java | 55 +++++++++++++++++++ docs/features/image_name_substitution.md | 7 +++ 3 files changed, 96 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/org/testcontainers/utility/ImageNameSubstitutor.java b/core/src/main/java/org/testcontainers/utility/ImageNameSubstitutor.java index 54372cd726f..e46d091d657 100644 --- a/core/src/main/java/org/testcontainers/utility/ImageNameSubstitutor.java +++ b/core/src/main/java/org/testcontainers/utility/ImageNameSubstitutor.java @@ -4,7 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.testcontainers.UnstableAPI; +import java.util.ServiceLoader; import java.util.function.Function; +import java.util.stream.StreamSupport; /** * An image name substitutor converts a Docker image name, as may be specified in code, to an alternative name. @@ -25,26 +27,19 @@ public abstract class ImageNameSubstitutor implements Function clazz) throws IOException { + Path classFile = Paths.get(tempDir.toString(), classFilePath); + Files.createDirectories(classFile.getParent()); + Files.copy(clazz.getResourceAsStream("/" + classFilePath), classFile); + } + + private void createServiceProviderFile(Path metaInfDir, String serviceInterface, String... implementations) + throws IOException { + Path serviceFile = Paths.get(metaInfDir.toString(), serviceInterface); + try (FileWriter writer = new FileWriter(serviceFile.toFile())) { + for (String impl : implementations) { + writer.write(impl + "\n"); + } + } + } } diff --git a/docs/features/image_name_substitution.md b/docs/features/image_name_substitution.md index cf2b09d3d8e..0948e9fa2c7 100644 --- a/docs/features/image_name_substitution.md +++ b/docs/features/image_name_substitution.md @@ -125,6 +125,13 @@ Note that it is also possible to provide this same configuration property: Please see [the documentation on configuration mechanisms](./configuration.md) for more information. +Also, you can use the `ServiceLoader` mechanism to provide the fully qualified class name of the `ImageNameSubstitutor` implementation: + +=== "`src/test/resources/META-INF/services/org.testcontainers.utility.ImageNameSubstitutor`" + ```text + com.mycompany.testcontainers.ExampleImageNameSubstitutor + ``` + ## Overriding image names individually in configuration From 01469c3bb3db7ea6fa90b8d68c7471e9a9eb0bf1 Mon Sep 17 00:00:00 2001 From: Alex B <45384811+AB-xdev@users.noreply.github.com> Date: Mon, 15 Jul 2024 18:14:34 +0200 Subject: [PATCH 0052/1224] [Docs] Add TCI to external integrations (#8947) --- docs/test_framework_integration/external.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/test_framework_integration/external.md b/docs/test_framework_integration/external.md index b3f55783123..3f97b9f64cb 100644 --- a/docs/test_framework_integration/external.md +++ b/docs/test_framework_integration/external.md @@ -7,3 +7,4 @@ The following Open Source frameworks add direct integration to Testcontainers | jqwik | [jqwik-testcontainers](https://github.com/jqwik-team/jqwik-testcontainers) | [README](https://github.com/jqwik-team/jqwik-testcontainers) | | Kotest | [Kotest Extensions Testcontainers](https://github.com/kotest/kotest-extensions-testcontainers) | [kotest.io](https://kotest.io/docs/extensions/test_containers.html) | | Synthesized | [Synthesized TDK-Testcontainers integration](https://github.com/synthesized-io/tdk-tc) | [synthesized.io](https://docs.synthesized.io/tdk/latest/user_guide/integrations/testcontainers) | +| TCI | [Testcontainers Infrastructure (TCI) Framework](https://github.com/xdev-software/tci-base) | [README](https://github.com/xdev-software/tci-base) | From d3bb876c40b50520c8a6d31acd04a4a192d10464 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:22:40 +0000 Subject: [PATCH 0053/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 10.1.24 to 10.1.26. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 bed25425fc2..934df08ae73 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:24.1.0' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:25.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:10.1.24' + testImplementation 'org.apache.tomcat:tomcat-jdbc:10.1.26' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation 'org.assertj:assertj-core:3.25.3' testImplementation ('org.mockito:mockito-core:4.11.0') { From 95f07f7ca09a084f68cf381edde5cfecb8c8c62c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:23:58 +0000 Subject: [PATCH 0054/1224] Bump io.trino:trino-jdbc from 448 to 452 in /modules/trino Bumps io.trino:trino-jdbc from 448 to 452. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 06ae2b2cffe..1bfb93e4c37 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:448' + testRuntimeOnly 'io.trino:trino-jdbc:452' compileOnly 'org.jetbrains:annotations:24.1.0' } From cc64e46e9f26dc40809b86b718feab574e461494 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:30:50 +0000 Subject: [PATCH 0055/1224] Bump io.grpc:grpc-bom from 1.64.0 to 1.65.1 in /modules/qdrant Bumps [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) from 1.64.0 to 1.65.1. - [Release notes](https://github.com/grpc/grpc-java/releases) - [Commits](https://github.com/grpc/grpc-java/compare/v1.64.0...v1.65.1) --- updated-dependencies: - dependency-name: io.grpc:grpc-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index e98607f9e22..4273430ca58 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.25.3' testImplementation 'io.qdrant:client:1.9.1' - testImplementation platform('io.grpc:grpc-bom:1.64.0') + testImplementation platform('io.grpc:grpc-bom:1.65.1') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' testImplementation 'io.grpc:grpc-netty-shaded' From 0b13f4cec5546d1127e67323e21c77792ae44293 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:32:04 +0000 Subject: [PATCH 0056/1224] Bump io.milvus:milvus-sdk-java from 2.4.1 to 2.4.2 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.4.1 to 2.4.2. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.4.1...v2.4.2) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 8f1a4a5f804..76406164e7a 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.25.3' - testImplementation('io.milvus:milvus-sdk-java:2.4.1') { + testImplementation('io.milvus:milvus-sdk-java:2.4.2') { exclude(group: 'org.testcontainers', module: 'milvus') exclude(group: 'org.testcontainers', module: 'junit-jupiter') } From 7f296f2ff50b8f137fe388b2c71a0b382aa47648 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jul 2024 22:56:48 +0000 Subject: [PATCH 0057/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 8.13.4 to 8.14.3. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v8.13.4...v8.14.3) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 0a9b990ab2e..c435b67be16 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.13.4" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.14.3" testImplementation "org.elasticsearch.client:transport:7.17.21" testImplementation 'org.assertj:assertj-core:3.25.3' } From ae7a94937a4ef7a89aa735c8e294aa48994fc373 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 16 Jul 2024 09:44:03 -0600 Subject: [PATCH 0058/1224] Update ryuk version to 0.8.1 (#8957) --- .../src/main/java/org/testcontainers/utility/RyukContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/utility/RyukContainer.java b/core/src/main/java/org/testcontainers/utility/RyukContainer.java index 61bceb60b0b..a4032619ae2 100644 --- a/core/src/main/java/org/testcontainers/utility/RyukContainer.java +++ b/core/src/main/java/org/testcontainers/utility/RyukContainer.java @@ -9,7 +9,7 @@ class RyukContainer extends GenericContainer { RyukContainer() { - super("testcontainers/ryuk:0.7.0"); + super("testcontainers/ryuk:0.8.1"); withExposedPorts(8080); withCreateContainerCmdModifier(cmd -> { cmd.withName("testcontainers-ryuk-" + DockerClientFactory.SESSION_ID); From 1442b1ce682a39670b9110f1df78c93db17b63e1 Mon Sep 17 00:00:00 2001 From: aasawariMongoDB <103485554+aasawariMongoDB@users.noreply.github.com> Date: Wed, 17 Jul 2024 09:42:32 +0530 Subject: [PATCH 0059/1224] Add test compatibility against MongoDB 7 (#8868) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../org/testcontainers/containers/MongoDBContainerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java index c801dad5378..8952c6802e6 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java @@ -24,8 +24,8 @@ public void shouldExecuteTransactions() { } @Test - public void supportsMongoDB_4_4() { - try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.4")) { + public void supportsMongoDB_7_0() { + try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0")) { mongoDBContainer.start(); } } From 6a0765097ae77b81255aaf845874d170d5473654 Mon Sep 17 00:00:00 2001 From: Guram Savinov Date: Wed, 17 Jul 2024 07:22:29 +0300 Subject: [PATCH 0060/1224] Support multiple init scripts in JdbcDatabaseContainer (#7680) Fixes #2232 --- .../containers/JdbcDatabaseContainer.java | 40 ++++++++++++++++--- .../postgresql/SimplePostgreSQLTest.java | 21 ++++++++++ .../resources/somepath/init_postgresql_2.sql | 5 +++ 3 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 modules/postgresql/src/test/resources/somepath/init_postgresql_2.sql 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 2247b2e867f..713cb81bb62 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -17,7 +17,10 @@ import java.sql.Driver; import java.sql.SQLException; import java.sql.Statement; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Properties; import java.util.concurrent.Future; @@ -35,7 +38,7 @@ public abstract class JdbcDatabaseContainer initScriptPaths = new ArrayList<>(); protected Map parameters = new HashMap<>(); @@ -133,8 +136,37 @@ public SELF withConnectTimeoutSeconds(int connectTimeoutSeconds) { return self(); } + /** + * Sets a script for initialization. + * + * @param initScriptPath path to the script file + * @return self + */ public SELF withInitScript(String initScriptPath) { - this.initScriptPath = initScriptPath; + this.initScriptPaths = new ArrayList<>(); + this.initScriptPaths.add(initScriptPath); + return self(); + } + + /** + * Sets an ordered array of scripts for initialization. + * + * @param initScriptPaths paths to the script files + * @return self + */ + public SELF withInitScripts(String... initScriptPaths) { + return withInitScripts(Arrays.asList(initScriptPaths)); + } + + /** + * Sets an ordered collection of scripts for initialization. + * + * @param initScriptPaths paths to the script files + * @return self + */ + public SELF withInitScripts(Iterable initScriptPaths) { + this.initScriptPaths = new ArrayList<>(); + initScriptPaths.forEach(this.initScriptPaths::add); return self(); } @@ -329,9 +361,7 @@ protected void optionallyMapResourceParameterAsVolume( * Load init script content and apply it to the database if initScriptPath is set */ protected void runInitScriptIfRequired() { - if (initScriptPath != null) { - ScriptUtils.runInitScript(getDatabaseDelegate(), initScriptPath); - } + initScriptPaths.forEach(path -> ScriptUtils.runInitScript(getDatabaseDelegate(), path)); } public void setParameters(Map parameters) { 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 84beb779fa4..bc2fb0289e3 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 @@ -74,6 +74,27 @@ public void testExplicitInitScript() throws SQLException { } } + @Test + public void testExplicitInitScripts() throws SQLException { + try ( + PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + .withInitScripts("somepath/init_postgresql.sql", "somepath/init_postgresql_2.sql") + ) { + postgres.start(); + + ResultSet resultSet = performQuery( + postgres, + "SELECT foo AS value FROM bar UNION SELECT bar AS value FROM foo" + ); + + String columnValue1 = resultSet.getString(1); + resultSet.next(); + String columnValue2 = resultSet.getString(1); + assertThat(columnValue1).as("Value from init script 1 should equal real value").isEqualTo("hello world"); + assertThat(columnValue2).as("Value from init script 2 should equal real value").isEqualTo("hello world 2"); + } + } + @Test public void testWithAdditionalUrlParamInJdbcUrl() { try ( diff --git a/modules/postgresql/src/test/resources/somepath/init_postgresql_2.sql b/modules/postgresql/src/test/resources/somepath/init_postgresql_2.sql new file mode 100644 index 00000000000..f4ecf9bbfad --- /dev/null +++ b/modules/postgresql/src/test/resources/somepath/init_postgresql_2.sql @@ -0,0 +1,5 @@ +CREATE TABLE foo ( + bar VARCHAR(255) +); + +INSERT INTO foo (bar) VALUES ('hello world 2'); From a321cfad77362924d154fdf53b080c03cc156790 Mon Sep 17 00:00:00 2001 From: Wim Deblauwe Date: Wed, 17 Jul 2024 07:40:56 +0200 Subject: [PATCH 0061/1224] Allow copy specific files to docker compose (#8848) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds support for a `withCopyFilesInContainer` method on `ComposeContainer` and `DockerComposeContainer`. It allows to specify what files or directories should be copied, instead of just copying all files. If not used, the current behavior is preserved. Fixes #8847 --------- Co-authored-by: Eddú Meléndez --- core/build.gradle | 1 + .../containers/ComposeContainer.java | 12 ++- .../containers/ComposeDelegate.java | 17 ++-- .../ContainerisedDockerCompose.java | 24 ++++- .../containers/DockerComposeContainer.java | 12 ++- .../ComposeContainerWithCopyFilesTest.java | 87 +++++++++++++++++++ ...ckerComposeContainerWithCopyFilesTest.java | 70 +++++++++++++++ .../compose-file-copy-inclusions/.env | 1 + .../compose-file-copy-inclusions/Dockerfile | 9 ++ .../EnvVariableRestEndpoint.java | 45 ++++++++++ .../compose-root-only.yml | 7 ++ .../compose-test-only.yml | 7 ++ .../compose-file-copy-inclusions/compose.yml | 8 ++ .../compose-file-copy-inclusions/test/.env | 1 + docs/modules/docker_compose.md | 20 +++++ 15 files changed, 310 insertions(+), 11 deletions(-) create mode 100644 core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java create mode 100644 core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java create mode 100644 core/src/test/resources/compose-file-copy-inclusions/.env create mode 100644 core/src/test/resources/compose-file-copy-inclusions/Dockerfile create mode 100644 core/src/test/resources/compose-file-copy-inclusions/EnvVariableRestEndpoint.java create mode 100644 core/src/test/resources/compose-file-copy-inclusions/compose-root-only.yml create mode 100644 core/src/test/resources/compose-file-copy-inclusions/compose-test-only.yml create mode 100644 core/src/test/resources/compose-file-copy-inclusions/compose.yml create mode 100644 core/src/test/resources/compose-file-copy-inclusions/test/.env diff --git a/core/build.gradle b/core/build.gradle index ddc4c5ffacb..6d8b637af0e 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -121,6 +121,7 @@ dependencies { testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'io.rest-assured:rest-assured:5.4.0' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" diff --git a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java index a865e744dd6..5add02183ae 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java @@ -67,6 +67,8 @@ public class ComposeContainer extends FailureDetectingExternalResource implement private String project; + private List filesInDirectory = new ArrayList<>(); + public ComposeContainer(File... composeFiles) { this(Arrays.asList(composeFiles)); } @@ -134,7 +136,8 @@ public void start() { this.options, this.services, this.scalingPreferences, - this.env + this.env, + this.filesInDirectory ); this.composeDelegate.startAmbassadorContainer(); this.composeDelegate.waitUntilServiceStarted(this.tailChildContainers); @@ -165,7 +168,7 @@ public void stop() { if (removeImages != null) { cmd += " --rmi " + removeImages.dockerRemoveImagesType(); } - this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env); + this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env, this.filesInDirectory); } finally { this.project = this.composeDelegate.randomProjectId(); } @@ -352,6 +355,11 @@ public ComposeContainer withStartupTimeout(Duration startupTimeout) { return this; } + public ComposeContainer withCopyFilesInContainer(String... fileCopyInclusions) { + this.filesInDirectory = Arrays.asList(fileCopyInclusions); + return this; + } + public Optional getContainerByServiceName(String serviceName) { return this.composeDelegate.getContainerByServiceName(serviceName); } diff --git a/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java b/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java index a5189c8efa3..0b09e9c2683 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java @@ -126,7 +126,8 @@ void createServices( final Set options, final List services, final Map scalingPreferences, - Map env + Map env, + List fileCopyInclusions ) { // services that have been explicitly requested to be started. If empty, all services should be started. final String serviceNameArgs = Stream @@ -160,7 +161,7 @@ void createServices( } // Run the docker compose container, which starts up the services - runWithCompose(localCompose, command, env); + runWithCompose(localCompose, command, env, fileCopyInclusions); } private String getUpCommand(String options) { @@ -237,10 +238,15 @@ private String getServiceNameFromContainer(com.github.dockerjava.api.model.Conta } public void runWithCompose(boolean localCompose, String cmd) { - runWithCompose(localCompose, cmd, Collections.emptyMap()); + runWithCompose(localCompose, cmd, Collections.emptyMap(), Collections.emptyList()); } - public void runWithCompose(boolean localCompose, String cmd, Map env) { + public void runWithCompose( + boolean localCompose, + String cmd, + Map env, + List fileCopyInclusions + ) { Preconditions.checkNotNull(composeFiles); Preconditions.checkArgument(!composeFiles.isEmpty(), "No docker compose file have been provided"); @@ -248,7 +254,8 @@ public void runWithCompose(boolean localCompose, String cmd, Map if (localCompose) { dockerCompose = new LocalDockerCompose(this.executable, composeFiles, project); } else { - dockerCompose = new ContainerisedDockerCompose(this.defaultImageName, composeFiles, project); + dockerCompose = + new ContainerisedDockerCompose(this.defaultImageName, composeFiles, project, fileCopyInclusions); } dockerCompose.withCommand(cmd).withEnv(env).invoke(); diff --git a/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java b/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java index e1b7aaa604b..7cff2c77271 100644 --- a/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java +++ b/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java @@ -24,7 +24,12 @@ class ContainerisedDockerCompose extends GenericContainer composeFiles, String identifier) { + public ContainerisedDockerCompose( + DockerImageName dockerImageName, + List composeFiles, + String identifier, + List fileCopyInclusions + ) { super(dockerImageName); addEnv(ENV_PROJECT_NAME, identifier); @@ -43,7 +48,22 @@ public ContainerisedDockerCompose(DockerImageName dockerImageName, List co final String composeFileEnvVariableValue = Joiner.on(UNIX_PATH_SEPARATOR).join(absoluteDockerComposeFiles); // we always need the UNIX path separator logger().debug("Set env COMPOSE_FILE={}", composeFileEnvVariableValue); addEnv(ENV_COMPOSE_FILE, composeFileEnvVariableValue); - withCopyFileToContainer(MountableFile.forHostPath(pwd), containerPwd); + if (fileCopyInclusions.isEmpty()) { + logger().info("Copying all files in {} into the container", pwd); + withCopyFileToContainer(MountableFile.forHostPath(pwd), containerPwd); + } else { + // Always copy the compose file itself + logger().info("Copying docker compose file: {}", dockerComposeBaseFile.getAbsolutePath()); + withCopyFileToContainer( + MountableFile.forHostPath(dockerComposeBaseFile.getAbsolutePath()), + convertToUnixFilesystemPath(dockerComposeBaseFile.getAbsolutePath()) + ); + for (String pathToCopy : fileCopyInclusions) { + String hostPath = pwd + "/" + pathToCopy; + logger().info("Copying inclusion file: {}", hostPath); + withCopyFileToContainer(MountableFile.forHostPath(hostPath), convertToUnixFilesystemPath(hostPath)); + } + } // Ensure that compose can access docker. Since the container is assumed to be running on the same machine // as the docker daemon, just mapping the docker control socket is OK. diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index 68f9ec26ba6..748c0c59174 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -68,6 +68,8 @@ public class DockerComposeContainer> private String project; + private List filesInDirectory = new ArrayList<>(); + @Deprecated public DockerComposeContainer(File composeFile, String identifier) { this(identifier, composeFile); @@ -140,7 +142,8 @@ public void start() { this.options, this.services, this.scalingPreferences, - this.env + this.env, + this.filesInDirectory ); this.composeDelegate.startAmbassadorContainer(); this.composeDelegate.waitUntilServiceStarted(this.tailChildContainers); @@ -172,7 +175,7 @@ public void stop() { if (removeImages != null) { cmd += " --rmi " + removeImages.dockerRemoveImagesType(); } - this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env); + this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env, this.filesInDirectory); } finally { this.project = this.composeDelegate.randomProjectId(); } @@ -355,6 +358,11 @@ public SELF withStartupTimeout(Duration startupTimeout) { return self(); } + public SELF withCopyFilesInContainer(String... fileCopyInclusions) { + this.filesInDirectory = Arrays.asList(fileCopyInclusions); + return self(); + } + public Optional getContainerByServiceName(String serviceName) { return this.composeDelegate.getContainerByServiceName(serviceName); } diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java new file mode 100644 index 00000000000..390ddd505fb --- /dev/null +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java @@ -0,0 +1,87 @@ +package org.testcontainers.junit; + +import io.restassured.RestAssured; +import org.junit.Test; +import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.containers.ContainerLaunchException; + +import java.io.File; +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; + +public class ComposeContainerWithCopyFilesTest { + + @Test + public void testShouldCopyAllFilesByDefault() throws IOException { + try ( + ComposeContainer environment = new ComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose.yml") + ) + .withExposedService("app", 8080) + ) { + environment.start(); + + String response = readStringFromURL(environment); + assertThat(response).isEqualTo("MY_ENV_VARIABLE: override"); + } + } + + @Test + public void testWithFileCopyInclusionUsingFilePath() throws IOException { + try ( + ComposeContainer environment = new ComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") + ) + .withExposedService("app", 8080) + .withCopyFilesInContainer("Dockerfile", "EnvVariableRestEndpoint.java", ".env") + ) { + environment.start(); + + String response = readStringFromURL(environment); + + // The `test/.env` file is not copied, now so we get the original value + assertThat(response).isEqualTo("MY_ENV_VARIABLE: original"); + } + } + + @Test + public void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { + try ( + ComposeContainer environment = new ComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") + ) + .withExposedService("app", 8080) + .withCopyFilesInContainer("Dockerfile", "EnvVariableRestEndpoint.java", "test") + ) { + environment.start(); + + String response = readStringFromURL(environment); + // The test directory (with its contents) is copied, so we get the override + assertThat(response).isEqualTo("MY_ENV_VARIABLE: override"); + } + } + + @Test + public void testShouldNotBeAbleToStartIfNeededEnvFileIsNotCopied() { + try ( + ComposeContainer environment = new ComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") + ) + .withExposedService("app", 8080) + .withCopyFilesInContainer("Dockerfile", "EnvVariableRestEndpoint.java") + ) { + assertThatExceptionOfType(ContainerLaunchException.class) + .isThrownBy(environment::start) + .withMessageContaining("Container startup failed for image docker"); + } + } + + private static String readStringFromURL(ComposeContainer container) throws IOException { + Integer servicePort = container.getServicePort("app-1", 8080); + String serviceHost = container.getServiceHost("app-1", 8080); + String requestURL = "http://" + serviceHost + ":" + servicePort + "/env"; + return RestAssured.get(requestURL).thenReturn().body().asString(); + } +} diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java new file mode 100644 index 00000000000..46dd4c65b3c --- /dev/null +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java @@ -0,0 +1,70 @@ +package org.testcontainers.junit; + +import io.restassured.RestAssured; +import org.junit.Test; +import org.testcontainers.containers.DockerComposeContainer; + +import java.io.File; +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DockerComposeContainerWithCopyFilesTest { + + @Test + public void testShouldCopyAllFilesByDefault() throws IOException { + try ( + DockerComposeContainer environment = new DockerComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose.yml") + ) + .withExposedService("app", 8080) + ) { + environment.start(); + + String response = readStringFromURL(environment); + assertThat(response).isEqualTo("MY_ENV_VARIABLE: override"); + } + } + + @Test + public void testWithFileCopyInclusionUsingFilePath() throws IOException { + try ( + DockerComposeContainer environment = new DockerComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") + ) + .withExposedService("app", 8080) + .withCopyFilesInContainer("Dockerfile", "EnvVariableRestEndpoint.java", ".env") + ) { + environment.start(); + + String response = readStringFromURL(environment); + + // The `test/.env` file is not copied, now so we get the original value + assertThat(response).isEqualTo("MY_ENV_VARIABLE: original"); + } + } + + @Test + public void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { + try ( + DockerComposeContainer environment = new DockerComposeContainer( + new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") + ) + .withExposedService("app", 8080) + .withCopyFilesInContainer("Dockerfile", "EnvVariableRestEndpoint.java", "test") + ) { + environment.start(); + + String response = readStringFromURL(environment); + // The test directory (with its contents) is copied, so we get the override + assertThat(response).isEqualTo("MY_ENV_VARIABLE: override"); + } + } + + private static String readStringFromURL(DockerComposeContainer container) throws IOException { + Integer servicePort = container.getServicePort("app_1", 8080); + String serviceHost = container.getServiceHost("app_1", 8080); + String requestURL = "http://" + serviceHost + ":" + servicePort + "/env"; + return RestAssured.get(requestURL).thenReturn().body().asString(); + } +} diff --git a/core/src/test/resources/compose-file-copy-inclusions/.env b/core/src/test/resources/compose-file-copy-inclusions/.env new file mode 100644 index 00000000000..bb5b5beb3e2 --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/.env @@ -0,0 +1 @@ +MY_ENV_VARIABLE=original diff --git a/core/src/test/resources/compose-file-copy-inclusions/Dockerfile b/core/src/test/resources/compose-file-copy-inclusions/Dockerfile new file mode 100644 index 00000000000..851086d68c2 --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/Dockerfile @@ -0,0 +1,9 @@ +FROM jbangdev/jbang-action + +WORKDIR /app +COPY EnvVariableRestEndpoint.java . + +RUN jbang export portable --force EnvVariableRestEndpoint.java + +EXPOSE 8080 +CMD ["./EnvVariableRestEndpoint.java"] diff --git a/core/src/test/resources/compose-file-copy-inclusions/EnvVariableRestEndpoint.java b/core/src/test/resources/compose-file-copy-inclusions/EnvVariableRestEndpoint.java new file mode 100644 index 00000000000..ead172bbb35 --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/EnvVariableRestEndpoint.java @@ -0,0 +1,45 @@ +///usr/bin/env jbang "$0" "$@" ; exit $? + +import com.sun.net.httpserver.HttpServer; +import com.sun.net.httpserver.HttpHandler; +import com.sun.net.httpserver.HttpExchange; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.InetSocketAddress; + +public class EnvVariableRestEndpoint { + private static final String ENV_VARIABLE_NAME = "MY_ENV_VARIABLE"; + private static final int PORT = 8080; + + public static void main(String[] args) throws IOException { + HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0); + server.createContext("/env", new EnvVariableHandler()); + server.setExecutor(null); + server.start(); + System.out.println("Server started on port " + PORT); + } + + static class EnvVariableHandler implements HttpHandler { + @Override + public void handle(HttpExchange exchange) throws IOException { + if ("GET".equals(exchange.getRequestMethod())) { + String envValue = System.getenv(ENV_VARIABLE_NAME); + String response = envValue != null + ? ENV_VARIABLE_NAME + ": " + envValue + : "Environment variable " + ENV_VARIABLE_NAME + " not found"; + + exchange.sendResponseHeaders(200, response.length()); + try (OutputStream os = exchange.getResponseBody()) { + os.write(response.getBytes()); + } + } else { + String response = "Method not allowed"; + exchange.sendResponseHeaders(405, response.length()); + try (OutputStream os = exchange.getResponseBody()) { + os.write(response.getBytes()); + } + } + } + } +} diff --git a/core/src/test/resources/compose-file-copy-inclusions/compose-root-only.yml b/core/src/test/resources/compose-file-copy-inclusions/compose-root-only.yml new file mode 100644 index 00000000000..fa17d5f472d --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/compose-root-only.yml @@ -0,0 +1,7 @@ +services: + app: + build: . + ports: + - "8080:8080" + env_file: + - '.env' diff --git a/core/src/test/resources/compose-file-copy-inclusions/compose-test-only.yml b/core/src/test/resources/compose-file-copy-inclusions/compose-test-only.yml new file mode 100644 index 00000000000..943f908ce20 --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/compose-test-only.yml @@ -0,0 +1,7 @@ +services: + app: + build: . + ports: + - "8080:8080" + env_file: + - './test/.env' diff --git a/core/src/test/resources/compose-file-copy-inclusions/compose.yml b/core/src/test/resources/compose-file-copy-inclusions/compose.yml new file mode 100644 index 00000000000..2a9334d7980 --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/compose.yml @@ -0,0 +1,8 @@ +services: + app: + build: . + ports: + - "8080:8080" + env_file: + - '.env' + - './test/.env' diff --git a/core/src/test/resources/compose-file-copy-inclusions/test/.env b/core/src/test/resources/compose-file-copy-inclusions/test/.env new file mode 100644 index 00000000000..09867ae6d5d --- /dev/null +++ b/core/src/test/resources/compose-file-copy-inclusions/test/.env @@ -0,0 +1 @@ +MY_ENV_VARIABLE=override diff --git a/docs/modules/docker_compose.md b/docs/modules/docker_compose.md index 10f1aee61aa..9032e7c6ee2 100644 --- a/docs/modules/docker_compose.md +++ b/docs/modules/docker_compose.md @@ -135,6 +135,26 @@ public static ComposeContainer environment = !!! note Make sure the service name use a `-` instead of `_` as separator using `ComposeContainer`. +## Build working directory + +You can select what files should be copied only via `withCopyFilesInContainer`: + +```java +public static ComposeContainer environment = + new ComposeContainer(new File("compose.yml")) + .withCopyFilesInContainer(".env"); +``` + +In this example, only `compose.yml` and `.env` are copied over into the container that will run the Docker Compose file. +By default, all files in the same directory as the compose file are copied over. + +This can be used with `DockerComposeContainer` and `ComposeContainer`. +You can use file and directory references. +They are always resolved relative to the directory where the compose file resides. + +!!! note + This only work with containarized Compose, not with `Local Compose` mode. + ## Using private repositories in Docker compose When Docker Compose is used in container mode (not local), it's needs to be made aware of Docker settings for private repositories. By default, those setting are located in `$HOME/.docker/config.json`. From 181b56eaefa90ed186329e553bd6b3b1cc416a62 Mon Sep 17 00:00:00 2001 From: Donnerbart Date: Wed, 17 Jul 2024 07:42:04 +0200 Subject: [PATCH 0062/1224] Support build args in FROM statement (#6119) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #3238 --------- Co-authored-by: Eddú Meléndez Gonzales --- .../images/ParsedDockerfile.java | 26 ++++++++-------- .../images/builder/ImageFromDockerfile.java | 31 ++++++++++++++----- .../images/builder/DockerfileBuildTest.java | 21 +++++++++++-- .../builder/ImageFromDockerfileTest.java | 1 + .../Dockerfile-from-buildarg | 9 ++++++ 5 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 core/src/test/resources/dockerfile-build-test/Dockerfile-from-buildarg diff --git a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java index ed88c1a85ff..8c4d7866ff4 100644 --- a/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/ParsedDockerfile.java @@ -29,17 +29,17 @@ public class ParsedDockerfile { private final Path dockerFilePath; @Getter - private Set dependencyImageNames = Collections.emptySet(); + private final Set dependencyImageNames; public ParsedDockerfile(Path dockerFilePath) { this.dockerFilePath = dockerFilePath; - parse(read()); + this.dependencyImageNames = parse(read()); } @VisibleForTesting ParsedDockerfile(List lines) { this.dockerFilePath = Paths.get("dummy.Dockerfile"); - parse(lines); + this.dependencyImageNames = parse(lines); } private List read() { @@ -56,17 +56,17 @@ private List read() { } } - private void parse(List lines) { - dependencyImageNames = - lines - .stream() - .map(FROM_LINE_PATTERN::matcher) - .filter(Matcher::matches) - .map(matcher -> matcher.group("image")) - .collect(Collectors.toSet()); + private Set parse(List lines) { + Set imageNames = lines + .stream() + .map(FROM_LINE_PATTERN::matcher) + .filter(Matcher::matches) + .map(matcher -> matcher.group("image")) + .collect(Collectors.toSet()); - if (!dependencyImageNames.isEmpty()) { - log.debug("Found dependency images in Dockerfile {}: {}", dockerFilePath, dependencyImageNames); + if (!imageNames.isEmpty()) { + log.debug("Found dependency images in Dockerfile {}: {}", dockerFilePath, imageNames); } + return imageNames; } } 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 b35ef830c11..ced612bfefa 100644 --- a/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java +++ b/core/src/main/java/org/testcontainers/images/builder/ImageFromDockerfile.java @@ -37,6 +37,7 @@ import java.util.Optional; import java.util.Set; import java.util.function.Consumer; +import java.util.regex.Matcher; import java.util.zip.GZIPOutputStream; @Slf4j @@ -96,6 +97,7 @@ public ImageFromDockerfile withFileFromTransferable(String path, Transferable tr protected final String resolve() { Logger logger = DockerLoggerFactory.getLogger(dockerImageName); + //noinspection resource DockerClient dockerClient = DockerClientFactory.instance().client(); try { @@ -107,12 +109,12 @@ public void onNext(BuildResponseItem item) { if (item.isErrorIndicated()) { logger.error(item.getErrorDetail().getMessage()); } else { - logger.debug(StringUtils.chomp(item.getStream(), "\n")); + logger.debug(StringUtils.removeEnd(item.getStream(), "\n")); } } }; - // We have to use pipes to avoid high memory consumption since users might want to build really big images + // We have to use pipes to avoid high memory consumption since users might want to build huge images @Cleanup PipedInputStream in = new PipedInputStream(); @Cleanup @@ -169,7 +171,7 @@ public void onNext(BuildResponseItem item) { } protected void configure(BuildImageCmd buildImageCmd) { - buildImageCmd.withTag(this.getDockerImageName()); + buildImageCmd.withTags(Collections.singleton(getDockerImageName())); this.dockerFilePath.ifPresent(buildImageCmd::withDockerfilePath); this.dockerfile.ifPresent(p -> { buildImageCmd.withDockerfile(p.toFile()); @@ -188,27 +190,40 @@ protected void configure(BuildImageCmd buildImageCmd) { } private void prePullDependencyImages(Set imagesToPull) { - final DockerClient dockerClient = DockerClientFactory.instance().client(); - imagesToPull.forEach(imageName -> { + String resolvedImageName = applyBuildArgsToImageName(imageName); try { log.info( "Pre-emptively checking local images for '{}', referenced via a Dockerfile. If not available, it will be pulled.", - imageName + resolvedImageName ); - new RemoteDockerImage(DockerImageName.parse(imageName)) + new RemoteDockerImage(DockerImageName.parse(resolvedImageName)) .withImageNameSubstitutor(ImageNameSubstitutor.noop()) .get(); } catch (Exception e) { log.warn( "Unable to pre-fetch an image ({}) depended upon by Dockerfile - image build will continue but may fail. Exception message was: {}", - imageName, + resolvedImageName, e.getMessage() ); } }); } + /** + * See {@code filterForEnvironmentVars()} in {@link com.github.dockerjava.core.dockerfile.DockerfileStatement}. + */ + private String applyBuildArgsToImageName(String imageName) { + for (Map.Entry entry : buildArgs.entrySet()) { + String value = Matcher.quoteReplacement(entry.getValue()); + // handle: $VARIABLE case + imageName = imageName.replace("$" + entry.getKey(), value); + // handle ${VARIABLE} case + imageName = imageName.replace("${" + entry.getKey() + "}", value); + } + return imageName; + } + public ImageFromDockerfile withBuildArg(final String key, final String value) { this.buildArgs.put(key, value); return this; diff --git a/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java b/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java index c45233ea390..b2c7075f4d2 100644 --- a/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java @@ -8,6 +8,8 @@ import java.nio.file.Path; import java.nio.file.Paths; +import java.util.HashMap; +import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; @@ -22,6 +24,13 @@ public class DockerfileBuildTest { @Parameterized.Parameters public static Object[][] parameters() { + Map buildArgs = new HashMap<>(4); + buildArgs.put("BUILD_IMAGE", "alpine:3.16"); + buildArgs.put("BASE_IMAGE", "alpine"); + buildArgs.put("BASE_IMAGE_TAG", "3.12"); + buildArgs.put("UNUSED", "ignored"); + + //noinspection deprecation return new Object[][] { // Dockerfile build without explicit per-file inclusion new Object[] { @@ -38,7 +47,7 @@ public static Object[][] parameters() { "test4567", new ImageFromDockerfile().withFileFromPath(".", RESOURCE_PATH).withDockerfilePath("./Dockerfile-alt"), }, - // Dockerfile build using build args + // Dockerfile build using withBuildArg() new Object[] { "test7890", new ImageFromDockerfile() @@ -46,6 +55,14 @@ public static Object[][] parameters() { .withDockerfilePath("./Dockerfile-buildarg") .withBuildArg("CUSTOM_ARG", "test7890"), }, + // Dockerfile build using withBuildArgs() with build args in FROM statement + new Object[] { + "test1234", + new ImageFromDockerfile() + .withFileFromPath(".", RESOURCE_PATH) + .withDockerfile(RESOURCE_PATH.resolve("Dockerfile-from-buildarg")) + .withBuildArgs(buildArgs), + }, // Dockerfile build using withDockerfile(File) new Object[] { "test4567", @@ -64,7 +81,7 @@ public DockerfileBuildTest(String expectedFileContent, ImageFromDockerfile image @Test public void performTest() { try ( - final GenericContainer container = new GenericContainer(image) + final GenericContainer container = new GenericContainer<>(image) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("cat", "/test.txt") ) { diff --git a/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java b/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java index abc05eb567c..b761d984187 100644 --- a/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java @@ -32,6 +32,7 @@ public void shouldNotAddSessionLabelIfDeleteOnExitIsFalse() { ) .withDockerfileFromBuilder(it -> it.from("scratch")); String imageId = image.resolve(); + DockerClient dockerClient = DockerClientFactory.instance().client(); try { diff --git a/core/src/test/resources/dockerfile-build-test/Dockerfile-from-buildarg b/core/src/test/resources/dockerfile-build-test/Dockerfile-from-buildarg new file mode 100644 index 00000000000..16934b374e8 --- /dev/null +++ b/core/src/test/resources/dockerfile-build-test/Dockerfile-from-buildarg @@ -0,0 +1,9 @@ +ARG BUILD_IMAGE +ARG BASE_IMAGE +ARG BASE_IMAGE_TAG + +FROM ${BUILD_IMAGE} AS build +COPY localfile.txt /test-build.txt + +FROM $BASE_IMAGE:${BASE_IMAGE_TAG} AS base +COPY --from=build /test-build.txt /test.txt From be5966e0363b016489ed8757fbea10582bd89dac Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 17 Jul 2024 11:38:09 -0500 Subject: [PATCH 0063/1224] [create-pull-request] automated change (#8958) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index b3e0e16d342..5fd93a9fee6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -133,4 +133,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 1.19.8 + latest_version: 1.20.0 From 7713224ab6bf6f50c90447da1b184d76e754c5d9 Mon Sep 17 00:00:00 2001 From: Tyler Bertrand <121591679+tylerbertrand@users.noreply.github.com> Date: Mon, 22 Jul 2024 15:33:03 -0500 Subject: [PATCH 0064/1224] Use Develocity build cache configuration and access key authentication (#8964) --- .github/workflows/ci.yml | 3 +-- examples/settings.gradle | 9 ++------- settings.gradle | 9 ++------- smoke-test/settings.gradle | 9 ++------- 4 files changed, 7 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fccc9caab04..fcdebaee5cc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,8 +43,7 @@ permissions: env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - GRADLE_ENTERPRISE_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} - GRADLE_ENTERPRISE_CACHE_PASSWORD: ${{ secrets.GRADLE_ENTERPRISE_CACHE_PASSWORD }} + DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} jobs: core: diff --git a/examples/settings.gradle b/examples/settings.gradle index 577a4298c7b..8aed2430fb5 100644 --- a/examples/settings.gradle +++ b/examples/settings.gradle @@ -43,14 +43,9 @@ buildCache { local { enabled = !isCI } - remote(HttpBuildCache) { - push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("GRADLE_ENTERPRISE_CACHE_PASSWORD") + remote(develocity.buildCache) { + push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("DEVELOCITY_ACCESS_KEY") enabled = true - url = 'https://ge.testcontainers.org/cache/' - credentials { - username = 'ci' - password = System.getenv("GRADLE_ENTERPRISE_CACHE_PASSWORD") - } } } diff --git a/settings.gradle b/settings.gradle index 69d0e489a9a..d60d222c079 100644 --- a/settings.gradle +++ b/settings.gradle @@ -40,14 +40,9 @@ buildCache { local { enabled = !isCI } - remote(HttpBuildCache) { - push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("GRADLE_ENTERPRISE_CACHE_PASSWORD") + remote(develocity.buildCache) { + push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("DEVELOCITY_ACCESS_KEY") enabled = true - url = 'https://ge.testcontainers.org/cache/' - credentials { - username = 'ci' - password = System.getenv("GRADLE_ENTERPRISE_CACHE_PASSWORD") - } } } diff --git a/smoke-test/settings.gradle b/smoke-test/settings.gradle index 8642e528279..e79fb0d5c94 100644 --- a/smoke-test/settings.gradle +++ b/smoke-test/settings.gradle @@ -27,14 +27,9 @@ buildCache { local { enabled = !isCI } - remote(HttpBuildCache) { - push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("GRADLE_ENTERPRISE_CACHE_PASSWORD") + remote(develocity.buildCache) { + push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("DEVELOCITY_ACCESS_KEY") enabled = true - url = 'https://ge.testcontainers.org/cache/' - credentials { - username = 'ci' - password = System.getenv("GRADLE_ENTERPRISE_CACHE_PASSWORD") - } } } From ad0fa5b43b14d0499051fe1e91dd3ecdb17aa86d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:36:50 +0000 Subject: [PATCH 0065/1224] Bump org.junit.jupiter:junit-jupiter in /smoke-test Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.0 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- smoke-test/turbo-mode/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index a84c1d5fb48..af0f5d84e4d 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' testImplementation 'ch.qos.logback:logback-classic:1.3.8' testImplementation 'org.assertj:assertj-core:3.24.2' } From 6aca9c701fd43c4bd810a7d2821985c73bc9f3c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:36:55 +0000 Subject: [PATCH 0066/1224] Bump com.google.guava:guava from 32.1.2-jre to 33.2.1-jre in /smoke-test Bumps [com.google.guava:guava](https://github.com/google/guava) from 32.1.2-jre to 33.2.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 0ff82406c5c..acdb53fab4f 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { dependencies { // https://github.com/melix/japicmp-gradle-plugin/issues/36 - classpath 'com.google.guava:guava:32.1.2-jre' + classpath 'com.google.guava:guava:33.2.1-jre' classpath 'com.github.tjni.captainhook:captain-hook:0.1.5' } } From 00b7a0fbff74a431dc0309325c650a7f2346b386 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 20:36:57 +0000 Subject: [PATCH 0067/1224] Bump org.junit.jupiter:junit-jupiter-engine in /smoke-test Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index d6f3e3089bf..817d803fd53 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.2" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.2" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.2" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") testImplementation 'org.assertj:assertj-core:3.25.3' From be7b5d5a5bcb310b118bc9dc5ff1e64db76864d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:05:11 +0000 Subject: [PATCH 0068/1224] Bump io.cucumber:cucumber-bom from 7.15.0 to 7.18.1 in /examples Bumps [io.cucumber:cucumber-bom](https://github.com/cucumber/cucumber-jvm) from 7.15.0 to 7.18.1. - [Release notes](https://github.com/cucumber/cucumber-jvm/releases) - [Changelog](https://github.com/cucumber/cucumber-jvm/blob/main/CHANGELOG.md) - [Commits](https://github.com/cucumber/cucumber-jvm/compare/v7.15.0...v7.18.1) --- updated-dependencies: - dependency-name: io.cucumber:cucumber-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 9080bb647ae..546e06f841d 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -12,7 +12,7 @@ dependencies { implementation 'org.seleniumhq.selenium:selenium-firefox-driver' implementation 'org.seleniumhq.selenium:selenium-chrome-driver' - testImplementation platform('io.cucumber:cucumber-bom:7.15.0') + testImplementation platform('io.cucumber:cucumber-bom:7.18.1') testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit' testImplementation 'org.testcontainers:selenium' From 8a08cf88c121829f6f9e597f2bcec4c2c1346a4d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:08:55 +0000 Subject: [PATCH 0069/1224] Bump org.mariadb.jdbc:mariadb-java-client in /modules/mariadb Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases) - [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/master/CHANGELOG.md) - [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.4.0...3.4.1) --- updated-dependencies: - dependency-name: org.mariadb.jdbc:mariadb-java-client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 89b6a2013af..fa47370764e 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' testImplementation project(':jdbc-test') - testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.4.0' + testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.4.1' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' From 00cea77de0c6a172db882a80ce4537e1724dddab Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 16:20:22 -0600 Subject: [PATCH 0070/1224] [create-pull-request] automated change (#8959) --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ad6298ca260..0ce8bd1df0a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=1.19.8 +testcontainers.version=1.20.0 From 8491ffda8f641a7bd81cbfef68eb90045d25992b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:25:16 +0000 Subject: [PATCH 0071/1224] Bump com.amazonaws:aws-java-sdk-dynamodb in /modules/dynalite Bumps [com.amazonaws:aws-java-sdk-dynamodb](https://github.com/aws/aws-sdk-java) from 1.12.726 to 1.12.763. - [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-java/compare/1.12.726...1.12.763) --- updated-dependencies: - dependency-name: com.amazonaws:aws-java-sdk-dynamodb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/dynalite/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/dynalite/build.gradle b/modules/dynalite/build.gradle index a0c132bc6f8..0d512955cf2 100644 --- a/modules/dynalite/build.gradle +++ b/modules/dynalite/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Dynalite (deprecated)" dependencies { api project(':testcontainers') - compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.726' - testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.726' + compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.763' + testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.763' testImplementation 'org.assertj:assertj-core:3.25.3' } From bd06a882b50426e69508176acacb5f265ef15391 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:28:50 +0000 Subject: [PATCH 0072/1224] Bump github/combine-prs from 5.0.0 to 5.1.0 Bumps [github/combine-prs](https://github.com/github/combine-prs) from 5.0.0 to 5.1.0. - [Release notes](https://github.com/github/combine-prs/releases) - [Commits](https://github.com/github/combine-prs/compare/v5.0.0...v5.1.0) --- updated-dependencies: - dependency-name: github/combine-prs dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/combine-prs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/combine-prs.yml b/.github/workflows/combine-prs.yml index c5faddc0505..e8f34878405 100644 --- a/.github/workflows/combine-prs.yml +++ b/.github/workflows/combine-prs.yml @@ -13,6 +13,6 @@ jobs: steps: - name: combine-prs id: combine-prs - uses: github/combine-prs@v5.0.0 + uses: github/combine-prs@v5.1.0 with: github_token: ${{ secrets.GITHUB_TOKEN }} From bb8e3c69d900c2f5ed9a124683e8320c83273180 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:30:16 +0000 Subject: [PATCH 0073/1224] Bump org.apache.commons:commons-lang3 in /modules/hivemq Bumps org.apache.commons:commons-lang3 from 3.14.0 to 3.15.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 225b26b3632..739cc4101dd 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -4,7 +4,7 @@ dependencies { api(project(":testcontainers")) api("org.jetbrains:annotations:24.1.0") - shaded("org.apache.commons:commons-lang3:3.14.0") + shaded("org.apache.commons:commons-lang3:3.15.0") shaded("commons-io:commons-io:2.16.1") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") From 6744a6f464cb1687d52a55e72f8a47ba7d734317 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:30:59 +0000 Subject: [PATCH 0074/1224] Bump io.rest-assured:rest-assured from 5.4.0 to 5.5.0 in /core Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 6d8b637af0e..2a18522f437 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -121,7 +121,7 @@ dependencies { testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') testImplementation 'org.assertj:assertj-core:3.25.3' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" From 098d6270d4fecc8cab0ad55efa3f1d42b9fa9ed9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:37:13 +0000 Subject: [PATCH 0075/1224] Bump com.yugabyte:jdbc-yugabytedb in /modules/yugabytedb Bumps [com.yugabyte:jdbc-yugabytedb](https://github.com/yugabyte/pgjdbc) from 42.3.5-yb-4 to 42.3.5-yb-6. - [Release notes](https://github.com/yugabyte/pgjdbc/releases) - [Changelog](https://github.com/yugabyte/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/yugabyte/pgjdbc/compare/v42.3.5-yb-4...v42.3.5-yb-6) --- updated-dependencies: - dependency-name: com.yugabyte:jdbc-yugabytedb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/yugabytedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/yugabytedb/build.gradle b/modules/yugabytedb/build.gradle index 2ab71ef9cc6..cb5d583b4ca 100644 --- a/modules/yugabytedb/build.gradle +++ b/modules/yugabytedb/build.gradle @@ -6,5 +6,5 @@ dependencies { // YCQL driver testImplementation 'com.yugabyte:java-driver-core:4.15.0-yb-2-TESTFIX.0' // YSQL driver - testRuntimeOnly 'com.yugabyte:jdbc-yugabytedb:42.3.5-yb-4' + testRuntimeOnly 'com.yugabyte:jdbc-yugabytedb:42.3.5-yb-6' } From 2a4fd21cc5e42761c8ea4403ac00cd4fa0f49e49 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:42:54 +0000 Subject: [PATCH 0076/1224] Bump org.apache.commons:commons-lang3 in /modules/jdbc-test Bumps org.apache.commons:commons-lang3 from 3.14.0 to 3.15.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 d6c455992cf..16f3b5d8d4f 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -2,7 +2,7 @@ dependencies { api project(':jdbc') api 'com.google.guava:guava:33.2.0-jre' - api 'org.apache.commons:commons-lang3:3.14.0' + api 'org.apache.commons:commons-lang3:3.15.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 5b425cc36d7f680eba072d79b66ffc61a81d03d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:43:08 +0000 Subject: [PATCH 0077/1224] Bump com.gradle.enterprise:com.gradle.enterprise.gradle.plugin Bumps com.gradle.enterprise:com.gradle.enterprise.gradle.plugin from 3.17.4 to 3.17.6. --- updated-dependencies: - dependency-name: com.gradle.enterprise:com.gradle.enterprise.gradle.plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index d60d222c079..ba107a86f7a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,7 +5,7 @@ buildscript { } } dependencies { - classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.17.4" + classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.17.6" classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.1" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } From b83cf140408feea8650bf5bcc2dabef982d6df4a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:59:14 +0000 Subject: [PATCH 0078/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.29 to 3.2.32. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/develop/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.29...3.2.32) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 881186d91ef..cbd894304d4 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.29" + api "com.orientechnologies:orientdb-client:3.2.32" testImplementation 'org.assertj:assertj-core:3.25.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' From 84f4175ffdd89ed10ec09e0c379c48703362a1a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jul 2024 22:59:19 +0000 Subject: [PATCH 0079/1224] Bump com.orientechnologies:orientdb-gremlin in /modules/orientdb Bumps [com.orientechnologies:orientdb-gremlin](https://github.com/orientechnologies/orientdb-gremlin) from 3.2.26 to 3.2.32. - [Commits](https://github.com/orientechnologies/orientdb-gremlin/compare/3.2.26...3.2.32) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-gremlin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 881186d91ef..2d3967c4c50 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.25.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.26" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.32" } From aa0502ad9d974f26f54c8e3a9f9759e2fef12886 Mon Sep 17 00:00:00 2001 From: He Wang Date: Wed, 24 Jul 2024 04:42:08 +0800 Subject: [PATCH 0080/1224] Support tenant name, password and mode in OceanBase module (#8737) --- docs/modules/databases/jdbc.md | 2 +- .../oceanbase/OceanBaseCEContainer.java | 74 +++++++++++++++++-- .../OceanBaseCEContainerProvider.java | 2 +- .../oceanbase/SimpleOceanBaseCETest.java | 4 +- 4 files changed, 70 insertions(+), 12 deletions(-) diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md index 947f4e1a810..3c92e8a99ad 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -57,7 +57,7 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database #### Using OceanBase -`jdbc:tc:oceanbasece:4.2.2:///databasename` +`jdbc:tc:oceanbasece:4.2.1-lts:///databasename` #### Using Oracle diff --git a/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainer.java b/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainer.java index 6c08ff165f2..fae9190ceb0 100644 --- a/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainer.java +++ b/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.oceanbase; import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; /** @@ -26,14 +27,20 @@ public class OceanBaseCEContainer extends JdbcDatabaseContainer Date: Wed, 24 Jul 2024 06:54:52 +0530 Subject: [PATCH 0081/1224] Fix log for Grafana URL (#8961) --- .../java/org/testcontainers/grafana/LgtmStackContainer.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java index 218b37c0da0..080be6d6eaf 100644 --- a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java +++ b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java @@ -47,7 +47,7 @@ public LgtmStackContainer(DockerImageName image) { @Override protected void containerIsStarted(InspectContainerResponse containerInfo) { - log.info("Access to the Grafana dashboard: {}", getOtlpHttpUrl()); + log.info("Access to the Grafana dashboard: {}", getGrafanaHttpUrl()); } public String getOtlpGrpcUrl() { @@ -61,4 +61,8 @@ public String getOtlpHttpUrl() { public String getPromehteusHttpUrl() { return "http://" + getHost() + ":" + getMappedPort(PROMETHEUS_PORT); } + + public String getGrafanaHttpUrl() { + return "http://" + getHost() + ":" + getMappedPort(GRAFANA_PORT); + } } From 4e10c9a6df3845f2c0a4f5d08650d780288a92ae Mon Sep 17 00:00:00 2001 From: Maarten Vercruysse <67873169+MV-GH@users.noreply.github.com> Date: Wed, 24 Jul 2024 03:27:37 +0200 Subject: [PATCH 0082/1224] Fix list indentation in reuse doc (#8980) --- docs/features/reuse.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/features/reuse.md b/docs/features/reuse.md index f7d8062138c..884f3d5ac33 100644 --- a/docs/features/reuse.md +++ b/docs/features/reuse.md @@ -17,10 +17,9 @@ opt-in mechanism per environment. To reuse a container, the container configurat ## How to use it * Enable `Reusable Containers` - * through environment variable `TESTCONTAINERS_REUSE_ENABLE=true` - * through user property file `~/.testcontainers.properties`, by adding `testcontainers.reuse.enable=true` - * **not** through classpath properties file [see this comment](https://github.com/testcontainers/testcontainers-java/issues/5364#issuecomment-1125907734) - + * through environment variable `TESTCONTAINERS_REUSE_ENABLE=true` + * through user property file `~/.testcontainers.properties`, by adding `testcontainers.reuse.enable=true` + * **not** through classpath properties file [see this comment](https://github.com/testcontainers/testcontainers-java/issues/5364#issuecomment-1125907734) * Define a container and subscribe to reuse the container using `withReuse(true)` ```java From e072601b3ad46b815c7af4593f3898056d6e863f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 23 Jul 2024 21:45:39 -0500 Subject: [PATCH 0083/1224] Ignore logback-classic and spotless updates in smoke-test --- .github/dependabot.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0eea5afdd43..93157606024 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -376,13 +376,18 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "com.diffplug.spotless" update-types: [ "version-update:semver-minor" ] - + # Smoke test - package-ecosystem: "gradle" directory: "/smoke-test" schedule: interval: "weekly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "ch.qos.logback:logback-classic" + update-types: [ "version-update:semver-minor" ] + - dependency-name: "com.diffplug.spotless" + update-types: [ "version-update:semver-minor" ] # GitHub Actions - package-ecosystem: "github-actions" From d2f382615ca3dfb715268e20527e0c6ce3e62c3d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:47:15 +0000 Subject: [PATCH 0084/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.6.2 to 3.7.1. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/java-client-3.6.2...java-client-3.7.1) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 89dccfa7202..aaa12f01fb0 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,7 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:4.12.0' - testImplementation 'com.couchbase.client:java-client:3.6.2' + testImplementation 'com.couchbase.client:java-client:3.7.1' testImplementation 'org.awaitility:awaitility:4.2.1' testImplementation 'org.assertj:assertj-core:3.25.3' } From 83b75014a34481dd84eb687e8a2d89bfd7d2efff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:47:22 +0000 Subject: [PATCH 0085/1224] Bump io.weaviate:client from 4.7.0 to 4.8.1 in /modules/weaviate Bumps [io.weaviate:client](https://github.com/weaviate/java-client) from 4.7.0 to 4.8.1. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/4.7.0...4.8.1) --- updated-dependencies: - dependency-name: io.weaviate:client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 0a607187c79..40d1b89b96d 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.25.3' - testImplementation 'io.weaviate:client:4.7.0' + testImplementation 'io.weaviate:client:4.8.1' } From 67c1f1be67d16d471ae4543c695232a5cfdc1e3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jul 2024 02:54:30 +0000 Subject: [PATCH 0086/1224] Bump org.assertj:assertj-core in /modules/clickhouse Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/clickhouse/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 6745e1443c0..fadec21f17e 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation project(':jdbc-test') testRuntimeOnly 'ru.yandex.clickhouse:clickhouse-jdbc:0.3.2' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 606fa4a8b3666e57c94e991ded00fbcfab3c4a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 24 Jul 2024 01:54:29 -0500 Subject: [PATCH 0087/1224] Fix labels for compose --- .github/labeler.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/labeler.yml b/.github/labeler.yml index 0e33e98096e..f449a11685d 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -5,6 +5,10 @@ - core/src/main/java/org/testcontainers/containers/ComposeDelegate.java - core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java - core/src/main/java/org/testcontainers/containers/DockerComposeFiles.java + - core/src/test/java/org/testcontainers/containers/Compose*Test.java + - core/src/test/java/org/testcontainers/containers/DockerCompose*Test.java + - core/src/test/java/org/testcontainers/junit/Compose*Test.java + - core/src/test/java/org/testcontainers/junit/DockerCompose*Test.java "github_actions": - changed-files: - any-glob-to-any-file: From 6f303a87eb4ed1dbc046fd70c9e5b2d0f277ada6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 24 Jul 2024 00:58:24 -0600 Subject: [PATCH 0088/1224] Move ComposeOverridesTest (#8985) --- .../testcontainers/{ => containers}/ComposeOverridesTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename core/src/test/java/org/testcontainers/{ => containers}/ComposeOverridesTest.java (97%) diff --git a/core/src/test/java/org/testcontainers/ComposeOverridesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java similarity index 97% rename from core/src/test/java/org/testcontainers/ComposeOverridesTest.java rename to core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java index f5a384a3c37..553ac21a8a0 100644 --- a/core/src/test/java/org/testcontainers/ComposeOverridesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java @@ -1,4 +1,4 @@ -package org.testcontainers; +package org.testcontainers.containers; import com.google.common.util.concurrent.Uninterruptibles; import org.apache.commons.lang3.SystemUtils; @@ -9,7 +9,6 @@ import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.rnorth.ducttape.unreliables.Unreliables; -import org.testcontainers.containers.ComposeContainer; import org.testcontainers.utility.CommandLine; import java.io.BufferedReader; From 5bd94ab7dcae2c9fbde784d4d9795dfbad5c993b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 24 Jul 2024 00:59:52 -0600 Subject: [PATCH 0089/1224] Fix log order after checking containerised compose exit code (#8984) Fixes #7963 --- .../containers/ContainerisedDockerCompose.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java b/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java index 7cff2c77271..7d6e60df29f 100644 --- a/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java +++ b/core/src/main/java/org/testcontainers/containers/ContainerisedDockerCompose.java @@ -83,18 +83,16 @@ public ContainerisedDockerCompose( public void invoke() { super.start(); - this.followOutput(new Slf4jLogConsumer(logger())); + followOutput(new Slf4jLogConsumer(logger())); // wait for the compose container to stop, which should only happen after it has spawned all the service containers - logger() - .info("Docker Compose container is running for command: {}", Joiner.on(" ").join(this.getCommandParts())); - while (this.isRunning()) { + logger().info("Docker Compose container is running for command: {}", Joiner.on(" ").join(getCommandParts())); + while (isRunning()) { logger().trace("Compose container is still running"); Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); } - logger().info("Docker Compose has finished running"); - AuditLogger.doComposeLog(this.getCommandParts(), this.getEnv()); + AuditLogger.doComposeLog(getCommandParts(), getEnv()); final Integer exitCode = getDockerClient() .inspectContainerCmd(getContainerId()) @@ -107,9 +105,11 @@ public void invoke() { "Containerised Docker Compose exited abnormally with code " + exitCode + " whilst running command: " + - StringUtils.join(this.getCommandParts(), ' ') + StringUtils.join(getCommandParts(), ' ') ); } + + logger().info("Docker Compose has finished running"); } private String convertToUnixFilesystemPath(String path) { From daf44c454ef6b0507b2138c1bbfcab83cb35c11e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Jedli=C4=8Dka?= Date: Thu, 25 Jul 2024 00:50:30 +0200 Subject: [PATCH 0090/1224] Rename SA_PASSWORD to MSSQL_SA_PASSWORD as SA_PASSWORD is deprecated (#8987) --- .../org/testcontainers/containers/MSSQLServerContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 51ee7989f33..6e902656bb2 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -78,7 +78,7 @@ protected void configure() { acceptLicense(); } - addEnv("SA_PASSWORD", password); + addEnv("MSSQL_SA_PASSWORD", password); } /** From 835ae9bfd2196b73aeb0655d1891e695ab271ce5 Mon Sep 17 00:00:00 2001 From: David Nault Date: Wed, 24 Jul 2024 22:09:21 -0700 Subject: [PATCH 0091/1224] Couchbase: Don't configure external TLS ports if they're not supported (#8990) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #8989 --------- Co-authored-by: Eddú Meléndez --- .../couchbase/CouchbaseContainer.java | 54 ++++++++++++++--- .../couchbase/CouchbaseContainerTest.java | 59 ++++++++----------- 2 files changed, 72 insertions(+), 41 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 5e9a4b45f4d..25e7637bbaf 100644 --- a/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java +++ b/modules/couchbase/src/main/java/org/testcontainers/couchbase/CouchbaseContainer.java @@ -123,6 +123,8 @@ public class CouchbaseContainer extends GenericContainer { private boolean isEnterprise = false; + private boolean hasTlsPorts = false; + /** * Creates a new couchbase container with the default image and version. * @deprecated use {@link #CouchbaseContainer(DockerImageName)} instead @@ -345,6 +347,7 @@ protected void containerIsStarting(final InspectContainerResponse containerInfo) timePhase("waitUntilNodeIsOnline", this::waitUntilNodeIsOnline); timePhase("initializeIsEnterprise", this::initializeIsEnterprise); + timePhase("initializeHasTlsPorts", this::initializeHasTlsPorts); timePhase("renameNode", this::renameNode); timePhase("initializeServices", this::initializeServices); timePhase("setMemoryQuotas", this::setMemoryQuotas); @@ -394,6 +397,31 @@ private void initializeIsEnterprise() { } } + /** + * Initializes the {@link #hasTlsPorts} flag. + *

+ * Community Edition might support TLS one happy day, so use a "supports TLS" flag separate from + * the "enterprise edition" flag. + */ + private void initializeHasTlsPorts() { + @Cleanup + Response response = doHttpRequest(MGMT_PORT, "/pools/default/nodeServices", "GET", null, true); + + try { + String clusterTopology = response.body().string(); + hasTlsPorts = + !MAPPER + .readTree(clusterTopology) + .path("nodesExt") + .path(0) + .path("services") + .path("mgmtSSL") + .isMissingNode(); + } catch (IOException e) { + throw new IllegalStateException("Couchbase /pools/default/nodeServices did not return valid JSON"); + } + } + /** * Rebinds/renames the internal hostname. *

@@ -503,33 +531,45 @@ private void configureExternalPorts() { final FormBody.Builder builder = new FormBody.Builder(); builder.add("hostname", getHost()); builder.add("mgmt", Integer.toString(getMappedPort(MGMT_PORT))); - builder.add("mgmtSSL", Integer.toString(getMappedPort(MGMT_SSL_PORT))); + if (hasTlsPorts) { + builder.add("mgmtSSL", Integer.toString(getMappedPort(MGMT_SSL_PORT))); + } if (enabledServices.contains(CouchbaseService.KV)) { builder.add("kv", Integer.toString(getMappedPort(KV_PORT))); - builder.add("kvSSL", Integer.toString(getMappedPort(KV_SSL_PORT))); builder.add("capi", Integer.toString(getMappedPort(VIEW_PORT))); - builder.add("capiSSL", Integer.toString(getMappedPort(VIEW_SSL_PORT))); + if (hasTlsPorts) { + builder.add("kvSSL", Integer.toString(getMappedPort(KV_SSL_PORT))); + builder.add("capiSSL", Integer.toString(getMappedPort(VIEW_SSL_PORT))); + } } if (enabledServices.contains(CouchbaseService.QUERY)) { builder.add("n1ql", Integer.toString(getMappedPort(QUERY_PORT))); - builder.add("n1qlSSL", Integer.toString(getMappedPort(QUERY_SSL_PORT))); + if (hasTlsPorts) { + builder.add("n1qlSSL", Integer.toString(getMappedPort(QUERY_SSL_PORT))); + } } if (enabledServices.contains(CouchbaseService.SEARCH)) { builder.add("fts", Integer.toString(getMappedPort(SEARCH_PORT))); - builder.add("ftsSSL", Integer.toString(getMappedPort(SEARCH_SSL_PORT))); + if (hasTlsPorts) { + builder.add("ftsSSL", Integer.toString(getMappedPort(SEARCH_SSL_PORT))); + } } if (enabledServices.contains(CouchbaseService.ANALYTICS)) { builder.add("cbas", Integer.toString(getMappedPort(ANALYTICS_PORT))); - builder.add("cbasSSL", Integer.toString(getMappedPort(ANALYTICS_SSL_PORT))); + if (hasTlsPorts) { + builder.add("cbasSSL", Integer.toString(getMappedPort(ANALYTICS_SSL_PORT))); + } } if (enabledServices.contains(CouchbaseService.EVENTING)) { builder.add("eventingAdminPort", Integer.toString(getMappedPort(EVENTING_PORT))); - builder.add("eventingSSL", Integer.toString(getMappedPort(EVENTING_SSL_PORT))); + if (hasTlsPorts) { + builder.add("eventingSSL", Integer.toString(getMappedPort(EVENTING_SSL_PORT))); + } } @Cleanup 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 691dc1307ef..b78e3666f31 100644 --- a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java +++ b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java @@ -22,7 +22,6 @@ import com.couchbase.client.java.json.JsonObject; import org.junit.Test; import org.testcontainers.containers.ContainerLaunchException; -import org.testcontainers.utility.DockerImageName; import java.time.Duration; import java.util.function.Consumer; @@ -33,51 +32,43 @@ public class CouchbaseContainerTest { - private static final DockerImageName COUCHBASE_IMAGE_ENTERPRISE = DockerImageName.parse( - "couchbase/server:enterprise-7.0.3" - ); + private static final String COUCHBASE_IMAGE_ENTERPRISE = "couchbase/server:enterprise-7.0.3"; - private static final DockerImageName COUCHBASE_IMAGE_COMMUNITY = DockerImageName.parse( - "couchbase/server:community-7.0.2" - ); + private static final String COUCHBASE_IMAGE_ENTERPRISE_RECENT = "couchbase/server:enterprise-7.6.2"; - @Test - public void testBasicContainerUsageForEnterpriseContainer() { - // bucket_definition { - BucketDefinition bucketDefinition = new BucketDefinition("mybucket"); - // } - - try ( - // container_definition { - CouchbaseContainer container = new CouchbaseContainer(COUCHBASE_IMAGE_ENTERPRISE) - .withBucket(bucketDefinition) - // } - ) { - setUpClient( - container, - cluster -> { - Bucket bucket = cluster.bucket(bucketDefinition.getName()); - bucket.waitUntilReady(Duration.ofSeconds(10L)); + private static final String COUCHBASE_IMAGE_COMMUNITY = "couchbase/server:community-7.0.2"; - Collection collection = bucket.defaultCollection(); - - collection.upsert("foo", JsonObject.create().put("key", "value")); + private static final String COUCHBASE_IMAGE_COMMUNITY_RECENT = "couchbase/server:community-7.6.2"; - JsonObject fooObject = collection.get("foo").contentAsObject(); + @Test + public void testBasicContainerUsageForEnterpriseContainer() { + testBasicContainerUsage(COUCHBASE_IMAGE_ENTERPRISE); + } - assertThat(fooObject.getString("key")).isEqualTo("value"); - } - ); - } + @Test + public void testBasicContainerUsageForEnterpriseContainerRecent() { + testBasicContainerUsage(COUCHBASE_IMAGE_ENTERPRISE_RECENT); } @Test public void testBasicContainerUsageForCommunityContainer() { + testBasicContainerUsage(COUCHBASE_IMAGE_COMMUNITY); + } + + @Test + public void testBasicContainerUsageForCommunityContainerRecent() { + testBasicContainerUsage(COUCHBASE_IMAGE_COMMUNITY_RECENT); + } + + private void testBasicContainerUsage(String couchbaseImage) { + // bucket_definition { BucketDefinition bucketDefinition = new BucketDefinition("mybucket"); + // } try ( - CouchbaseContainer container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY) - .withBucket(bucketDefinition) + // container_definition { + CouchbaseContainer container = new CouchbaseContainer(couchbaseImage).withBucket(bucketDefinition) + // } ) { setUpClient( container, From 107bc61c1c07e1b7c528062eb346d90eddd8e8fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 06:26:01 +0000 Subject: [PATCH 0092/1224] Bump org.junit.platform:junit-platform-testkit in /modules/spock Bumps [org.junit.platform:junit-platform-testkit](https://github.com/junit-team/junit5) from 1.10.2 to 1.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-testkit dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 af1b5aa1d15..399accd7f2b 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -18,7 +18,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.3' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.2' - testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.10.2' + testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.10.3' testCompileOnly 'org.jetbrains:annotations:24.1.0' } From c4232bf958be877ee8b236b4c2d897c8cd0fb682 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 06:29:07 +0000 Subject: [PATCH 0093/1224] Bump software.amazon.awssdk:s3 in /modules/localstack Bumps software.amazon.awssdk:s3 from 2.25.56 to 2.26.24. --- updated-dependencies: - dependency-name: software.amazon.awssdk:s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 e434d84422a..e727d5d5d44 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,6 +9,6 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-logs' testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.25.56' + testImplementation 'software.amazon.awssdk:s3:2.26.24' testImplementation 'org.assertj:assertj-core:3.25.3' } From d061a0374965986ec0b56b4e2c3ec7c011937bdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 25 Jul 2024 00:54:59 -0600 Subject: [PATCH 0094/1224] Do not override LocalStack command (#8991) --- .../containers/localstack/LocalStackContainer.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 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 e63ee24cff7..b9a88e96102 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 @@ -123,8 +123,13 @@ public LocalStackContainer(final DockerImageName dockerImageName, boolean useLeg withFileSystemBind(DockerClientFactory.instance().getRemoteDockerUnixSocketPath(), "/var/run/docker.sock"); waitingFor(Wait.forLogMessage(".*Ready\\.\n", 1)); - withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("sh")); - setCommand("-c", "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT); + withCreateContainerCmdModifier(cmd -> { + cmd.withEntrypoint( + "sh", + "-c", + "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT + ); + }); } private static boolean isVersion2(String version) { From b08a23291b8686071b049a8b26eb7dc6014d9bb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 25 Jul 2024 08:37:23 -0600 Subject: [PATCH 0095/1224] Add support for Apache Kafka native image (#8993) --- .../org/testcontainers/kafka/KafkaContainer.java | 6 ++++-- .../testcontainers/kafka/KafkaContainerTest.java | 13 ++++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java index 86759979cf7..7eb8fa18c8b 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java @@ -12,7 +12,7 @@ /** * Testcontainers implementation for Apache Kafka. *

- * Supported image: {@code apache/kafka} + * Supported image: {@code apache/kafka}, {@code apache/kafka-native} *

* Exposed ports: 9092 */ @@ -20,6 +20,8 @@ public class KafkaContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("apache/kafka"); + private static final DockerImageName APACHE_KAFKA_NATIVE_IMAGE_NAME = DockerImageName.parse("apache/kafka-native"); + private static final int KAFKA_PORT = 9092; private static final String DEFAULT_INTERNAL_TOPIC_RF = "1"; @@ -34,7 +36,7 @@ public KafkaContainer(String imageName) { public KafkaContainer(DockerImageName dockerImageName) { super(dockerImageName); - dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, APACHE_KAFKA_NATIVE_IMAGE_NAME); withExposedPorts(KAFKA_PORT); withEnv("CLUSTER_ID", DEFAULT_CLUSTER_ID); diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java index d520cf33f7c..93cb4e6138d 100644 --- a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java @@ -1,13 +1,24 @@ package org.testcontainers.kafka; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import org.testcontainers.AbstractKafka; +@RunWith(Parameterized.class) public class KafkaContainerTest extends AbstractKafka { + @Parameterized.Parameters(name = "{0}") + public static String[] params() { + return new String[] { "apache/kafka:3.7.0", "apache/kafka-native:3.8.0-rc3" }; + } + + @Parameterized.Parameter + public String imageName; + @Test public void testUsage() throws Exception { - try (KafkaContainer kafka = new KafkaContainer("apache/kafka:3.7.0")) { + try (KafkaContainer kafka = new KafkaContainer(imageName)) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); } From d175c5c6a93d368183cb49df1ecfeb7745ad3e81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:11:44 +0000 Subject: [PATCH 0096/1224] Bump io.fabric8:kubernetes-client from 6.12.1 to 6.13.0 in /modules/k3s Bumps [io.fabric8:kubernetes-client](https://github.com/fabric8io/kubernetes-client) from 6.12.1 to 6.13.0. - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v6.12.1...v6.13.0) --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 3d46e330847..c2d288c8b32 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -8,7 +8,7 @@ dependencies { // Any >2.8 version here is not compatible with jackson-databind 2.8.x. shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.8' - testImplementation 'io.fabric8:kubernetes-client:6.12.1' + testImplementation 'io.fabric8:kubernetes-client:6.13.1' testImplementation 'io.kubernetes:client-java:20.0.1-legacy' testImplementation 'org.assertj:assertj-core:3.25.3' } From df6d7c624511fd7b51b410d7dce45d26d10b604b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 15:44:02 +0000 Subject: [PATCH 0097/1224] Bump redis.clients:jedis from 5.1.2 to 5.1.3 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.2 to 5.1.3. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.2...v5.1.3) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 3beaefa3cb5..f263bd958f2 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') testImplementation 'com.zaxxer:HikariCP:4.0.3' - testImplementation 'redis.clients:jedis:5.1.2' + testImplementation 'redis.clients:jedis:5.1.3' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From ad7c6f29ad5247517c305bad2c8b6d98a3edf527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:44 +0000 Subject: [PATCH 0098/1224] Bump io.minio:minio from 8.5.10 to 8.5.11 in /modules/minio Bumps [io.minio:minio](https://github.com/minio/minio-java) from 8.5.10 to 8.5.11. - [Release notes](https://github.com/minio/minio-java/releases) - [Commits](https://github.com/minio/minio-java/compare/8.5.10...8.5.11) --- updated-dependencies: - dependency-name: io.minio:minio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index 7b73ebaae77..21886053173 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testImplementation("io.minio:minio:8.5.10") + testImplementation("io.minio:minio:8.5.11") testImplementation 'org.assertj:assertj-core:3.26.3' } From d33c39a6222b5d0fefa673404787ea7c0e2e726f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:46 +0000 Subject: [PATCH 0099/1224] Bump org.neo4j.driver:neo4j-java-driver in /modules/neo4j Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.16 to 4.4.18. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.16...4.4.18) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 073c1f24b25..d70292361d1 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -33,6 +33,6 @@ dependencies { api project(":testcontainers") - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.16' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' testImplementation 'org.assertj:assertj-core:3.26.3' } From eece120e9e4749cc1fa7ee05812a997a08e4bf89 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:47 +0000 Subject: [PATCH 0100/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 3.7.0 to 3.7.1. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index af8bea88c05..36adc9ac65c 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.32' - testImplementation 'org.apache.kafka:kafka-clients:3.7.0' + testImplementation 'org.apache.kafka:kafka-clients:3.7.1' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.4.0' } From 81016b6f33c8b4e62f81d88aabab167fc34dbae4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:50 +0000 Subject: [PATCH 0101/1224] Bump org.apache.kafka:kafka-clients in /modules/kafka Bumps org.apache.kafka:kafka-clients from 3.7.0 to 3.7.1. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 11f72fce54a..97139db839b 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Kafka" dependencies { api project(':testcontainers') - testImplementation 'org.apache.kafka:kafka-clients:3.7.0' + testImplementation 'org.apache.kafka:kafka-clients:3.7.1' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' } From d1750d864202e37f949e599f4b7b482ae661eac1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:53 +0000 Subject: [PATCH 0102/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.28.1 to 4.30.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.28.1...4.30.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 739cc4101dd..6cd30686f88 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") testImplementation(project(":junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.28.1") + testImplementation("com.hivemq:hivemq-extension-sdk:4.30.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.6") From 84650462a04df4c2ad7ce67b0d86e43a53fc40b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:55 +0000 Subject: [PATCH 0103/1224] Bump org.junit.jupiter:junit-jupiter in /modules/hivemq Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 739cc4101dd..e2d24dcde7f 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -11,7 +11,7 @@ dependencies { shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") shaded("net.lingala.zip4j:zip4j:2.11.5") - testImplementation("org.junit.jupiter:junit-jupiter:5.10.2") + testImplementation("org.junit.jupiter:junit-jupiter:5.10.3") testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.28.1") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") From 54693c312cfb68db7ddd3dc234d02c8d753a93e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:58 +0000 Subject: [PATCH 0104/1224] Bump software.amazon.awssdk:s3 in /modules/localstack Bumps software.amazon.awssdk:s3 from 2.26.24 to 2.26.25. --- updated-dependencies: - dependency-name: software.amazon.awssdk:s3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 e727d5d5d44..9d439ee8712 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,6 +9,6 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-logs' testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.26.24' + testImplementation 'software.amazon.awssdk:s3:2.26.25' testImplementation 'org.assertj:assertj-core:3.25.3' } From 625c94f65dea02979c4f886d56c8502269cc1e4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:14:58 +0000 Subject: [PATCH 0105/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.33.0 to 2.35.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index ef3e8063ebd..49842bd274c 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation "org.apache.activemq:activemq-client:6.1.2" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.33.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.35.0" } test { From d2acbe89e5aaa7be57992747d612d12d7f8df194 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:04 +0000 Subject: [PATCH 0106/1224] Bump io.qdrant:client from 1.9.1 to 1.10.0 in /modules/qdrant Bumps [io.qdrant:client](https://github.com/qdrant/java-client) from 1.9.1 to 1.10.0. - [Release notes](https://github.com/qdrant/java-client/releases) - [Commits](https://github.com/qdrant/java-client/compare/v1.9.1...v1.10.0) --- updated-dependencies: - dependency-name: io.qdrant:client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 211efbb585f..8f7ddcfab2a 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'io.qdrant:client:1.9.1' + testImplementation 'io.qdrant:client:1.10.0' testImplementation platform('io.grpc:grpc-bom:1.65.1') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' From f61f9672771b5d00aa773a0b8134a01751c1c552 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:07 +0000 Subject: [PATCH 0107/1224] Bump io.rest-assured:rest-assured from 5.4.0 to 5.5.0 in /modules/consul Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/consul/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index fcf57ac8082..b2e99d5578e 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') testImplementation 'com.ecwid.consul:consul-api:1.4.5' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' testImplementation 'org.assertj:assertj-core:3.26.3' } From 1929772e3601c627f4edf10069e9bc4a63903adf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:07 +0000 Subject: [PATCH 0108/1224] Bump com.azure:azure-cosmos from 4.60.0 to 4.62.0 in /modules/azure Bumps [com.azure:azure-cosmos](https://github.com/Azure/azure-sdk-for-java) from 4.60.0 to 4.62.0. - [Release notes](https://github.com/Azure/azure-sdk-for-java/releases) - [Commits](https://github.com/Azure/azure-sdk-for-java/compare/azure-cosmos_4.60.0...azure-cosmos_4.62.0) --- updated-dependencies: - dependency-name: com.azure:azure-cosmos dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index c0306fbcadf..81931707562 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -6,5 +6,5 @@ dependencies { shaded 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'com.azure:azure-cosmos:4.60.0' + testImplementation 'com.azure:azure-cosmos:4.62.0' } From 118c39f0c58b479416f4dd4f80f9dadf0ce9b5b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:08 +0000 Subject: [PATCH 0109/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps com.solacesystems:sol-jcsmp from 10.23.0 to 10.24.1. --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index f7ff8eec524..f2fb5bc0a39 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -6,7 +6,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.2.1' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'com.solacesystems:sol-jcsmp:10.23.0' + testImplementation 'com.solacesystems:sol-jcsmp:10.24.1' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From d87cf849865c3abdf28a79f52d2d9c656c20a7e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:09 +0000 Subject: [PATCH 0110/1224] Bump io.rest-assured:rest-assured in /modules/chromadb Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/chromadb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index 09ce354f1c0..bd6ae52d90f 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' } From cd51e2c17c3131e34fe78c17a05a99e5f3843792 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:10 +0000 Subject: [PATCH 0111/1224] Bump io.rest-assured:rest-assured from 5.4.0 to 5.5.0 in /modules/vault Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 88c83619783..263dff37fbf 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'com.bettercloud:vault-java-driver:5.1.0' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' testImplementation 'org.assertj:assertj-core:3.26.3' } From 0ec08e59a2a6d57bb5763e358f888fa7a724c209 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:14 +0000 Subject: [PATCH 0112/1224] Bump io.rest-assured:rest-assured in /modules/redpanda Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index af8bea88c05..4072af434a5 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.7.0' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' } From 94e7f6f3e0d21d5b9e5a4dd091f06e1f3f630852 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:17 +0000 Subject: [PATCH 0113/1224] Bump io.rest-assured:rest-assured from 5.4.0 to 5.5.0 in /modules/ollama Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/ollama/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index 7c2c940633d..b6054a1d3c2 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' } From 37f721be8e67a3e8d5f5edf819d9338d1e1bcacf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:17 +0000 Subject: [PATCH 0114/1224] Bump org.junit:junit-bom from 5.10.2 to 5.10.3 in /modules/junit-jupiter Bumps [org.junit:junit-bom](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 0c2afa77dee..46657aa7408 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: JUnit Jupiter Extension" dependencies { api project(':testcontainers') - implementation platform('org.junit:junit-bom:5.10.2') + implementation platform('org.junit:junit-bom:5.10.3') implementation 'org.junit.jupiter:junit-jupiter-api' testImplementation project(':mysql') From 5d7ae0dc79cb5cd37d5a9c58875f5dce618f1ec7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:19 +0000 Subject: [PATCH 0115/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.39.0 to 26.43.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Changelog](https://github.com/googleapis/java-cloud-bom/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.39.0...v26.43.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index ff8b723418f..cb55e466e22 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.39.0") + testImplementation platform("com.google.cloud:libraries-bom:26.43.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From 1f249e2842c55152ac2ff256ca3dec1afbc977f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:22 +0000 Subject: [PATCH 0116/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.13.1 to 1.13.2. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.13.1...v1.13.2) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 5b914d086ec..41c900db9b5 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.25.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.1' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.2' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' } From 8c7e8aa476000de690e1f699a852c175796a1d84 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:32 +0000 Subject: [PATCH 0117/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/grafana Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 5b914d086ec..cc0dc5ace15 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Grafana" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.1' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' From 6897b391699919446ec4d454f7bc82651a929ad1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:34 +0000 Subject: [PATCH 0118/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/milvus Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 76406164e7a..2f4c25b055a 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation('io.milvus:milvus-sdk-java:2.4.2') { exclude(group: 'org.testcontainers', module: 'milvus') exclude(group: 'org.testcontainers', module: 'junit-jupiter') From 5d1e28e560cfad93146a28dd4eab59ac65bf669f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:39 +0000 Subject: [PATCH 0119/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/weaviate Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 40d1b89b96d..28bde7bbc44 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: Weaviate" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.weaviate:client:4.8.1' } From 078feffb6085168b56b203259881f5c48927fc2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:47 +0000 Subject: [PATCH 0120/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/dynalite Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 0d512955cf2..ef3689feb02 100644 --- a/modules/dynalite/build.gradle +++ b/modules/dynalite/build.gradle @@ -5,5 +5,5 @@ dependencies { compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.763' testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.763' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From bffcb225db188b115a2311f677f0829506a83d88 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:50 +0000 Subject: [PATCH 0121/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /examples Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- examples/cucumber/build.gradle | 2 +- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/linked-container/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/selenium-container/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- test-support/build.gradle | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index d900109b1c9..14fa146ed89 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -8,7 +8,7 @@ dependencies { testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation "org.seleniumhq.selenium:selenium-api:4.22.0" - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 73353512e03..f63c03c835f 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 817d803fd53..8b59fd296f7 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -8,7 +8,7 @@ dependencies { testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/examples/cucumber/build.gradle b/examples/cucumber/build.gradle index 546e06f841d..96da350b888 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit' testImplementation 'org.testcontainers:selenium' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index bdafe6e8857..62dd4347f84 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'com.hazelcast:hazelcast:5.3.6' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' } diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 41245b42428..82e3912fdc8 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -10,7 +10,7 @@ dependencies { implementation 'io.codenotary:immudb4j:1.0.1' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 3444fce3251..58bb2053574 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -11,7 +11,7 @@ dependencies { testAnnotationProcessor "org.projectlombok:lombok:1.18.30" testImplementation 'org.testcontainers:kafka' testImplementation 'org.apache.kafka:kafka-clients:3.6.1' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' diff --git a/examples/linked-container/build.gradle b/examples/linked-container/build.gradle index 1febab7cdc2..327ffc270a2 100644 --- a/examples/linked-container/build.gradle +++ b/examples/linked-container/build.gradle @@ -12,6 +12,6 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.1' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:postgresql' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 374c00c9b8b..45f19e28300 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.testcontainers:testcontainers' testImplementation 'io.nats:jnats:2.18.1' testImplementation 'ch.qos.logback:logback-classic:1.3.14' diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 16544de2d02..be39a73653f 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.13' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index e90846dfbc1..b086e18d9f4 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.testcontainers:ollama' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' testImplementation 'io.rest-assured:rest-assured:5.4.0' diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 383ba2b8d48..deaebcfe386 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testng:testng:7.5.1' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 79ebab4d131..f77f6d0c915 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index 07ba6abd8d0..2f6d8efa901 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.testcontainers:selenium' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' } diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 16de7430814..f8374f71a8b 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'com.jcraft:jsch:0.1.55' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' } diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 37f68bb5f0f..8f1ac850d47 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' } diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 61356829e52..b2edf66a582 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' } diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index fd0ec2a060b..881b645c5d9 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.apache.curator:curator-framework:5.6.0' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' } diff --git a/test-support/build.gradle b/test-support/build.gradle index d293570b0ad..6908ad63ace 100644 --- a/test-support/build.gradle +++ b/test-support/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation 'junit:junit:4.13.2' implementation 'org.slf4j:slf4j-api:1.7.36' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From eb46d1485497d576f0351f6c87078875a89b2571 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:15:50 +0000 Subject: [PATCH 0122/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /core Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 2a18522f437..592377dc7d4 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -120,13 +120,13 @@ dependencies { // Synthetic JAR used for MountableFileTest and DirectoryTarResourceTest testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" jarFileTestImplementation 'junit:junit:4.13.2' - jarFileTestImplementation 'org.assertj:assertj-core:3.25.3' + jarFileTestImplementation 'org.assertj:assertj-core:3.26.3' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' } From 609abf0bef59236c2b904d950ddca20d576a22e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:16:05 +0000 Subject: [PATCH 0123/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/mongodb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/mongodb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index 10f63aeae07..2a4c0b67063 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation("org.mongodb:mongodb-driver-sync:5.1.2") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From fbec66bc5e0931078bb4eb9d6309351187d8e1a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:16:07 +0000 Subject: [PATCH 0124/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.6.6 to 3.6.8. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.6.6...v3.6.8) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index f2debc68648..a1c68855d55 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -15,6 +15,6 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.6.6' + testFixturesImplementation 'io.projectreactor:reactor-core:3.6.8' testFixturesImplementation 'org.assertj:assertj-core:3.26.3' } From c1646e67d44f54189c76bb8c21e4ce46c118f60c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:16:07 +0000 Subject: [PATCH 0125/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.3 in /modules/hivemq Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 739cc4101dd..3449d0598cb 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.6") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { From e54d9d3d81589b3cb5cec2535f28ad6663c1e758 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:16:17 +0000 Subject: [PATCH 0126/1224] Bump org.junit.jupiter:junit-jupiter-api in /smoke-test Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 817d803fd53..b78c2e44ec3 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,7 +3,7 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.3.1.RELEASE" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.2" + testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.2" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") From b6c5cb248812ff3f7f5d0d8f4523146f70668527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:16:18 +0000 Subject: [PATCH 0127/1224] Bump org.assertj:assertj-core from 3.24.2 to 3.26.3 in /smoke-test Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- smoke-test/turbo-mode/build.gradle | 2 +- test-support/build.gradle | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index d900109b1c9..14fa146ed89 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -8,7 +8,7 @@ dependencies { testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation "org.seleniumhq.selenium:selenium-api:4.22.0" - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 73353512e03..f63c03c835f 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 817d803fd53..8b59fd296f7 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -8,7 +8,7 @@ dependencies { testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index af0f5d84e4d..733b39a5a79 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -6,7 +6,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' testImplementation 'ch.qos.logback:logback-classic:1.3.8' - testImplementation 'org.assertj:assertj-core:3.24.2' + testImplementation 'org.assertj:assertj-core:3.26.3' } test { diff --git a/test-support/build.gradle b/test-support/build.gradle index d293570b0ad..6908ad63ace 100644 --- a/test-support/build.gradle +++ b/test-support/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation 'junit:junit:4.13.2' implementation 'org.slf4j:slf4j-api:1.7.36' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 57fb8aa27e268c7a0e6df7ae616b9ebb68f79947 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Jul 2024 23:16:22 +0000 Subject: [PATCH 0128/1224] Bump me.champeau.gradle.japicmp from 0.4.2 to 0.4.3 in /smoke-test Bumps me.champeau.gradle.japicmp from 0.4.2 to 0.4.3. --- updated-dependencies: - dependency-name: me.champeau.gradle.japicmp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index acdb53fab4f..2c1f63426d6 100644 --- a/build.gradle +++ b/build.gradle @@ -13,7 +13,7 @@ buildscript { plugins { id 'io.franzbecker.gradle-lombok' version '5.0.0' id 'com.github.johnrengelman.shadow' version '8.1.1' - id 'me.champeau.gradle.japicmp' version '0.4.2' apply false + id 'me.champeau.gradle.japicmp' version '0.4.3' apply false id 'com.diffplug.spotless' version '6.13.0' apply false } From 178b4cf44a713274091559e1f05fcfa90eb4f958 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:34:27 +0000 Subject: [PATCH 0129/1224] Bump org.neo4j.driver:neo4j-java-driver in /examples Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.13 to 4.4.18. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.13...4.4.18) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/neo4j-container/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index be39a73653f..4b25bc00d84 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.13' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' From c749f948a3b690f2ebb7c662681d9dbef83efce3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:34:35 +0000 Subject: [PATCH 0130/1224] Bump org.projectlombok:lombok from 1.18.30 to 1.18.34 in /examples Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.30 to 1.18.34. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.30...v1.18.34) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 4 ++-- examples/solr-container/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 58bb2053574..14892be5ff0 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -7,8 +7,8 @@ repositories { } dependencies { - testCompileOnly "org.projectlombok:lombok:1.18.30" - testAnnotationProcessor "org.projectlombok:lombok:1.18.30" + testCompileOnly "org.projectlombok:lombok:1.18.34" + testAnnotationProcessor "org.projectlombok:lombok:1.18.34" testImplementation 'org.testcontainers:kafka' testImplementation 'org.apache.kafka:kafka-clients:3.6.1' testImplementation 'org.assertj:assertj-core:3.26.3' diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index b2edf66a582..ea7a1dd8c8e 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -7,8 +7,8 @@ repositories { } dependencies { - compileOnly "org.projectlombok:lombok:1.18.30" - annotationProcessor "org.projectlombok:lombok:1.18.30" + compileOnly "org.projectlombok:lombok:1.18.34" + annotationProcessor "org.projectlombok:lombok:1.18.34" implementation 'org.apache.solr:solr-solrj:8.11.3' From fa33a8c806f0804fbc40f11f82095b8dfdbed2b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:34:37 +0000 Subject: [PATCH 0131/1224] Bump org.apache.kafka:kafka-clients from 3.6.1 to 3.7.1 in /examples Bumps org.apache.kafka:kafka-clients from 3.6.1 to 3.7.1. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 58bb2053574..04c05992ca9 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -10,7 +10,7 @@ dependencies { testCompileOnly "org.projectlombok:lombok:1.18.30" testAnnotationProcessor "org.projectlombok:lombok:1.18.30" testImplementation 'org.testcontainers:kafka' - testImplementation 'org.apache.kafka:kafka-clients:3.6.1' + testImplementation 'org.apache.kafka:kafka-clients:3.7.1' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From 3ba40abc3e62579a0eca4de637d92c7f8042bf46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:34:38 +0000 Subject: [PATCH 0132/1224] Bump org.junit.platform:junit-platform-launcher in /modules/spock Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit5) from 1.10.2 to 1.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 399accd7f2b..eebf30e2e2e 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -17,7 +17,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.3' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.2' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.10.3' testCompileOnly 'org.jetbrains:annotations:24.1.0' From 68361a3ea5cee6f832eaa5e390581f062210212c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:34:57 +0000 Subject: [PATCH 0133/1224] Bump org.assertj:assertj-core in /modules/localstack Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 9d439ee8712..6fef28f27c2 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -10,5 +10,5 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' testImplementation 'software.amazon.awssdk:s3:2.26.25' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From ba5db14a0b17f3e7228c093813717d8d743f990f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:35:19 +0000 Subject: [PATCH 0134/1224] Bump com.amazonaws:aws-java-sdk-dynamodb in /modules/dynalite Bumps [com.amazonaws:aws-java-sdk-dynamodb](https://github.com/aws/aws-sdk-java) from 1.12.763 to 1.12.765. - [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-java/compare/1.12.763...1.12.765) --- updated-dependencies: - dependency-name: com.amazonaws:aws-java-sdk-dynamodb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/dynalite/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/dynalite/build.gradle b/modules/dynalite/build.gradle index ef3689feb02..0c7c0c67793 100644 --- a/modules/dynalite/build.gradle +++ b/modules/dynalite/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Dynalite (deprecated)" dependencies { api project(':testcontainers') - compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.763' - testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.763' + compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.765' + testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.765' testImplementation 'org.assertj:assertj-core:3.26.3' } From b68e3ed1c1fd7b9618c660752abc36fd3213e8e7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:57:56 +0000 Subject: [PATCH 0135/1224] Bump org.assertj:assertj-core from 3.25.3 to 3.26.0 in /modules/milvus Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.0. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.0) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 76406164e7a..2f4c25b055a 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation('io.milvus:milvus-sdk-java:2.4.2') { exclude(group: 'org.testcontainers', module: 'milvus') exclude(group: 'org.testcontainers', module: 'junit-jupiter') From b52809bf792d4d9f4b0a3da95b7460347f3e7430 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 05:58:10 +0000 Subject: [PATCH 0136/1224] Bump org.assertj:assertj-core in /modules/localstack Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.25.3 to 3.26.0. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.25.3...assertj-build-3.26.0) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 9d439ee8712..6fef28f27c2 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -10,5 +10,5 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' testImplementation 'software.amazon.awssdk:s3:2.26.25' - testImplementation 'org.assertj:assertj-core:3.25.3' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 5268d5faf3e2fa262f6624814dd93d2ec9009e98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 06:04:38 +0000 Subject: [PATCH 0137/1224] Bump io.trino:trino-jdbc from 452 to 453 in /modules/trino Bumps io.trino:trino-jdbc from 452 to 453. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 1bfb93e4c37..8b146c07e8c 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:452' + testRuntimeOnly 'io.trino:trino-jdbc:453' compileOnly 'org.jetbrains:annotations:24.1.0' } From 14c77264d4243d4f2a7f675272129915357d000b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 06:08:31 +0000 Subject: [PATCH 0138/1224] Bump peter-evans/create-pull-request from 6.0.5 to 6.1.0 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6.0.5 to 6.1.0. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/6d6857d36972b65feb161a90e484f2984215f83e...c5a7806660adbe173f04e3e038b0ccdcd758773c) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-testcontainers-version.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index d39d9a35191..6cc431d3a52 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/latest_version: .*/latest_version: ${GITHUB_REF##*/}/g" mkdocs.yml git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v3.10.1 + uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v3.10.1 with: title: Update docs version to ${GITHUB_REF##*/} body: | diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index c7014b87d53..7f3faa0e92d 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/^testcontainers\.version=.*/testcontainers\.version=${GITHUB_REF##*/}/g" gradle.properties git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@6d6857d36972b65feb161a90e484f2984215f83e # v3.10.1 + uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v3.10.1 with: title: Update testcontainers version to ${GITHUB_REF##*/} body: | From 9b7e37b03c9b4d7670616bfb059ce28adc63e390 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 06:10:48 +0000 Subject: [PATCH 0139/1224] Bump dev.openfga:openfga-sdk from 0.4.2 to 0.5.0 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.4.2 to 0.5.0. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.4.2...v0.5.0) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 5bece5f3b9c..e7db231db18 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'dev.openfga:openfga-sdk:0.4.2' + testImplementation 'dev.openfga:openfga-sdk:0.5.0' } test { From 7b2bc36ae2f6559fee132c3ed2f829c2117e06fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 06:12:37 +0000 Subject: [PATCH 0140/1224] Bump org.neo4j.driver:neo4j-java-driver in /examples Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.13 to 4.4.17. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.13...4.4.17) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/neo4j-container/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index be39a73653f..4b25bc00d84 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.13' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' From 9ebac532ca48fb63653b55ef40660da10b564591 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 06:13:31 +0000 Subject: [PATCH 0141/1224] Bump com.google.guava:guava from 33.2.0-jre to 33.2.1-jre in /core Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.2.0-jre to 33.2.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 592377dc7d4..07fb70774df 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -99,7 +99,7 @@ dependencies { api 'com.github.docker-java:docker-java-transport-zerodep' - shaded 'com.google.guava:guava:33.2.0-jre' + shaded 'com.google.guava:guava:33.2.1-jre' shaded "org.yaml:snakeyaml:1.33" shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2' From e6158f65144c07da4986b9e9ce32250040548cca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:33:42 +0000 Subject: [PATCH 0142/1224] Bump org.json:json from 20231013 to 20240303 in /examples Bumps [org.json:json](https://github.com/douglascrockford/JSON-java) from 20231013 to 20240303. - [Release notes](https://github.com/douglascrockford/JSON-java/releases) - [Changelog](https://github.com/stleary/JSON-java/blob/master/docs/RELEASES.md) - [Commits](https://github.com/douglascrockford/JSON-java/commits) --- updated-dependencies: - dependency-name: org.json:json dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 45b400ed758..a78c362113a 100644 --- a/examples/linked-container/build.gradle +++ b/examples/linked-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'com.squareup.okhttp3:okhttp:4.12.0' - implementation 'org.json:json:20231013' + implementation 'org.json:json:20240303' testRuntimeOnly 'org.postgresql:postgresql:42.7.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:postgresql' From e20114e4287945f0b92c03970fb64afe439c67cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:34:40 +0000 Subject: [PATCH 0143/1224] Bump com.google.code.gson:gson from 2.10.1 to 2.11.0 in /examples Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.10.1 to 2.11.0. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.10.1...gson-parent-2.11.0) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 013ed283c10..dc07bf0f8c3 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'redis.clients:jedis:5.1.3' - implementation 'com.google.code.gson:gson:2.10.1' + implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'ch.qos.logback:logback-classic:1.3.14' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index fecea48a902..6992a716663 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'redis.clients:jedis:5.1.3' - implementation 'com.google.code.gson:gson:2.10.1' + implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 8aabef6f4ed..4a9182374b2 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation 'redis.clients:jedis:5.1.3' - implementation 'com.google.code.gson:gson:2.10.1' + implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From d7982611c7fcb712b2c308b796229b97c5db2b43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:37:08 +0000 Subject: [PATCH 0144/1224] Bump org.elasticsearch.client:transport in /modules/elasticsearch Bumps [org.elasticsearch.client:transport](https://github.com/elastic/elasticsearch) from 7.17.21 to 7.17.22. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v7.17.21...v7.17.22) --- updated-dependencies: - dependency-name: org.elasticsearch.client:transport dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 76a3e585bed..a6ad2e8ed3f 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.14.3" - testImplementation "org.elasticsearch.client:transport:7.17.21" + testImplementation "org.elasticsearch.client:transport:7.17.22" testImplementation 'org.assertj:assertj-core:3.26.3' } From 5f194e9a564f0c665fea77824c5edc575aa86ce8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:37:27 +0000 Subject: [PATCH 0145/1224] Bump com.gradle:common-custom-user-data-gradle-plugin Bumps com.gradle:common-custom-user-data-gradle-plugin from 2.0.1 to 2.0.2. --- updated-dependencies: - dependency-name: com.gradle:common-custom-user-data-gradle-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index ba107a86f7a..5838b93507b 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.17.6" - classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.1" + classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.2" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } } From f1965361f9acf2238fdb15f08314a27f8541e704 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 15:37:36 +0000 Subject: [PATCH 0146/1224] Bump io.kubernetes:client-java in /modules/k3s Bumps [io.kubernetes:client-java](https://github.com/kubernetes-client/java) from 20.0.1-legacy to 21.0.0-legacy. - [Release notes](https://github.com/kubernetes-client/java/releases) - [Changelog](https://github.com/kubernetes-client/java/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes-client/java/compare/v20.0.1-legacy...v21.0.0-legacy) --- updated-dependencies: - dependency-name: io.kubernetes:client-java dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index b6fe982fd9f..f0e0f8a9fa1 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -9,6 +9,6 @@ dependencies { shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.8' testImplementation 'io.fabric8:kubernetes-client:6.13.1' - testImplementation 'io.kubernetes:client-java:20.0.1-legacy' + testImplementation 'io.kubernetes:client-java:21.0.0-legacy' testImplementation 'org.assertj:assertj-core:3.26.3' } From ac0e1119658086cb3f00188f93bd19b3435c891b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 26 Jul 2024 10:21:08 -0600 Subject: [PATCH 0147/1224] Use pulsar-bom (#9006) --- modules/pulsar/build.gradle | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle index 7e7e4e533b5..b86e4713cce 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,7 +3,8 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') - testImplementation group: 'org.apache.pulsar', name: 'pulsar-client', version: '3.2.3' - testImplementation group: 'org.assertj', name: 'assertj-core', version: '3.26.3' - testImplementation group: 'org.apache.pulsar', name: 'pulsar-client-admin', version: '3.2.3' + testImplementation platform("org.apache.pulsar:pulsar-bom:3.2.3") + testImplementation 'org.apache.pulsar:pulsar-client' + testImplementation 'org.apache.pulsar:pulsar-client-admin' + testImplementation 'org.assertj:assertj-core:3.26.3' } From 793fdea5b6e4b92b4e56e1abae0326ddcfc845b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 17:55:18 +0000 Subject: [PATCH 0148/1224] Bump com.google.guava:guava in /modules/jdbc-test Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.2.0-jre to 33.2.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 7f74ab7944f..b841865a7a8 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -1,7 +1,7 @@ dependencies { api project(':jdbc') - api 'com.google.guava:guava:33.2.0-jre' + api 'com.google.guava:guava:33.2.1-jre' api 'org.apache.commons:commons-lang3:3.15.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 646e5e7a810f74af3815d748766aedd6cc014e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 26 Jul 2024 13:15:45 -0500 Subject: [PATCH 0149/1224] Ignore hazelcast and influxdb updates --- .github/dependabot.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 93157606024..a293058729c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -121,6 +121,9 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "com.influxdb:influxdb-java-client" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/jdbc" schedule: @@ -376,6 +379,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "com.diffplug.spotless" update-types: [ "version-update:semver-minor" ] + - dependency-name: "com.hazelcast:hazelcast" + update-types: [ "version-update:semver-minor" ] # Smoke test - package-ecosystem: "gradle" From 800159e28bd84a53cea85f35443209ffa465e349 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:17:51 +0000 Subject: [PATCH 0150/1224] Bump org.apache.kafka:kafka-clients in /modules/kafka Bumps org.apache.kafka:kafka-clients from 3.7.1 to 3.8.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 97139db839b..554275a2037 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Kafka" dependencies { api project(':testcontainers') - testImplementation 'org.apache.kafka:kafka-clients:3.7.1' + testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' } From 08066934349c6547a67577ac569755a3fe8a87c4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:17:52 +0000 Subject: [PATCH 0151/1224] Bump com.hazelcast:hazelcast from 5.3.6 to 5.3.8 in /examples Bumps [com.hazelcast:hazelcast](https://github.com/hazelcast/hazelcast) from 5.3.6 to 5.3.8. - [Release notes](https://github.com/hazelcast/hazelcast/releases) - [Commits](https://github.com/hazelcast/hazelcast/compare/v5.3.6...v5.3.8) --- updated-dependencies: - dependency-name: com.hazelcast:hazelcast dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/hazelcast/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 62dd4347f84..b9671c8261a 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.testcontainers:testcontainers' - testImplementation 'com.hazelcast:hazelcast:5.3.6' + testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' From 8f4cbb165152ff86185a9cfcc35f55b053c1b807 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:17:56 +0000 Subject: [PATCH 0152/1224] Bump org.junit.jupiter:junit-jupiter-params in /examples Bumps [org.junit.jupiter:junit-jupiter-params](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index b71aba53896..08a3e32bb88 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -4,7 +4,7 @@ dependencies { api "io.lettuce:lettuce-core:6.3.2.RELEASE" testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" - testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.2" + testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") From 581539448637192139d26fb30ad58f4f97e44f5a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:00 +0000 Subject: [PATCH 0153/1224] Bump org.apache.curator:curator-framework in /examples Bumps [org.apache.curator:curator-framework](https://github.com/apache/curator) from 5.6.0 to 5.7.0. - [Commits](https://github.com/apache/curator/compare/apache-curator-5.6.0...apache-curator-5.7.0) --- updated-dependencies: - dependency-name: org.apache.curator:curator-framework dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/zookeeper/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index 881b645c5d9..e5112a75858 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.apache.curator:curator-framework:5.6.0' + testImplementation 'org.apache.curator:curator-framework:5.7.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From af4a6b16f601e689d8be74f5f574f098224c1e9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:00 +0000 Subject: [PATCH 0154/1224] Bump io.weaviate:client from 4.8.1 to 4.8.2 in /modules/weaviate Bumps [io.weaviate:client](https://github.com/weaviate/java-client) from 4.8.1 to 4.8.2. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/4.8.1...4.8.2) --- updated-dependencies: - dependency-name: io.weaviate:client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 28bde7bbc44..f110cdcb17f 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'io.weaviate:client:4.8.1' + testImplementation 'io.weaviate:client:4.8.2' } From 44a29db89b6c4e4b3a78fbaa9341a97c8b47ec1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:02 +0000 Subject: [PATCH 0155/1224] Bump org.apache.pulsar:pulsar-bom from 3.2.3 to 3.3.0 in /modules/pulsar Bumps [org.apache.pulsar:pulsar-bom](https://github.com/apache/pulsar) from 3.2.3 to 3.3.0. - [Release notes](https://github.com/apache/pulsar/releases) - [Commits](https://github.com/apache/pulsar/compare/v3.2.3...v3.3.0) --- updated-dependencies: - dependency-name: org.apache.pulsar:pulsar-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 b86e4713cce..e0484c80113 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') - testImplementation platform("org.apache.pulsar:pulsar-bom:3.2.3") + testImplementation platform("org.apache.pulsar:pulsar-bom:3.3.0") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' testImplementation 'org.assertj:assertj-core:3.26.3' From cbe9c20d1cbc25521bb1aaba4839c398432af31f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:05 +0000 Subject: [PATCH 0156/1224] Bump org.apache.kafka:kafka-clients from 3.7.1 to 3.8.0 in /examples Bumps org.apache.kafka:kafka-clients from 3.7.1 to 3.8.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 38efd2d0112..31815faa57c 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -10,7 +10,7 @@ dependencies { testCompileOnly "org.projectlombok:lombok:1.18.34" testAnnotationProcessor "org.projectlombok:lombok:1.18.34" testImplementation 'org.testcontainers:kafka' - testImplementation 'org.apache.kafka:kafka-clients:3.7.1' + testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From 93ce044307c9b999a187719883b621e3050faba7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:08 +0000 Subject: [PATCH 0157/1224] Bump io.rest-assured:rest-assured from 5.4.0 to 5.5.0 in /examples Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.4.0 to 5.5.0. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.4.0...rest-assured-5.5.0) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/ollama-hugging-face/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index b086e18d9f4..685594cfe2b 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' - testImplementation 'io.rest-assured:rest-assured:5.4.0' + testImplementation 'io.rest-assured:rest-assured:5.5.0' } test { From 1848a2c16712d4197095ec8c8b3fd75694071f71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:11 +0000 Subject: [PATCH 0158/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 3.7.1 to 3.8.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index d70c8a0d45b..1ca439c538e 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.32' - testImplementation 'org.apache.kafka:kafka-clients:3.7.1' + testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' } From a145b18a5e51ce0579911822854962977a3d6c17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:18 +0000 Subject: [PATCH 0159/1224] Bump io.nats:jnats from 2.18.1 to 2.19.1 in /examples Bumps [io.nats:jnats](https://github.com/nats-io/nats.java) from 2.18.1 to 2.19.1. - [Release notes](https://github.com/nats-io/nats.java/releases) - [Changelog](https://github.com/nats-io/nats.java/blob/main/CHANGELOG.md) - [Commits](https://github.com/nats-io/nats.java/compare/2.18.1...2.19.1) --- updated-dependencies: - dependency-name: io.nats:jnats dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/nats/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 45f19e28300..4707b6afcf1 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'io.nats:jnats:2.18.1' + testImplementation 'io.nats:jnats:2.19.1' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' From f42521dc00986efc0ba92ce24606a5bb10e698d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Jul 2024 18:18:24 +0000 Subject: [PATCH 0160/1224] Bump ch.qos.logback:logback-classic from 1.3.8 to 1.3.14 in /smoke-test Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.3.8 to 1.3.14. - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.8...v_1.3.14) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- smoke-test/turbo-mode/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index 733b39a5a79..5b2f6ab9625 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -5,7 +5,7 @@ plugins { dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' - testImplementation 'ch.qos.logback:logback-classic:1.3.8' + testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' } From 75ca75c91466928f3a1cf5a89f9b0211c444f61a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 Jul 2024 04:53:18 +0000 Subject: [PATCH 0161/1224] Bump org.junit.jupiter:junit-jupiter from 5.10.2 to 5.10.3 in /examples Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.2 to 5.10.3. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.2...r5.10.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/selenium-container/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/spring-boot/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index b9671c8261a..84a54bce45f 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 82e3912fdc8..ebf209b5e7a 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 31815faa57c..283e24f3229 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 4707b6afcf1..2854790e0a3 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation 'io.nats:jnats:2.19.1' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 4b25bc00d84..7b2225e850e 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -11,5 +11,5 @@ dependencies { testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 685594cfe2b..0143eb66423 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:ollama' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' } diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 6992a716663..f41e7524a83 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index 2f6d8efa901..244e9bdc7eb 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation 'org.testcontainers:selenium' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index f8374f71a8b..786f0e2d4a9 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 4a9182374b2..e6b8cfaa142 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index ea7a1dd8c8e..8f87c69c546 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/spring-boot/build.gradle b/examples/spring-boot/build.gradle index 95b21be5c6c..8249b18eddc 100644 --- a/examples/spring-boot/build.gradle +++ b/examples/spring-boot/build.gradle @@ -17,7 +17,7 @@ dependencies { runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.testcontainers:postgresql' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index e5112a75858..35bef8255d9 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.2' + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' } test { From d26eacaf6af9cf81b98c285e6336d2350ad0cbc0 Mon Sep 17 00:00:00 2001 From: Krunoslav Magazin Date: Mon, 29 Jul 2024 19:14:00 +0200 Subject: [PATCH 0162/1224] Fix URI decode (#9026) --- .../java/org/testcontainers/AbstractJarFileTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core/src/jarFileTest/java/org/testcontainers/AbstractJarFileTest.java b/core/src/jarFileTest/java/org/testcontainers/AbstractJarFileTest.java index ae92aa371b0..3c0e056d903 100644 --- a/core/src/jarFileTest/java/org/testcontainers/AbstractJarFileTest.java +++ b/core/src/jarFileTest/java/org/testcontainers/AbstractJarFileTest.java @@ -1,6 +1,8 @@ package org.testcontainers; import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.Path; @@ -14,7 +16,8 @@ public abstract class AbstractJarFileTest { static { try { Path jarFilePath = Paths.get(System.getProperty("jarFile")); - URI jarFileUri = new URI("jar", jarFilePath.toUri().toString(), null); + String decodedPath = URLDecoder.decode(jarFilePath.toUri().toString(), StandardCharsets.UTF_8.name()); + URI jarFileUri = new URI("jar", decodedPath, null); FileSystem fileSystem = FileSystems.newFileSystem(jarFileUri, Collections.emptyMap()); root = fileSystem.getPath("/"); } catch (Exception e) { From 33e9f6480395b775c789812d6b61c13c8bd95063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 30 Jul 2024 14:31:37 -0500 Subject: [PATCH 0163/1224] Pass options to compose down command (#9040) Currently, setting options are supported for the `up` command. But, the same are not passed to the `down` command. Support for this has been added. Also, adding an example using `--profiles`. Fixes #5041 --- .../containers/ComposeCommand.java | 37 +++++++++++++++++++ .../containers/ComposeContainer.java | 3 +- .../containers/ComposeDelegate.java | 22 +---------- .../containers/DockerComposeContainer.java | 2 +- .../containers/ComposeProfilesOptionTest.java | 35 ++++++++++++++++++ .../DockerComposeProfilesOptionTest.java | 35 ++++++++++++++++++ .../compose-profile-option/compose-test.yml | 11 ++++++ 7 files changed, 122 insertions(+), 23 deletions(-) create mode 100644 core/src/main/java/org/testcontainers/containers/ComposeCommand.java create mode 100644 core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java create mode 100644 core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java create mode 100644 core/src/test/resources/compose-profile-option/compose-test.yml diff --git a/core/src/main/java/org/testcontainers/containers/ComposeCommand.java b/core/src/main/java/org/testcontainers/containers/ComposeCommand.java new file mode 100644 index 00000000000..d85f093578e --- /dev/null +++ b/core/src/main/java/org/testcontainers/containers/ComposeCommand.java @@ -0,0 +1,37 @@ +package org.testcontainers.containers; + +import org.apache.commons.lang3.StringUtils; + +import java.util.Set; + +class ComposeCommand { + + static String getDownCommand(ComposeDelegate.ComposeVersion composeVersion, Set options) { + String composeOptions = optionsAsString(options); + if (composeOptions == null || composeOptions.equals("")) { + return composeVersion == ComposeDelegate.ComposeVersion.V1 ? "down" : "compose down"; + } + String cmd = composeVersion == ComposeDelegate.ComposeVersion.V1 ? "%s down" : "compose %s down"; + return String.format(cmd, composeOptions); + } + + static String getUpCommand(ComposeDelegate.ComposeVersion composeVersion, Set options) { + String composeOptions = optionsAsString(options); + if (composeOptions == null || composeOptions.equals("")) { + return composeVersion == ComposeDelegate.ComposeVersion.V1 ? "up -d" : "compose up -d"; + } + String cmd = composeVersion == ComposeDelegate.ComposeVersion.V1 ? "%s up -d" : "compose %s up -d"; + return String.format(cmd, composeOptions); + } + + private static String optionsAsString(final Set options) { + String optionsString = String.join(" ", options); + if (!optionsString.isEmpty()) { + // ensures that there is a space between the options and 'up' if options are passed. + return optionsString; + } else { + // otherwise two spaces would appear between 'docker-compose' and 'up' + return StringUtils.EMPTY; + } + } +} diff --git a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java index 5add02183ae..0a804cfddb2 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java @@ -161,7 +161,8 @@ public void stop() { this.composeDelegate.getAmbassadorContainer().stop(); // Kill the services using docker - String cmd = "compose down"; + String cmd = ComposeCommand.getDownCommand(ComposeDelegate.ComposeVersion.V2, this.options); + if (removeVolumes) { cmd += " -v"; } diff --git a/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java b/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java index 0b09e9c2683..4dc396a6922 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java @@ -10,7 +10,6 @@ import lombok.NonNull; import lombok.Setter; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.lang3.StringUtils; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.output.OutputFrame; import org.testcontainers.containers.output.Slf4jLogConsumer; @@ -146,7 +145,7 @@ void createServices( .distinct() .collect(Collectors.joining(" ")); - String command = getUpCommand(optionsAsString(options)); + String command = ComposeCommand.getUpCommand(this.composeVersion, options); if (build) { command += " --build"; @@ -164,25 +163,6 @@ void createServices( runWithCompose(localCompose, command, env, fileCopyInclusions); } - private String getUpCommand(String options) { - if (options == null || options.equals("")) { - return this.composeVersion == ComposeVersion.V1 ? "up -d" : "compose up -d"; - } - String cmd = this.composeVersion == ComposeVersion.V1 ? "%s up -d" : "compose %s up -d"; - return String.format(cmd, options); - } - - private String optionsAsString(final Set options) { - String optionsString = options.stream().collect(Collectors.joining(" ")); - if (optionsString.length() != 0) { - // ensures that there is a space between the options and 'up' if options are passed. - return optionsString; - } else { - // otherwise two spaces would appear between 'docker-compose' and 'up' - return StringUtils.EMPTY; - } - } - void waitUntilServiceStarted(boolean tailChildContainers) { listChildContainers().forEach(container -> createServiceInstance(container, tailChildContainers)); diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index 748c0c59174..cf78cfa4be2 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -167,7 +167,7 @@ public void stop() { this.composeDelegate.getAmbassadorContainer().stop(); // Kill the services using docker-compose - String cmd = "down"; + String cmd = ComposeCommand.getDownCommand(ComposeDelegate.ComposeVersion.V1, this.options); if (removeVolumes) { cmd += " -v"; diff --git a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java new file mode 100644 index 00000000000..4c22024aee8 --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java @@ -0,0 +1,35 @@ +package org.testcontainers.containers; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.File; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(Parameterized.class) +public class ComposeProfilesOptionTest { + + @Parameterized.Parameters(name = "{0}") + public static Boolean[] local() { + return new Boolean[] { Boolean.TRUE, Boolean.FALSE }; + } + + @Parameterized.Parameter + public boolean local; + + public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); + + @Test + public void testProfileOption() { + try ( + ComposeContainer compose = new ComposeContainer(COMPOSE_FILE) + .withOptions("--profile=cache") + .withLocalCompose(true) + ) { + compose.start(); + assertThat(compose.listChildContainers()).hasSize(1); + } + } +} diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java new file mode 100644 index 00000000000..371525432bf --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java @@ -0,0 +1,35 @@ +package org.testcontainers.containers; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.File; + +import static org.assertj.core.api.Assertions.assertThat; + +@RunWith(Parameterized.class) +public class DockerComposeProfilesOptionTest { + + @Parameterized.Parameters(name = "{0}") + public static Boolean[] local() { + return new Boolean[] { Boolean.TRUE, Boolean.FALSE }; + } + + @Parameterized.Parameter + public boolean local; + + public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); + + @Test + public void testProfileOption() { + try ( + DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE) + .withOptions("--profile=cache") + .withLocalCompose(this.local) + ) { + compose.start(); + assertThat(compose.listChildContainers()).hasSize(1); + } + } +} diff --git a/core/src/test/resources/compose-profile-option/compose-test.yml b/core/src/test/resources/compose-profile-option/compose-test.yml new file mode 100644 index 00000000000..8d85bf49967 --- /dev/null +++ b/core/src/test/resources/compose-profile-option/compose-test.yml @@ -0,0 +1,11 @@ +services: + redis: + image: redis + profiles: + - cache + db: + image: mysql:8.0.36 + environment: + MYSQL_RANDOM_ROOT_PASSWORD: "true" + profiles: + - db From 49523377363496390bcb52422e71c8eda77652a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 30 Jul 2024 17:12:35 -0500 Subject: [PATCH 0164/1224] Update Apache Kafka images to 3.8.0 --- .../test/java/org/testcontainers/kafka/KafkaContainerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java index 93cb4e6138d..233ee1cd2d4 100644 --- a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java @@ -10,7 +10,7 @@ public class KafkaContainerTest extends AbstractKafka { @Parameterized.Parameters(name = "{0}") public static String[] params() { - return new String[] { "apache/kafka:3.7.0", "apache/kafka-native:3.8.0-rc3" }; + return new String[] { "apache/kafka:3.8.0", "apache/kafka-native:3.8.0" }; } @Parameterized.Parameter From 1877849e9ac558b7fec05f8ce4586bebc69ca1bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 31 Jul 2024 01:01:29 -0500 Subject: [PATCH 0165/1224] Downgrade awaitility version to 4.2.0 (#9041) Fixes #8986 --- .github/dependabot.yml | 10 ++++++++++ core/build.gradle | 2 +- modules/couchbase/build.gradle | 2 +- modules/questdb/build.gradle | 2 +- modules/solace/build.gradle | 2 +- 5 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a293058729c..6bdca459fab 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -22,6 +22,8 @@ updates: update-types: [ "version-update:semver-minor", "version-update:semver-patch" ] - dependency-name: "org.apache.commons:commons-compress" update-types: [ "version-update:semver-minor" ] + - dependency-name: "org.awaitility:awaitility" + update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/" allow: @@ -76,6 +78,9 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "org.awaitility:awaitility" + update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/cratedb" schedule: @@ -280,6 +285,9 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "org.awaitility:awaitility" + update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/r2dbc" schedule: @@ -314,6 +322,8 @@ updates: ignore: - dependency-name: "org.apache.qpid:qpid-jms-client" update-types: [ "version-update:semver-major" ] + - dependency-name: "org.awaitility:awaitility" + update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/solr" schedule: diff --git a/core/build.gradle b/core/build.gradle index 07fb70774df..7ab2408fe05 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -86,7 +86,7 @@ dependencies { exclude group: 'org.apache.commons', module: 'commons-compress' } - shaded 'org.awaitility:awaitility:4.2.1' + shaded 'org.awaitility:awaitility:4.2.0' api platform('com.github.docker-java:docker-java-bom:3.4.0') shaded platform('com.github.docker-java:docker-java-bom:3.4.0') diff --git a/modules/couchbase/build.gradle b/modules/couchbase/build.gradle index 49302203871..4ecab1d0f6b 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -6,6 +6,6 @@ dependencies { shaded 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'com.couchbase.client:java-client:3.7.1' - testImplementation 'org.awaitility:awaitility:4.2.1' + testImplementation 'org.awaitility:awaitility:4.2.0' testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index a2d138b9c30..b2ccaa9dc38 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':jdbc-test') testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.questdb:questdb:7.3.9' - testImplementation 'org.awaitility:awaitility:4.2.1' + testImplementation 'org.awaitility:awaitility:4.2.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index f2fb5bc0a39..fb83eede28c 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Solace" dependencies { api project(':testcontainers') - shaded 'org.awaitility:awaitility:4.2.1' + shaded 'org.awaitility:awaitility:4.2.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.solacesystems:sol-jcsmp:10.24.1' From 358d06179a3cc186ecb6ce4a4a7ea34a49c93f41 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:28:34 -0500 Subject: [PATCH 0166/1224] [create-pull-request] automated change (#9051) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 5fd93a9fee6..8aed24d20f6 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -133,4 +133,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 1.20.0 + latest_version: 1.20.1 From bb1077f98211a06571e009ce62452ab15fce9796 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 11:28:49 -0500 Subject: [PATCH 0167/1224] [create-pull-request] automated change (#9052) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0ce8bd1df0a..270386ac997 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=1.20.0 +testcontainers.version=1.20.1 From e8bd9b9c7077ece496e31eece0b2e25ddda57a00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 5 Aug 2024 10:01:58 -0500 Subject: [PATCH 0168/1224] Log docker daemon labels (#9054) --- .../testcontainers/DockerClientFactory.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/testcontainers/DockerClientFactory.java b/core/src/main/java/org/testcontainers/DockerClientFactory.java index 7fc51c5c611..989aaf36be3 100644 --- a/core/src/main/java/org/testcontainers/DockerClientFactory.java +++ b/core/src/main/java/org/testcontainers/DockerClientFactory.java @@ -33,6 +33,7 @@ import java.io.InputStream; import java.net.URI; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -41,6 +42,7 @@ import java.util.UUID; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.stream.Collectors; /** * Singleton class that provides initialized Docker clients. @@ -210,7 +212,8 @@ public void close() { Version version = client.versionCmd().exec(); log.debug("Docker version: {}", version.getRawValues()); activeApiVersion = version.getApiVersion(); - log.info( + + String serverInfo = "Connected to docker: \n" + " Server Version: " + dockerInfo.getServerVersion() + @@ -224,8 +227,18 @@ public void close() { " Total Memory: " + dockerInfo.getMemTotal() / (1024 * 1024) + - " MB" - ); + " MB"; + + String[] labels = dockerInfo.getLabels(); + boolean hasLabels = labels != null && labels.length > 0; + if (hasLabels) { + String formattedLabels = Arrays + .stream(labels) + .map(label -> " " + label) + .collect(Collectors.joining("\n")); + serverInfo += "\n Labels: \n" + formattedLabels; + } + log.info(serverInfo); try { //noinspection deprecation From 2758b51d6ac69bb56360a83a90a859af0e4352e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 5 Aug 2024 13:07:06 -0500 Subject: [PATCH 0169/1224] Add support for apache/kafka-native image in docs --- docs/modules/kafka.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/kafka.md b/docs/modules/kafka.md index 6ec63126387..091aac0ec72 100644 --- a/docs/modules/kafka.md +++ b/docs/modules/kafka.md @@ -6,7 +6,7 @@ Currently, two different Kafka images are supported: * `org.testcontainers.containers.KafkaContainer` supports [confluentinc/cp-kafka](https://hub.docker.com/r/confluentinc/cp-kafka/) -* `org.testcontainers.kafka.KafkaContainer` supports [apache/kafka](https://hub.docker.com/r/apache/kafka/) +* `org.testcontainers.kafka.KafkaContainer` supports [apache/kafka](https://hub.docker.com/r/apache/kafka/) and [apache/kafka-native](https://hub.docker.com/r/apache/kafka-native/) ## Benefits From 1ce0b1d7ba9e2c4ac2e896799678cf7be620d34e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 5 Aug 2024 14:55:24 -0500 Subject: [PATCH 0170/1224] Check if docker-compose is available (#9060) --- .../DockerComposeProfilesOptionTest.java | 17 +++++++++++++-- ...DockerComposeContainerWithOptionsTest.java | 21 +++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java index 371525432bf..0f7e41a8454 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java @@ -1,8 +1,11 @@ package org.testcontainers.containers; +import org.assertj.core.api.Assumptions; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.testcontainers.utility.CommandLine; import java.io.File; @@ -17,16 +20,26 @@ public static Boolean[] local() { } @Parameterized.Parameter - public boolean local; + public boolean localMode; public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); + @Before + public void setUp() { + if (this.localMode) { + Assumptions + .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) + .as("docker-compose executable exists") + .isTrue(); + } + } + @Test public void testProfileOption() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE) .withOptions("--profile=cache") - .withLocalCompose(this.local) + .withLocalCompose(this.localMode) ) { compose.start(); assertThat(compose.listChildContainers()).hasSize(1); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java index 77e60580b39..0de25fa2946 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java @@ -1,10 +1,13 @@ package org.testcontainers.junit; import com.google.common.collect.ImmutableSet; +import org.assertj.core.api.Assumptions; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.CommandLine; import java.io.File; import java.util.Set; @@ -19,19 +22,19 @@ public class DockerComposeContainerWithOptionsTest { public DockerComposeContainerWithOptionsTest( final File composeFile, - final boolean local, + final boolean localMode, final Set options, final boolean expectError ) { this.composeFile = composeFile; - this.local = local; + this.localMode = localMode; this.options = options; this.expectError = expectError; } private final File composeFile; - private final boolean local; + private final boolean localMode; private final Set options; @@ -73,12 +76,22 @@ public static Object[][] params() { }; } + @Before + public void setUp() { + if (this.localMode) { + Assumptions + .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) + .as("docker-compose executable exists") + .isTrue(); + } + } + @Test public void performTest() { try ( DockerComposeContainer environment = new DockerComposeContainer<>(composeFile) .withOptions(options.stream().toArray(String[]::new)) - .withLocalCompose(local) + .withLocalCompose(localMode) ) { environment.start(); assertThat(expectError).isEqualTo(false); From c3b015c6fb5568256f0786f772cb3f5a34daa010 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 5 Aug 2024 16:16:10 -0500 Subject: [PATCH 0171/1224] Fix typo --- .github/ISSUE_TEMPLATE/feature.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index a4fba6a649e..485e1477a06 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -84,7 +84,7 @@ body: id: benefit attributes: label: Benefit - description: What's the benefit of addng this feature to the project? + description: What's the benefit of adding this feature to the project? validations: required: true - type: textarea From 170761cd3cdbdec5f7ea0a710cc6f027391bbe60 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:10:44 +0000 Subject: [PATCH 0172/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-free Bumps com.oracle.database.jdbc:ojdbc11 from 23.4.0.24.05 to 23.5.0.24.07. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index d9673126063..2765c99fd92 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' testImplementation project(':jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.5.0.24.07' compileOnly 'org.jetbrains:annotations:24.1.0' From 88553e6c8b3241b5bd65b1c3093f549248d7903f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:11:16 +0000 Subject: [PATCH 0173/1224] Bump org.apache.pulsar:pulsar-bom from 3.3.0 to 3.3.1 in /modules/pulsar Bumps [org.apache.pulsar:pulsar-bom](https://github.com/apache/pulsar) from 3.3.0 to 3.3.1. - [Release notes](https://github.com/apache/pulsar/releases) - [Commits](https://github.com/apache/pulsar/compare/v3.3.0...v3.3.1) --- updated-dependencies: - dependency-name: org.apache.pulsar:pulsar-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 e0484c80113..7af1bc777e2 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') - testImplementation platform("org.apache.pulsar:pulsar-bom:3.3.0") + testImplementation platform("org.apache.pulsar:pulsar-bom:3.3.1") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' testImplementation 'org.assertj:assertj-core:3.26.3' From 80904ada2250045974a040b7487e806a99e35593 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:32:09 +0000 Subject: [PATCH 0174/1224] Bump io.asyncer:r2dbc-mysql from 1.1.3 to 1.3.0 in /modules/mysql Bumps [io.asyncer:r2dbc-mysql](https://github.com/asyncer-io/r2dbc-mysql) from 1.1.3 to 1.3.0. - [Release notes](https://github.com/asyncer-io/r2dbc-mysql/releases) - [Commits](https://github.com/asyncer-io/r2dbc-mysql/compare/r2dbc-mysql-1.1.3...r2dbc-mysql-1.3.0) --- updated-dependencies: - dependency-name: io.asyncer:r2dbc-mysql dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/mysql/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index 1c32ac4b4f4..beef298197d 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -7,13 +7,13 @@ dependencies { api project(':jdbc') compileOnly project(':r2dbc') - compileOnly 'io.asyncer:r2dbc-mysql:1.1.3' + compileOnly 'io.asyncer:r2dbc-mysql:1.3.0' testImplementation project(':jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation testFixtures(project(':r2dbc')) - testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.1.3' + testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.3.0' compileOnly 'org.jetbrains:annotations:24.1.0' } From e6e2cf0fd82dc8d867d910f0f3a36634123cb97b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Aug 2024 22:53:55 +0000 Subject: [PATCH 0175/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-xe Bumps com.oracle.database.jdbc:ojdbc11 from 23.4.0.24.05 to 23.5.0.24.07. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index d9c27ca92fc..d3caec05e86 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' testImplementation project(':jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.4.0.24.05' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.5.0.24.07' compileOnly 'org.jetbrains:annotations:24.1.0' From e3ad4ff55bbbbcc997782868b3dedb46231c5d59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 6 Aug 2024 11:19:02 -0500 Subject: [PATCH 0176/1224] Check if docker is available (#9069) --- .../containers/ComposeProfilesOptionTest.java | 15 ++++++++++++- .../ComposeContainerWithOptionsTest.java | 21 +++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java index 4c22024aee8..71aba726dda 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java @@ -1,8 +1,11 @@ package org.testcontainers.containers; +import org.assertj.core.api.Assumptions; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.testcontainers.utility.CommandLine; import java.io.File; @@ -17,10 +20,20 @@ public static Boolean[] local() { } @Parameterized.Parameter - public boolean local; + public boolean localMode; public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); + @Before + public void setUp() { + if (this.localMode) { + Assumptions + .assumeThat(CommandLine.executableExists(ComposeContainer.COMPOSE_EXECUTABLE)) + .as("docker executable exists") + .isTrue(); + } + } + @Test public void testProfileOption() { try ( diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java index ef1315ae662..9a6c581eb3b 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java @@ -1,10 +1,13 @@ package org.testcontainers.junit; import com.google.common.collect.ImmutableSet; +import org.assertj.core.api.Assumptions; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.CommandLine; import java.io.File; import java.util.Set; @@ -19,19 +22,19 @@ public class ComposeContainerWithOptionsTest { public ComposeContainerWithOptionsTest( final File composeFile, - final boolean local, + final boolean localMode, final Set options, final boolean expectError ) { this.composeFile = composeFile; - this.local = local; + this.localMode = localMode; this.options = options; this.expectError = expectError; } private final File composeFile; - private final boolean local; + private final boolean localMode; private final Set options; @@ -73,12 +76,22 @@ public static Object[][] params() { }; } + @Before + public void setUp() { + if (this.localMode) { + Assumptions + .assumeThat(CommandLine.executableExists(ComposeContainer.COMPOSE_EXECUTABLE)) + .as("docker executable exists") + .isTrue(); + } + } + @Test public void performTest() { try ( ComposeContainer environment = new ComposeContainer(composeFile) .withOptions(options.stream().toArray(String[]::new)) - .withLocalCompose(local) + .withLocalCompose(localMode) ) { environment.start(); assertThat(expectError).isFalse(); From 4b3d08ecff0923e37caac83e58807076c0aa9d44 Mon Sep 17 00:00:00 2001 From: Philipp Schirmer Date: Wed, 7 Aug 2024 17:37:06 +0200 Subject: [PATCH 0177/1224] Improve docs for Elasticsearch (#8870) --- docs/modules/elasticsearch.md | 4 +- .../ElasticsearchContainerTest.java | 97 ++++++++++++++++--- 2 files changed, 84 insertions(+), 17 deletions(-) diff --git a/docs/modules/elasticsearch.md b/docs/modules/elasticsearch.md index 3372d2fdea0..3834081f2c6 100644 --- a/docs/modules/elasticsearch.md +++ b/docs/modules/elasticsearch.md @@ -10,7 +10,9 @@ 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: -[HttpClient](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:httpClientContainer +[HttpClient](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:httpClientContainer7 +[HttpClient with Elasticsearch 8](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:httpClientContainer8 +[HttpClient with Elasticsearch 8 and SSL disabled](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:httpClientContainerNoSSL8 [TransportClient](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:transportClientContainer 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 555cec58083..18fc0fc9fde 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java @@ -183,7 +183,7 @@ public void elasticsearchOssImage() throws IOException { @Test public void restClientClusterHealth() throws IOException { - // httpClientContainer { + // httpClientContainer7 { // Create the elasticsearch container. try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { // Start the container. This step might take some time... @@ -208,7 +208,86 @@ public void restClientClusterHealth() throws IOException { // }} assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); assertThat(EntityUtils.toString(response.getEntity())).contains("cluster_name"); - // httpClientContainer {{ + // httpClientContainer7 {{ + } + // } + } + + @Test + public void restClientClusterHealthElasticsearch8() throws IOException { + // httpClientContainer8 { + // Create the elasticsearch container. + try ( + ElasticsearchContainer container = new ElasticsearchContainer( + "docker.elastic.co/elasticsearch/elasticsearch:8.1.2" + ) + ) { + // 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 + // use HTTPS for Elasticsearch 8 + .builder(HttpHost.create("https://" + container.getHttpHostAddress())) + .setHttpClientConfigCallback(httpClientBuilder -> { + httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + // SSL is activated by default in Elasticsearch 8 + httpClientBuilder.setSSLContext(container.createSslContextFromCa()); + return httpClientBuilder; + }) + .build(); + + Response response = client.performRequest(new Request("GET", "/_cluster/health")); + // }} + assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); + assertThat(EntityUtils.toString(response.getEntity())).contains("cluster_name"); + // httpClientContainer8 {{ + } + // } + } + + @Test + public void restClientClusterHealthElasticsearch8WithoutSSL() throws IOException { + // httpClientContainerNoSSL8 { + // Create the elasticsearch container. + try ( + ElasticsearchContainer container = new ElasticsearchContainer( + "docker.elastic.co/elasticsearch/elasticsearch:8.1.2" + ) + // disable SSL + .withEnv("xpack.security.transport.ssl.enabled", "false") + .withEnv("xpack.security.http.ssl.enabled", "false") + ) { + // 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 -> { + return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider); + }) + .build(); + + Response response = client.performRequest(new Request("GET", "/_cluster/health")); + // }} + assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); + assertThat(EntityUtils.toString(response.getEntity())).contains("cluster_name"); + // httpClientContainerNoSSL8 {{ } // } } @@ -289,20 +368,6 @@ public void incompatibleSettingsTest() { .isInstanceOf(IllegalArgumentException.class); } - @Test - public void testElasticsearch8SecureByDefault() throws Exception { - try ( - ElasticsearchContainer container = new ElasticsearchContainer( - "docker.elastic.co/elasticsearch/elasticsearch:8.1.2" - ) - ) { - // Start the container. This step might take some time... - container.start(); - - assertClusterHealthResponse(container); - } - } - @Test public void testDockerHubElasticsearch8ImageSecureByDefault() throws Exception { try (ElasticsearchContainer container = new ElasticsearchContainer("elasticsearch:8.1.2")) { From 6ef052a802065bd8cbe516f6d07fc9aa461bc5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 12 Aug 2024 13:24:36 -0500 Subject: [PATCH 0178/1224] Add workflow to test Docker Desktop for Windows (#9076) --- .github/workflows/ci-windows.yml | 52 +++++++++++++++++++ .../DockerComposeOverridesTest.java | 3 ++ 2 files changed, 55 insertions(+) create mode 100644 .github/workflows/ci-windows.yml diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml new file mode 100644 index 00000000000..e6775faf870 --- /dev/null +++ b/.github/workflows/ci-windows.yml @@ -0,0 +1,52 @@ +name: CI - Windows + +on: + pull_request: + paths-ignore: + - '.github/ISSUE_TEMPLATE/*.yaml' + - '.github/CODEOWNERS' + - '.github/pull_request_template.md' + - 'docs/**/*.css' + - 'docs/**/*.html' + - 'docs/**/*.ico' + - 'docs/**/*.md' + - 'docs/**/*.png' + - 'docs/**/*.svg' + - 'mkdocs.yml' + - 'README.md' + - 'RELEASING.md' + - '.sdkmanrc' + push: + branches: [ main ] + paths-ignore: + - '.github/ISSUE_TEMPLATE/*.yaml' + - '.github/CODEOWNERS' + - '.github/pull_request_template.md' + - 'docs/**/*.css' + - 'docs/**/*.html' + - 'docs/**/*.ico' + - 'docs/**/*.md' + - 'docs/**/*.png' + - 'docs/**/*.svg' + - 'mkdocs.yml' + - 'README.md' + - 'RELEASING.md' + - '.sdkmanrc' + +concurrency: + group: "${{ github.workflow }}-${{ github.head_ref || github.sha }}" + cancel-in-progress: true + +permissions: + contents: read + +jobs: + core: + runs-on: self-hosted + permissions: + checks: write + steps: + - uses: actions/checkout@v4 + - name: Build with Gradle + run: ./gradlew.bat cleanTest testcontainers:test --no-daemon --continue --scan --no-build-cache + - uses: ./.github/actions/setup-junit-report diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java index 494ddc5838f..036134e32d8 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java @@ -65,6 +65,9 @@ public void setUp() { .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) .as("docker-compose executable exists") .isTrue(); + Assumptions + .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) + .doesNotStartWith("Docker Compose version v2"); } } From b27316d40f0cd853fdd208bdc22b42b568d214d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 12 Aug 2024 16:04:15 -0500 Subject: [PATCH 0179/1224] Set MariaDB user when is not root (#9077) Currently, setting MYSQL_USER with root won't start the container. Fixes #8846 --- .../testcontainers/containers/MariaDBContainer.java | 5 ++++- .../junit/mariadb/SimpleMariaDBTest.java | 12 ++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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 1273ac4ec28..fccfde6e4dc 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -75,7 +75,10 @@ protected void configure() { ); addEnv("MYSQL_DATABASE", databaseName); - addEnv("MYSQL_USER", username); + + if (!MARIADB_ROOT_USER.equalsIgnoreCase(this.username)) { + addEnv("MYSQL_USER", username); + } if (password != null && !password.isEmpty()) { addEnv("MYSQL_PASSWORD", password); addEnv("MYSQL_ROOT_PASSWORD", password); 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 1b6996f5478..dedfb06cf55 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 @@ -132,6 +132,18 @@ public void testWithOnlyUserReadableCustomIniFile() throws Exception { } } + @Test + public void testEmptyPasswordWithRootUser() throws SQLException { + try (MariaDBContainer mysql = new MariaDBContainer<>("mariadb:11.2.4").withUsername("root")) { + mysql.start(); + + ResultSet resultSet = performQuery(mysql, "SELECT 1"); + int resultSetInt = resultSet.getInt(1); + + assertThat(resultSetInt).isEqualTo(1); + } + } + private void assertThatCustomIniFileWasUsed(MariaDBContainer mariadb) throws SQLException { try (ResultSet resultSet = performQuery(mariadb, "SELECT @@GLOBAL.innodb_max_undo_log_size")) { long result = resultSet.getLong(1); From 88e4ac59f1cb89e280be47afe8c703aba71c5344 Mon Sep 17 00:00:00 2001 From: Maxime Wiewiora <48218208+maximevw@users.noreply.github.com> Date: Tue, 13 Aug 2024 20:50:49 +0200 Subject: [PATCH 0180/1224] Add new CassandraContainer implementation (#8616) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Current implementation under `org.testcontainers.containers` relies on some types from the cassandra client. The new implementation is under `org.testcontainers.cassandra` and remove the dependency from the cassandra client. --------- Co-authored-by: Eddú Meléndez Gonzales --- docs/modules/databases/cassandra.md | 25 +- .../cassandra/CassandraContainer.java | 176 +++ .../delegate/CassandraDatabaseDelegate.java | 83 ++ .../wait/CassandraQueryWaitStrategy.java | 47 + .../containers/CassandraContainer.java | 3 + .../delegate/CassandraDatabaseDelegate.java | 3 + .../wait/CassandraQueryWaitStrategy.java | 3 + .../cassandra/CassandraContainerTest.java | 150 ++ .../cassandra/CassandraDriver4Test.java | 40 + .../cassandra/CassandraServer4Test.java | 35 + .../cassandra/CassandraServer5Test.java | 35 + .../cassandra.yaml | 1233 +++++++++++++++++ .../src/test/resources/initial-with-error.cql | 6 + 13 files changed, 1831 insertions(+), 8 deletions(-) create mode 100644 modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java create mode 100644 modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java create mode 100644 modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java create mode 100644 modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java create mode 100644 modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java create mode 100644 modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java create mode 100644 modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java create mode 100644 modules/cassandra/src/test/resources/cassandra-auth-required-configuration/cassandra.yaml create mode 100644 modules/cassandra/src/test/resources/initial-with-error.cql diff --git a/docs/modules/databases/cassandra.md b/docs/modules/databases/cassandra.md index 73f93bf203a..72213dad4a7 100644 --- a/docs/modules/databases/cassandra.md +++ b/docs/modules/databases/cassandra.md @@ -2,14 +2,23 @@ ## Usage example -This example connects to the Cassandra Cluster, creates a keyspaces and asserts that is has been created. - - -[Building CqlSession](../../../modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver3Test.java) inside_block:cassandra - - -!!! warning - All methods returning instances of the Cassandra Driver's Cluster object in `CassandraContainer` have been deprecated. Providing these methods unnecessarily couples the Container to the Driver and creates potential breaking changes if the driver is updated. +This example connects to the Cassandra cluster: + +1. Define a container: + + [Container definition](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java) inside_block:container-definition + + +2. Build a `CqlSession`: + + [Building CqlSession](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java) inside_block:cql-session + + +3. Define a container with custom `cassandra.yaml` located in a directory `cassandra-auth-required-configuration`: + + + [Running init script with required authentication](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java) inside_block:init-with-auth + ## Adding this module to your project dependencies diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java new file mode 100644 index 00000000000..f8fc5d58dbb --- /dev/null +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java @@ -0,0 +1,176 @@ +package org.testcontainers.cassandra; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.cassandra.delegate.CassandraDatabaseDelegate; +import org.testcontainers.cassandra.wait.CassandraQueryWaitStrategy; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.ext.ScriptUtils; +import org.testcontainers.ext.ScriptUtils.ScriptLoadException; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; + +import java.io.File; +import java.net.InetSocketAddress; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.Optional; + +/** + * Testcontainers implementation for Apache Cassandra. + *

+ * Supported image: {@code cassandra} + *

+ * Exposed ports: 9042 + */ +public class CassandraContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("cassandra"); + + private static final Integer CQL_PORT = 9042; + + private static final String DEFAULT_LOCAL_DATACENTER = "datacenter1"; + + private static final String CONTAINER_CONFIG_LOCATION = "/etc/cassandra"; + + private static final String USERNAME = "cassandra"; + + private static final String PASSWORD = "cassandra"; + + private String configLocation; + + private String initScriptPath; + + public CassandraContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public CassandraContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + addExposedPort(CQL_PORT); + + withEnv("CASSANDRA_SNITCH", "GossipingPropertyFileSnitch"); + withEnv("JVM_OPTS", "-Dcassandra.skip_wait_for_gossip_to_settle=0 -Dcassandra.initial_token=0"); + withEnv("HEAP_NEWSIZE", "128M"); + withEnv("MAX_HEAP_SIZE", "1024M"); + withEnv("CASSANDRA_ENDPOINT_SNITCH", "GossipingPropertyFileSnitch"); + withEnv("CASSANDRA_DC", DEFAULT_LOCAL_DATACENTER); + + // Use the CassandraQueryWaitStrategy by default to avoid potential issues when the authentication is enabled. + waitingFor(new CassandraQueryWaitStrategy()); + } + + @Override + protected void configure() { + // Map (effectively replace) directory in Docker with the content of resourceLocation if resource location is + // not null. + Optional + .ofNullable(configLocation) + .map(MountableFile::forClasspathResource) + .ifPresent(mountableFile -> withCopyFileToContainer(mountableFile, CONTAINER_CONFIG_LOCATION)); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + runInitScriptIfRequired(); + } + + /** + * Load init script content and apply it to the database if initScriptPath is set + */ + private void runInitScriptIfRequired() { + if (initScriptPath != null) { + try { + URL resource = Thread.currentThread().getContextClassLoader().getResource(initScriptPath); + if (resource == null) { + logger().warn("Could not load classpath init script: {}", initScriptPath); + throw new ScriptLoadException( + "Could not load classpath init script: " + initScriptPath + ". Resource not found." + ); + } + // The init script is executed as is by the cqlsh command, so copy it into the container. + String targetInitScriptName = new File(resource.toURI()).getName(); + copyFileToContainer(MountableFile.forClasspathResource(initScriptPath), targetInitScriptName); + new CassandraDatabaseDelegate(this).execute(null, targetInitScriptName, -1, false, false); + } catch (URISyntaxException e) { + logger().warn("Could not copy init script into container: {}", initScriptPath); + throw new ScriptLoadException("Could not copy init script into container: " + initScriptPath, e); + } catch (ScriptUtils.ScriptStatementFailedException e) { + logger().error("Error while executing init script: {}", initScriptPath, e); + throw new ScriptUtils.UncategorizedScriptException( + "Error while executing init script: " + initScriptPath, + e + ); + } + } + } + + /** + * Initialize Cassandra with the custom overridden Cassandra configuration + *

+ * Be aware, that Docker effectively replaces all /etc/cassandra content with the content of config location, so if + * Cassandra.yaml in configLocation is absent or corrupted, then Cassandra just won't launch + * + * @param configLocation relative classpath with the directory that contains cassandra.yaml and other configuration files + */ + public CassandraContainer withConfigurationOverride(String configLocation) { + this.configLocation = configLocation; + return self(); + } + + /** + * Initialize Cassandra with init CQL script + *

+ * CQL script will be applied after container is started (see using WaitStrategy). + *

+ * + * @param initScriptPath relative classpath resource + */ + public CassandraContainer withInitScript(String initScriptPath) { + this.initScriptPath = initScriptPath; + return self(); + } + + /** + * Get username + * + * By default, Cassandra has authenticator: AllowAllAuthenticator in cassandra.yaml + * If username and password need to be used, then authenticator should be set as PasswordAuthenticator + * (through custom Cassandra configuration) and through CQL with default cassandra-cassandra credentials + * user management should be modified + */ + public String getUsername() { + return USERNAME; + } + + /** + * Get password + * + * By default, Cassandra has authenticator: AllowAllAuthenticator in cassandra.yaml + * If username and password need to be used, then authenticator should be set as PasswordAuthenticator + * (through custom Cassandra configuration) and through CQL with default cassandra-cassandra credentials + * user management should be modified + */ + public String getPassword() { + return PASSWORD; + } + + /** + * Retrieve an {@link InetSocketAddress} for connecting to the Cassandra container via the driver. + * + * @return A InetSocketAddrss representation of this Cassandra container's host and port. + */ + public InetSocketAddress getContactPoint() { + return new InetSocketAddress(getHost(), getMappedPort(CQL_PORT)); + } + + /** + * Retrieve the Local Datacenter for connecting to the Cassandra container via the driver. + * + * @return The configured local Datacenter name. + */ + public String getLocalDatacenter() { + return getEnvMap().getOrDefault("CASSANDRA_DC", DEFAULT_LOCAL_DATACENTER); + } +} diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java new file mode 100644 index 00000000000..47b92958ea5 --- /dev/null +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java @@ -0,0 +1,83 @@ +package org.testcontainers.cassandra.delegate; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.testcontainers.cassandra.CassandraContainer; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.ContainerState; +import org.testcontainers.containers.ExecConfig; +import org.testcontainers.delegate.AbstractDatabaseDelegate; +import org.testcontainers.ext.ScriptUtils.ScriptStatementFailedException; + +import java.io.IOException; + +/** + * Cassandra database delegate + */ +@Slf4j +@RequiredArgsConstructor +public class CassandraDatabaseDelegate extends AbstractDatabaseDelegate { + + private final ContainerState container; + + @Override + protected Void createNewConnection() { + // Return null here, because we run scripts using cqlsh command directly in the container. + // So, we don't use connection object in the execute() method. + return null; + } + + @Override + public void execute( + String statement, + String scriptPath, + int lineNumber, + boolean continueOnError, + boolean ignoreFailedDrops + ) { + try { + // Use cqlsh command directly inside the container to execute statements + // See documentation here: https://cassandra.apache.org/doc/stable/cassandra/tools/cqlsh.html + String[] cqlshCommand = new String[] { "cqlsh" }; + + if (this.container instanceof CassandraContainer) { + CassandraContainer cassandraContainer = (CassandraContainer) this.container; + String username = cassandraContainer.getUsername(); + String password = cassandraContainer.getPassword(); + cqlshCommand = ArrayUtils.addAll(cqlshCommand, "-u", username, "-p", password); + } + + // If no statement specified, directly execute the script specified into scriptPath (using -f argument), + // otherwise execute the given statement (using -e argument). + String executeArg = "-e"; + String executeArgValue = statement; + if (StringUtils.isBlank(statement)) { + executeArg = "-f"; + executeArgValue = scriptPath; + } + cqlshCommand = ArrayUtils.addAll(cqlshCommand, executeArg, executeArgValue); + + Container.ExecResult result = + this.container.execInContainer(ExecConfig.builder().command(cqlshCommand).build()); + if (result.getExitCode() == 0) { + if (StringUtils.isBlank(statement)) { + log.info("CQL script {} successfully executed", scriptPath); + } else { + log.info("CQL statement {} was applied", statement); + } + } else { + log.error("CQL script execution failed with error: \n{}", result.getStderr()); + throw new ScriptStatementFailedException(statement, lineNumber, scriptPath); + } + } catch (IOException | InterruptedException e) { + throw new ScriptStatementFailedException(statement, lineNumber, scriptPath, e); + } + } + + @Override + protected void closeConnectionQuietly(Void session) { + // Nothing to do here, because we run scripts using cqlsh command directly in the container. + } +} diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java new file mode 100644 index 00000000000..1d1004eb3df --- /dev/null +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java @@ -0,0 +1,47 @@ +package org.testcontainers.cassandra.wait; + +import org.rnorth.ducttape.TimeoutException; +import org.testcontainers.cassandra.delegate.CassandraDatabaseDelegate; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; +import org.testcontainers.delegate.DatabaseDelegate; + +import java.util.concurrent.TimeUnit; + +import static org.rnorth.ducttape.unreliables.Unreliables.retryUntilSuccess; + +/** + * Waits until Cassandra returns its version + */ +public class CassandraQueryWaitStrategy extends AbstractWaitStrategy { + + private static final String SELECT_VERSION_QUERY = "SELECT release_version FROM system.local"; + + private static final String TIMEOUT_ERROR = "Timed out waiting for Cassandra to be accessible for query execution"; + + @Override + protected void waitUntilReady() { + // execute select version query until success or timeout + try { + retryUntilSuccess( + (int) startupTimeout.getSeconds(), + TimeUnit.SECONDS, + () -> { + getRateLimiter() + .doWhenReady(() -> { + try (DatabaseDelegate databaseDelegate = getDatabaseDelegate()) { + databaseDelegate.execute(SELECT_VERSION_QUERY, "", 1, false, false); + } + }); + return true; + } + ); + } catch (TimeoutException e) { + throw new ContainerLaunchException(TIMEOUT_ERROR); + } + } + + private DatabaseDelegate getDatabaseDelegate() { + return new CassandraDatabaseDelegate(waitStrategyTarget); + } +} 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 bb291cd1f80..0f5c67992c6 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java @@ -24,7 +24,10 @@ * Supported image: {@code cassandra} *

* Exposed ports: 9042 + * + * @deprecated use {@link org.testcontainers.cassandra.CassandraContainer} instead. */ +@Deprecated public class CassandraContainer> extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("cassandra"); diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java b/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java index 8d604822083..33372ca6c78 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java @@ -13,9 +13,12 @@ /** * Cassandra database delegate + * + * @deprecated use {@link org.testcontainers.cassandra.delegate.CassandraDatabaseDelegate} instead. */ @Slf4j @RequiredArgsConstructor +@Deprecated public class CassandraDatabaseDelegate extends AbstractDatabaseDelegate { private final ContainerState container; diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java b/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java index cffb1ba757e..362e33e3543 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java @@ -12,7 +12,10 @@ /** * Waits until Cassandra returns its version + * + * @deprecated use {@link org.testcontainers.cassandra.wait.CassandraQueryWaitStrategy} instead. */ +@Deprecated public class CassandraQueryWaitStrategy extends AbstractWaitStrategy { private static final String SELECT_VERSION_QUERY = "SELECT release_version FROM system.local"; diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java new file mode 100644 index 00000000000..4bf776b96c8 --- /dev/null +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java @@ -0,0 +1,150 @@ +package org.testcontainers.cassandra; + +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; +import com.datastax.oss.driver.api.core.cql.ResultSet; +import com.datastax.oss.driver.api.core.cql.Row; +import org.junit.Test; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.utility.DockerImageName; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CassandraContainerTest { + + private static final String CASSANDRA_IMAGE = "cassandra:3.11.2"; + + private static final String TEST_CLUSTER_NAME_IN_CONF = "Test Cluster Integration Test"; + + private static final String BASIC_QUERY = "SELECT release_version FROM system.local"; + + @Test + public void testSimple() { + try (CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE)) { + cassandraContainer.start(); + ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY); + assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); + assertThat(resultSet.one().getString(0)).as("Result set has release_version").isNotNull(); + } + } + + @Test + public void testSpecificVersion() { + String cassandraVersion = "3.0.15"; + try ( + CassandraContainer cassandraContainer = new CassandraContainer( + DockerImageName.parse("cassandra").withTag(cassandraVersion) + ) + ) { + cassandraContainer.start(); + ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY); + assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); + assertThat(resultSet.one().getString(0)).as("Cassandra has right version").isEqualTo(cassandraVersion); + } + } + + @Test + public void testConfigurationOverride() { + try ( + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withConfigurationOverride("cassandra-test-configuration-example") + ) { + cassandraContainer.start(); + ResultSet resultSet = performQuery(cassandraContainer, "SELECT cluster_name FROM system.local"); + assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); + assertThat(resultSet.one().getString(0)) + .as("Cassandra configuration is overridden") + .isEqualTo(TEST_CLUSTER_NAME_IN_CONF); + } + } + + @Test(expected = ContainerLaunchException.class) + public void testEmptyConfigurationOverride() { + try ( + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withConfigurationOverride("cassandra-empty-configuration") + ) { + cassandraContainer.start(); + } + } + + @Test + public void testInitScript() { + try ( + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withInitScript("initial.cql") + ) { + cassandraContainer.start(); + testInitScript(cassandraContainer, false); + } + } + + @Test + public void testInitScriptWithRequiredAuthentication() { + try ( + // init-with-auth { + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withConfigurationOverride("cassandra-auth-required-configuration") + .withInitScript("initial.cql") + // } + ) { + cassandraContainer.start(); + testInitScript(cassandraContainer, true); + } + } + + @Test(expected = ContainerLaunchException.class) + public void testInitScriptWithError() { + try ( + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withInitScript("initial-with-error.cql") + ) { + cassandraContainer.start(); + } + } + + @Test + public void testInitScriptWithLegacyCassandra() { + try ( + CassandraContainer cassandraContainer = new CassandraContainer("cassandra:2.2.11") + .withInitScript("initial.cql") + ) { + cassandraContainer.start(); + testInitScript(cassandraContainer, false); + } + } + + private void testInitScript(CassandraContainer cassandraContainer, boolean withCredentials) { + ResultSet resultSet = performQuery( + cassandraContainer, + "SELECT * FROM keySpaceTest.catalog_category", + withCredentials + ); + assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); + Row row = resultSet.one(); + assertThat(row.getLong(0)).as("Inserted row is in expected state").isEqualTo(1); + assertThat(row.getString(1)).as("Inserted row is in expected state").isEqualTo("test_category"); + } + + private ResultSet performQuery(CassandraContainer cassandraContainer, String cql) { + return performQuery(cassandraContainer, cql, false); + } + + private ResultSet performQuery(CassandraContainer cassandraContainer, String cql, boolean withCredentials) { + final CqlSessionBuilder cqlSessionBuilder = CqlSession + .builder() + .addContactPoint(cassandraContainer.getContactPoint()) + .withLocalDatacenter(cassandraContainer.getLocalDatacenter()); + if (withCredentials) { + cqlSessionBuilder.withAuthCredentials(cassandraContainer.getUsername(), cassandraContainer.getPassword()); + } + final CqlSession cqlSession = cqlSessionBuilder.build(); + return performQuery(cqlSession, cql); + } + + private ResultSet performQuery(CqlSession session, String cql) { + final ResultSet rs = session.execute(cql); + session.close(); + return rs; + } +} diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java new file mode 100644 index 00000000000..5e1b682e878 --- /dev/null +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java @@ -0,0 +1,40 @@ +package org.testcontainers.cassandra; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CassandraDriver4Test { + + @Rule + // container-definition { + public CassandraContainer cassandra = new CassandraContainer("cassandra:3.11.2"); + + // } + + @Test + public void testCassandraGetContactPoint() { + try ( + // cql-session { + CqlSession session = CqlSession + .builder() + .addContactPoint(cassandra.getContactPoint()) + .withLocalDatacenter(cassandra.getLocalDatacenter()) + .build() + // } + ) { + session.execute( + "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + + "{'class':'SimpleStrategy','replication_factor':'1'};" + ); + + KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); + + assertThat(keyspace).as("test keyspace created").isNotNull(); + } + } +} diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java new file mode 100644 index 00000000000..b509a77e9e8 --- /dev/null +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java @@ -0,0 +1,35 @@ +package org.testcontainers.cassandra; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CassandraServer4Test { + + @Rule + public CassandraContainer cassandra = new CassandraContainer("cassandra:4.1.1"); + + @Test + public void testCassandraGetContactPoint() { + try ( + CqlSession session = CqlSession + .builder() + .addContactPoint(this.cassandra.getContactPoint()) + .withLocalDatacenter(this.cassandra.getLocalDatacenter()) + .build() + ) { + session.execute( + "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + + "{'class':'SimpleStrategy','replication_factor':'1'};" + ); + + KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); + + assertThat(keyspace).as("test keyspace created").isNotNull(); + } + } +} diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java new file mode 100644 index 00000000000..d4e1c858382 --- /dev/null +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java @@ -0,0 +1,35 @@ +package org.testcontainers.cassandra; + +import com.datastax.oss.driver.api.core.CqlIdentifier; +import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CassandraServer5Test { + + @Rule + public CassandraContainer cassandra = new CassandraContainer("cassandra:5"); + + @Test + public void testCassandraGetContactPoint() { + try ( + CqlSession session = CqlSession + .builder() + .addContactPoint(this.cassandra.getContactPoint()) + .withLocalDatacenter(this.cassandra.getLocalDatacenter()) + .build() + ) { + session.execute( + "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + + "{'class':'SimpleStrategy','replication_factor':'1'};" + ); + + KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); + + assertThat(keyspace).as("test keyspace created").isNotNull(); + } + } +} diff --git a/modules/cassandra/src/test/resources/cassandra-auth-required-configuration/cassandra.yaml b/modules/cassandra/src/test/resources/cassandra-auth-required-configuration/cassandra.yaml new file mode 100644 index 00000000000..14095d4c627 --- /dev/null +++ b/modules/cassandra/src/test/resources/cassandra-auth-required-configuration/cassandra.yaml @@ -0,0 +1,1233 @@ +# Cassandra storage config YAML + +# NOTE: +# See http://wiki.apache.org/cassandra/StorageConfiguration for +# full explanations of configuration directives +# /NOTE + +# The name of the cluster. This is mainly used to prevent machines in +# one logical cluster from joining another. +cluster_name: 'Test Cluster Integration Test' + +# This defines the number of tokens randomly assigned to this node on the ring +# The more tokens, relative to other nodes, the larger the proportion of data +# that this node will store. You probably want all nodes to have the same number +# of tokens assuming they have equal hardware capability. +# +# If you leave this unspecified, Cassandra will use the default of 1 token for legacy compatibility, +# and will use the initial_token as described below. +# +# Specifying initial_token will override this setting on the node's initial start, +# on subsequent starts, this setting will apply even if initial token is set. +# +# If you already have a cluster with 1 token per node, and wish to migrate to +# multiple tokens per node, see http://wiki.apache.org/cassandra/Operations +num_tokens: 256 + +# Triggers automatic allocation of num_tokens tokens for this node. The allocation +# algorithm attempts to choose tokens in a way that optimizes replicated load over +# the nodes in the datacenter for the replication strategy used by the specified +# keyspace. +# +# The load assigned to each node will be close to proportional to its number of +# vnodes. +# +# Only supported with the Murmur3Partitioner. +# allocate_tokens_for_keyspace: KEYSPACE + +# initial_token allows you to specify tokens manually. While you can use it with +# vnodes (num_tokens > 1, above) -- in which case you should provide a +# comma-separated list -- it's primarily used when adding nodes to legacy clusters +# that do not have vnodes enabled. +# initial_token: + +# See http://wiki.apache.org/cassandra/HintedHandoff +# May either be "true" or "false" to enable globally +hinted_handoff_enabled: true + +# When hinted_handoff_enabled is true, a black list of data centers that will not +# perform hinted handoff +# hinted_handoff_disabled_datacenters: +# - DC1 +# - DC2 + +# this defines the maximum amount of time a dead host will have hints +# generated. After it has been dead this long, new hints for it will not be +# created until it has been seen alive and gone down again. +max_hint_window_in_ms: 10800000 # 3 hours + +# Maximum throttle in KBs per second, per delivery thread. This will be +# reduced proportionally to the number of nodes in the cluster. (If there +# are two nodes in the cluster, each delivery thread will use the maximum +# rate; if there are three, each will throttle to half of the maximum, +# since we expect two nodes to be delivering hints simultaneously.) +hinted_handoff_throttle_in_kb: 1024 + +# Number of threads with which to deliver hints; +# Consider increasing this number when you have multi-dc deployments, since +# cross-dc handoff tends to be slower +max_hints_delivery_threads: 2 + +# Directory where Cassandra should store hints. +# If not set, the default directory is $CASSANDRA_HOME/data/hints. +# hints_directory: /var/lib/cassandra/hints + +# How often hints should be flushed from the internal buffers to disk. +# Will *not* trigger fsync. +hints_flush_period_in_ms: 10000 + +# Maximum size for a single hints file, in megabytes. +max_hints_file_size_in_mb: 128 + +# Compression to apply to the hint files. If omitted, hints files +# will be written uncompressed. LZ4, Snappy, and Deflate compressors +# are supported. +#hints_compression: +# - class_name: LZ4Compressor +# parameters: +# - + +# Maximum throttle in KBs per second, total. This will be +# reduced proportionally to the number of nodes in the cluster. +batchlog_replay_throttle_in_kb: 1024 + +# Authentication backend, implementing IAuthenticator; used to identify users +# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthenticator, +# PasswordAuthenticator}. +# +# - AllowAllAuthenticator performs no checks - set it to disable authentication. +# - PasswordAuthenticator relies on username/password pairs to authenticate +# users. It keeps usernames and hashed passwords in system_auth.roles table. +# Please increase system_auth keyspace replication factor if you use this authenticator. +# If using PasswordAuthenticator, CassandraRoleManager must also be used (see below) +authenticator: PasswordAuthenticator + +# Authorization backend, implementing IAuthorizer; used to limit access/provide permissions +# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthorizer, +# CassandraAuthorizer}. +# +# - AllowAllAuthorizer allows any action to any user - set it to disable authorization. +# - CassandraAuthorizer stores permissions in system_auth.role_permissions table. Please +# increase system_auth keyspace replication factor if you use this authorizer. +authorizer: AllowAllAuthorizer + +# Part of the Authentication & Authorization backend, implementing IRoleManager; used +# to maintain grants and memberships between roles. +# Out of the box, Cassandra provides org.apache.cassandra.auth.CassandraRoleManager, +# which stores role information in the system_auth keyspace. Most functions of the +# IRoleManager require an authenticated login, so unless the configured IAuthenticator +# actually implements authentication, most of this functionality will be unavailable. +# +# - CassandraRoleManager stores role data in the system_auth keyspace. Please +# increase system_auth keyspace replication factor if you use this role manager. +role_manager: CassandraRoleManager + +# Validity period for roles cache (fetching granted roles can be an expensive +# operation depending on the role manager, CassandraRoleManager is one example) +# Granted roles are cached for authenticated sessions in AuthenticatedUser and +# after the period specified here, become eligible for (async) reload. +# Defaults to 2000, set to 0 to disable caching entirely. +# Will be disabled automatically for AllowAllAuthenticator. +roles_validity_in_ms: 2000 + +# Refresh interval for roles cache (if enabled). +# After this interval, cache entries become eligible for refresh. Upon next +# access, an async reload is scheduled and the old value returned until it +# completes. If roles_validity_in_ms is non-zero, then this must be +# also. +# Defaults to the same value as roles_validity_in_ms. +# roles_update_interval_in_ms: 2000 + +# Validity period for permissions cache (fetching permissions can be an +# expensive operation depending on the authorizer, CassandraAuthorizer is +# one example). Defaults to 2000, set to 0 to disable. +# Will be disabled automatically for AllowAllAuthorizer. +permissions_validity_in_ms: 2000 + +# Refresh interval for permissions cache (if enabled). +# After this interval, cache entries become eligible for refresh. Upon next +# access, an async reload is scheduled and the old value returned until it +# completes. If permissions_validity_in_ms is non-zero, then this must be +# also. +# Defaults to the same value as permissions_validity_in_ms. +# permissions_update_interval_in_ms: 2000 + +# Validity period for credentials cache. This cache is tightly coupled to +# the provided PasswordAuthenticator implementation of IAuthenticator. If +# another IAuthenticator implementation is configured, this cache will not +# be automatically used and so the following settings will have no effect. +# Please note, credentials are cached in their encrypted form, so while +# activating this cache may reduce the number of queries made to the +# underlying table, it may not bring a significant reduction in the +# latency of individual authentication attempts. +# Defaults to 2000, set to 0 to disable credentials caching. +credentials_validity_in_ms: 2000 + +# Refresh interval for credentials cache (if enabled). +# After this interval, cache entries become eligible for refresh. Upon next +# access, an async reload is scheduled and the old value returned until it +# completes. If credentials_validity_in_ms is non-zero, then this must be +# also. +# Defaults to the same value as credentials_validity_in_ms. +# credentials_update_interval_in_ms: 2000 + +# The partitioner is responsible for distributing groups of rows (by +# partition key) across nodes in the cluster. You should leave this +# alone for new clusters. The partitioner can NOT be changed without +# reloading all data, so when upgrading you should set this to the +# same partitioner you were already using. +# +# Besides Murmur3Partitioner, partitioners included for backwards +# compatibility include RandomPartitioner, ByteOrderedPartitioner, and +# OrderPreservingPartitioner. +# +partitioner: org.apache.cassandra.dht.Murmur3Partitioner + +# Directories where Cassandra should store data on disk. Cassandra +# will spread data evenly across them, subject to the granularity of +# the configured compaction strategy. +# If not set, the default directory is $CASSANDRA_HOME/data/data. +data_file_directories: + - /var/lib/cassandra/data + +# commit log. when running on magnetic HDD, this should be a +# separate spindle than the data directories. +# If not set, the default directory is $CASSANDRA_HOME/data/commitlog. +commitlog_directory: /var/lib/cassandra/commitlog + +# Enable / disable CDC functionality on a per-node basis. This modifies the logic used +# for write path allocation rejection (standard: never reject. cdc: reject Mutation +# containing a CDC-enabled table if at space limit in cdc_raw_directory). +cdc_enabled: false + +# CommitLogSegments are moved to this directory on flush if cdc_enabled: true and the +# segment contains mutations for a CDC-enabled table. This should be placed on a +# separate spindle than the data directories. If not set, the default directory is +# $CASSANDRA_HOME/data/cdc_raw. +# cdc_raw_directory: /var/lib/cassandra/cdc_raw + +# Policy for data disk failures: +# +# die +# shut down gossip and client transports and kill the JVM for any fs errors or +# single-sstable errors, so the node can be replaced. +# +# stop_paranoid +# shut down gossip and client transports even for single-sstable errors, +# kill the JVM for errors during startup. +# +# stop +# shut down gossip and client transports, leaving the node effectively dead, but +# can still be inspected via JMX, kill the JVM for errors during startup. +# +# best_effort +# stop using the failed disk and respond to requests based on +# remaining available sstables. This means you WILL see obsolete +# data at CL.ONE! +# +# ignore +# ignore fatal errors and let requests fail, as in pre-1.2 Cassandra +disk_failure_policy: stop + +# Policy for commit disk failures: +# +# die +# shut down gossip and Thrift and kill the JVM, so the node can be replaced. +# +# stop +# shut down gossip and Thrift, leaving the node effectively dead, but +# can still be inspected via JMX. +# +# stop_commit +# shutdown the commit log, letting writes collect but +# continuing to service reads, as in pre-2.0.5 Cassandra +# +# ignore +# ignore fatal errors and let the batches fail +commit_failure_policy: stop + +# Maximum size of the native protocol prepared statement cache +# +# Valid values are either "auto" (omitting the value) or a value greater 0. +# +# Note that specifying a too large value will result in long running GCs and possbily +# out-of-memory errors. Keep the value at a small fraction of the heap. +# +# If you constantly see "prepared statements discarded in the last minute because +# cache limit reached" messages, the first step is to investigate the root cause +# of these messages and check whether prepared statements are used correctly - +# i.e. use bind markers for variable parts. +# +# Do only change the default value, if you really have more prepared statements than +# fit in the cache. In most cases it is not neccessary to change this value. +# Constantly re-preparing statements is a performance penalty. +# +# Default value ("auto") is 1/256th of the heap or 10MB, whichever is greater +prepared_statements_cache_size_mb: + +# Maximum size of the Thrift prepared statement cache +# +# If you do not use Thrift at all, it is safe to leave this value at "auto". +# +# See description of 'prepared_statements_cache_size_mb' above for more information. +# +# Default value ("auto") is 1/256th of the heap or 10MB, whichever is greater +thrift_prepared_statements_cache_size_mb: + +# Maximum size of the key cache in memory. +# +# Each key cache hit saves 1 seek and each row cache hit saves 2 seeks at the +# minimum, sometimes more. The key cache is fairly tiny for the amount of +# time it saves, so it's worthwhile to use it at large numbers. +# The row cache saves even more time, but must contain the entire row, +# so it is extremely space-intensive. It's best to only use the +# row cache if you have hot rows or static rows. +# +# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup. +# +# Default value is empty to make it "auto" (min(5% of Heap (in MB), 100MB)). Set to 0 to disable key cache. +key_cache_size_in_mb: + +# Duration in seconds after which Cassandra should +# save the key cache. Caches are saved to saved_caches_directory as +# specified in this configuration file. +# +# Saved caches greatly improve cold-start speeds, and is relatively cheap in +# terms of I/O for the key cache. Row cache saving is much more expensive and +# has limited use. +# +# Default is 14400 or 4 hours. +key_cache_save_period: 14400 + +# Number of keys from the key cache to save +# Disabled by default, meaning all keys are going to be saved +# key_cache_keys_to_save: 100 + +# Row cache implementation class name. Available implementations: +# +# org.apache.cassandra.cache.OHCProvider +# Fully off-heap row cache implementation (default). +# +# org.apache.cassandra.cache.SerializingCacheProvider +# This is the row cache implementation availabile +# in previous releases of Cassandra. +# row_cache_class_name: org.apache.cassandra.cache.OHCProvider + +# Maximum size of the row cache in memory. +# Please note that OHC cache implementation requires some additional off-heap memory to manage +# the map structures and some in-flight memory during operations before/after cache entries can be +# accounted against the cache capacity. This overhead is usually small compared to the whole capacity. +# Do not specify more memory that the system can afford in the worst usual situation and leave some +# headroom for OS block level cache. Do never allow your system to swap. +# +# Default value is 0, to disable row caching. +row_cache_size_in_mb: 0 + +# Duration in seconds after which Cassandra should save the row cache. +# Caches are saved to saved_caches_directory as specified in this configuration file. +# +# Saved caches greatly improve cold-start speeds, and is relatively cheap in +# terms of I/O for the key cache. Row cache saving is much more expensive and +# has limited use. +# +# Default is 0 to disable saving the row cache. +row_cache_save_period: 0 + +# Number of keys from the row cache to save. +# Specify 0 (which is the default), meaning all keys are going to be saved +# row_cache_keys_to_save: 100 + +# Maximum size of the counter cache in memory. +# +# Counter cache helps to reduce counter locks' contention for hot counter cells. +# In case of RF = 1 a counter cache hit will cause Cassandra to skip the read before +# write entirely. With RF > 1 a counter cache hit will still help to reduce the duration +# of the lock hold, helping with hot counter cell updates, but will not allow skipping +# the read entirely. Only the local (clock, count) tuple of a counter cell is kept +# in memory, not the whole counter, so it's relatively cheap. +# +# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup. +# +# Default value is empty to make it "auto" (min(2.5% of Heap (in MB), 50MB)). Set to 0 to disable counter cache. +# NOTE: if you perform counter deletes and rely on low gcgs, you should disable the counter cache. +counter_cache_size_in_mb: + +# Duration in seconds after which Cassandra should +# save the counter cache (keys only). Caches are saved to saved_caches_directory as +# specified in this configuration file. +# +# Default is 7200 or 2 hours. +counter_cache_save_period: 7200 + +# Number of keys from the counter cache to save +# Disabled by default, meaning all keys are going to be saved +# counter_cache_keys_to_save: 100 + +# saved caches +# If not set, the default directory is $CASSANDRA_HOME/data/saved_caches. +saved_caches_directory: /var/lib/cassandra/saved_caches + +# commitlog_sync may be either "periodic" or "batch." +# +# When in batch mode, Cassandra won't ack writes until the commit log +# has been fsynced to disk. It will wait +# commitlog_sync_batch_window_in_ms milliseconds between fsyncs. +# This window should be kept short because the writer threads will +# be unable to do extra work while waiting. (You may need to increase +# concurrent_writes for the same reason.) +# +# commitlog_sync: batch +# commitlog_sync_batch_window_in_ms: 2 +# +# the other option is "periodic" where writes may be acked immediately +# and the CommitLog is simply synced every commitlog_sync_period_in_ms +# milliseconds. +commitlog_sync: periodic +commitlog_sync_period_in_ms: 10000 + +# The size of the individual commitlog file segments. A commitlog +# segment may be archived, deleted, or recycled once all the data +# in it (potentially from each columnfamily in the system) has been +# flushed to sstables. +# +# The default size is 32, which is almost always fine, but if you are +# archiving commitlog segments (see commitlog_archiving.properties), +# then you probably want a finer granularity of archiving; 8 or 16 MB +# is reasonable. +# Max mutation size is also configurable via max_mutation_size_in_kb setting in +# cassandra.yaml. The default is half the size commitlog_segment_size_in_mb * 1024. +# This should be positive and less than 2048. +# +# NOTE: If max_mutation_size_in_kb is set explicitly then commitlog_segment_size_in_mb must +# be set to at least twice the size of max_mutation_size_in_kb / 1024 +# +commitlog_segment_size_in_mb: 32 + +# Compression to apply to the commit log. If omitted, the commit log +# will be written uncompressed. LZ4, Snappy, and Deflate compressors +# are supported. +# commitlog_compression: +# - class_name: LZ4Compressor +# parameters: +# - + +# any class that implements the SeedProvider interface and has a +# constructor that takes a Map of parameters will do. +seed_provider: + # Addresses of hosts that are deemed contact points. + # Cassandra nodes use this list of hosts to find each other and learn + # the topology of the ring. You must change this if you are running + # multiple nodes! + - class_name: org.apache.cassandra.locator.SimpleSeedProvider + parameters: + # seeds is actually a comma-delimited list of addresses. + # Ex: ",," + - seeds: "172.17.0.2" + +# For workloads with more data than can fit in memory, Cassandra's +# bottleneck will be reads that need to fetch data from +# disk. "concurrent_reads" should be set to (16 * number_of_drives) in +# order to allow the operations to enqueue low enough in the stack +# that the OS and drives can reorder them. Same applies to +# "concurrent_counter_writes", since counter writes read the current +# values before incrementing and writing them back. +# +# On the other hand, since writes are almost never IO bound, the ideal +# number of "concurrent_writes" is dependent on the number of cores in +# your system; (8 * number_of_cores) is a good rule of thumb. +concurrent_reads: 32 +concurrent_writes: 32 +concurrent_counter_writes: 32 + +# For materialized view writes, as there is a read involved, so this should +# be limited by the less of concurrent reads or concurrent writes. +concurrent_materialized_view_writes: 32 + +# Maximum memory to use for sstable chunk cache and buffer pooling. +# 32MB of this are reserved for pooling buffers, the rest is used as an +# cache that holds uncompressed sstable chunks. +# Defaults to the smaller of 1/4 of heap or 512MB. This pool is allocated off-heap, +# so is in addition to the memory allocated for heap. The cache also has on-heap +# overhead which is roughly 128 bytes per chunk (i.e. 0.2% of the reserved size +# if the default 64k chunk size is used). +# Memory is only allocated when needed. +# file_cache_size_in_mb: 512 + +# Flag indicating whether to allocate on or off heap when the sstable buffer +# pool is exhausted, that is when it has exceeded the maximum memory +# file_cache_size_in_mb, beyond which it will not cache buffers but allocate on request. + +# buffer_pool_use_heap_if_exhausted: true + +# The strategy for optimizing disk read +# Possible values are: +# ssd (for solid state disks, the default) +# spinning (for spinning disks) +# disk_optimization_strategy: ssd + +# Total permitted memory to use for memtables. Cassandra will stop +# accepting writes when the limit is exceeded until a flush completes, +# and will trigger a flush based on memtable_cleanup_threshold +# If omitted, Cassandra will set both to 1/4 the size of the heap. +# memtable_heap_space_in_mb: 2048 +# memtable_offheap_space_in_mb: 2048 + +# memtable_cleanup_threshold is deprecated. The default calculation +# is the only reasonable choice. See the comments on memtable_flush_writers +# for more information. +# +# Ratio of occupied non-flushing memtable size to total permitted size +# that will trigger a flush of the largest memtable. Larger mct will +# mean larger flushes and hence less compaction, but also less concurrent +# flush activity which can make it difficult to keep your disks fed +# under heavy write load. +# +# memtable_cleanup_threshold defaults to 1 / (memtable_flush_writers + 1) +# memtable_cleanup_threshold: 0.11 + +# Specify the way Cassandra allocates and manages memtable memory. +# Options are: +# +# heap_buffers +# on heap nio buffers +# +# offheap_buffers +# off heap (direct) nio buffers +# +# offheap_objects +# off heap objects +memtable_allocation_type: heap_buffers + +# Total space to use for commit logs on disk. +# +# If space gets above this value, Cassandra will flush every dirty CF +# in the oldest segment and remove it. So a small total commitlog space +# will tend to cause more flush activity on less-active columnfamilies. +# +# The default value is the smaller of 8192, and 1/4 of the total space +# of the commitlog volume. +# +# commitlog_total_space_in_mb: 8192 + +# This sets the number of memtable flush writer threads per disk +# as well as the total number of memtables that can be flushed concurrently. +# These are generally a combination of compute and IO bound. +# +# Memtable flushing is more CPU efficient than memtable ingest and a single thread +# can keep up with the ingest rate of a whole server on a single fast disk +# until it temporarily becomes IO bound under contention typically with compaction. +# At that point you need multiple flush threads. At some point in the future +# it may become CPU bound all the time. +# +# You can tell if flushing is falling behind using the MemtablePool.BlockedOnAllocation +# metric which should be 0, but will be non-zero if threads are blocked waiting on flushing +# to free memory. +# +# memtable_flush_writers defaults to two for a single data directory. +# This means that two memtables can be flushed concurrently to the single data directory. +# If you have multiple data directories the default is one memtable flushing at a time +# but the flush will use a thread per data directory so you will get two or more writers. +# +# Two is generally enough to flush on a fast disk [array] mounted as a single data directory. +# Adding more flush writers will result in smaller more frequent flushes that introduce more +# compaction overhead. +# +# There is a direct tradeoff between number of memtables that can be flushed concurrently +# and flush size and frequency. More is not better you just need enough flush writers +# to never stall waiting for flushing to free memory. +# +#memtable_flush_writers: 2 + +# Total space to use for change-data-capture logs on disk. +# +# If space gets above this value, Cassandra will throw WriteTimeoutException +# on Mutations including tables with CDC enabled. A CDCCompactor is responsible +# for parsing the raw CDC logs and deleting them when parsing is completed. +# +# The default value is the min of 4096 mb and 1/8th of the total space +# of the drive where cdc_raw_directory resides. +# cdc_total_space_in_mb: 4096 + +# When we hit our cdc_raw limit and the CDCCompactor is either running behind +# or experiencing backpressure, we check at the following interval to see if any +# new space for cdc-tracked tables has been made available. Default to 250ms +# cdc_free_space_check_interval_ms: 250 + +# A fixed memory pool size in MB for for SSTable index summaries. If left +# empty, this will default to 5% of the heap size. If the memory usage of +# all index summaries exceeds this limit, SSTables with low read rates will +# shrink their index summaries in order to meet this limit. However, this +# is a best-effort process. In extreme conditions Cassandra may need to use +# more than this amount of memory. +index_summary_capacity_in_mb: + +# How frequently index summaries should be resampled. This is done +# periodically to redistribute memory from the fixed-size pool to sstables +# proportional their recent read rates. Setting to -1 will disable this +# process, leaving existing index summaries at their current sampling level. +index_summary_resize_interval_in_minutes: 60 + +# Whether to, when doing sequential writing, fsync() at intervals in +# order to force the operating system to flush the dirty +# buffers. Enable this to avoid sudden dirty buffer flushing from +# impacting read latencies. Almost always a good idea on SSDs; not +# necessarily on platters. +trickle_fsync: false +trickle_fsync_interval_in_kb: 10240 + +# TCP port, for commands and data +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +storage_port: 7000 + +# SSL port, for encrypted communication. Unused unless enabled in +# encryption_options +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +ssl_storage_port: 7001 + +# Address or interface to bind to and tell other Cassandra nodes to connect to. +# You _must_ change this if you want multiple nodes to be able to communicate! +# +# Set listen_address OR listen_interface, not both. +# +# Leaving it blank leaves it up to InetAddress.getLocalHost(). This +# will always do the Right Thing _if_ the node is properly configured +# (hostname, name resolution, etc), and the Right Thing is to use the +# address associated with the hostname (it might not be). +# +# Setting listen_address to 0.0.0.0 is always wrong. +# +listen_address: 172.17.0.2 + +# Set listen_address OR listen_interface, not both. Interfaces must correspond +# to a single address, IP aliasing is not supported. +# listen_interface: eth0 + +# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address +# you can specify which should be chosen using listen_interface_prefer_ipv6. If false the first ipv4 +# address will be used. If true the first ipv6 address will be used. Defaults to false preferring +# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6. +# listen_interface_prefer_ipv6: false + +# Address to broadcast to other Cassandra nodes +# Leaving this blank will set it to the same value as listen_address +broadcast_address: 172.17.0.2 + +# When using multiple physical network interfaces, set this +# to true to listen on broadcast_address in addition to +# the listen_address, allowing nodes to communicate in both +# interfaces. +# Ignore this property if the network configuration automatically +# routes between the public and private networks such as EC2. +# listen_on_broadcast_address: false + +# Internode authentication backend, implementing IInternodeAuthenticator; +# used to allow/disallow connections from peer nodes. +# internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator + +# Whether to start the native transport server. +# Please note that the address on which the native transport is bound is the +# same as the rpc_address. The port however is different and specified below. +start_native_transport: true +# port for the CQL native transport to listen for clients on +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +native_transport_port: 9042 +# Enabling native transport encryption in client_encryption_options allows you to either use +# encryption for the standard port or to use a dedicated, additional port along with the unencrypted +# standard native_transport_port. +# Enabling client encryption and keeping native_transport_port_ssl disabled will use encryption +# for native_transport_port. Setting native_transport_port_ssl to a different value +# from native_transport_port will use encryption for native_transport_port_ssl while +# keeping native_transport_port unencrypted. +# native_transport_port_ssl: 9142 +# The maximum threads for handling requests when the native transport is used. +# This is similar to rpc_max_threads though the default differs slightly (and +# there is no native_transport_min_threads, idle threads will always be stopped +# after 30 seconds). +# native_transport_max_threads: 128 +# +# The maximum size of allowed frame. Frame (requests) larger than this will +# be rejected as invalid. The default is 256MB. If you're changing this parameter, +# you may want to adjust max_value_size_in_mb accordingly. This should be positive and less than 2048. +# native_transport_max_frame_size_in_mb: 256 + +# The maximum number of concurrent client connections. +# The default is -1, which means unlimited. +# native_transport_max_concurrent_connections: -1 + +# The maximum number of concurrent client connections per source ip. +# The default is -1, which means unlimited. +# native_transport_max_concurrent_connections_per_ip: -1 + +# Whether to start the thrift rpc server. +start_rpc: false + +# The address or interface to bind the Thrift RPC service and native transport +# server to. +# +# Set rpc_address OR rpc_interface, not both. +# +# Leaving rpc_address blank has the same effect as on listen_address +# (i.e. it will be based on the configured hostname of the node). +# +# Note that unlike listen_address, you can specify 0.0.0.0, but you must also +# set broadcast_rpc_address to a value other than 0.0.0.0. +# +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +rpc_address: 0.0.0.0 + +# Set rpc_address OR rpc_interface, not both. Interfaces must correspond +# to a single address, IP aliasing is not supported. +# rpc_interface: eth1 + +# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address +# you can specify which should be chosen using rpc_interface_prefer_ipv6. If false the first ipv4 +# address will be used. If true the first ipv6 address will be used. Defaults to false preferring +# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6. +# rpc_interface_prefer_ipv6: false + +# port for Thrift to listen for clients on +rpc_port: 9160 + +# RPC address to broadcast to drivers and other Cassandra nodes. This cannot +# be set to 0.0.0.0. If left blank, this will be set to the value of +# rpc_address. If rpc_address is set to 0.0.0.0, broadcast_rpc_address must +# be set. +broadcast_rpc_address: 172.17.0.2 + +# enable or disable keepalive on rpc/native connections +rpc_keepalive: true + +# Cassandra provides two out-of-the-box options for the RPC Server: +# +# sync +# One thread per thrift connection. For a very large number of clients, memory +# will be your limiting factor. On a 64 bit JVM, 180KB is the minimum stack size +# per thread, and that will correspond to your use of virtual memory (but physical memory +# may be limited depending on use of stack space). +# +# hsha +# Stands for "half synchronous, half asynchronous." All thrift clients are handled +# asynchronously using a small number of threads that does not vary with the amount +# of thrift clients (and thus scales well to many clients). The rpc requests are still +# synchronous (one thread per active request). If hsha is selected then it is essential +# that rpc_max_threads is changed from the default value of unlimited. +# +# The default is sync because on Windows hsha is about 30% slower. On Linux, +# sync/hsha performance is about the same, with hsha of course using less memory. +# +# Alternatively, can provide your own RPC server by providing the fully-qualified class name +# of an o.a.c.t.TServerFactory that can create an instance of it. +rpc_server_type: sync + +# Uncomment rpc_min|max_thread to set request pool size limits. +# +# Regardless of your choice of RPC server (see above), the number of maximum requests in the +# RPC thread pool dictates how many concurrent requests are possible (but if you are using the sync +# RPC server, it also dictates the number of clients that can be connected at all). +# +# The default is unlimited and thus provides no protection against clients overwhelming the server. You are +# encouraged to set a maximum that makes sense for you in production, but do keep in mind that +# rpc_max_threads represents the maximum number of client requests this server may execute concurrently. +# +# rpc_min_threads: 16 +# rpc_max_threads: 2048 + +# uncomment to set socket buffer sizes on rpc connections +# rpc_send_buff_size_in_bytes: +# rpc_recv_buff_size_in_bytes: + +# Uncomment to set socket buffer size for internode communication +# Note that when setting this, the buffer size is limited by net.core.wmem_max +# and when not setting it it is defined by net.ipv4.tcp_wmem +# See also: +# /proc/sys/net/core/wmem_max +# /proc/sys/net/core/rmem_max +# /proc/sys/net/ipv4/tcp_wmem +# /proc/sys/net/ipv4/tcp_wmem +# and 'man tcp' +# internode_send_buff_size_in_bytes: + +# Uncomment to set socket buffer size for internode communication +# Note that when setting this, the buffer size is limited by net.core.wmem_max +# and when not setting it it is defined by net.ipv4.tcp_wmem +# internode_recv_buff_size_in_bytes: + +# Frame size for thrift (maximum message length). +thrift_framed_transport_size_in_mb: 15 + +# Set to true to have Cassandra create a hard link to each sstable +# flushed or streamed locally in a backups/ subdirectory of the +# keyspace data. Removing these links is the operator's +# responsibility. +incremental_backups: false + +# Whether or not to take a snapshot before each compaction. Be +# careful using this option, since Cassandra won't clean up the +# snapshots for you. Mostly useful if you're paranoid when there +# is a data format change. +snapshot_before_compaction: false + +# Whether or not a snapshot is taken of the data before keyspace truncation +# or dropping of column families. The STRONGLY advised default of true +# should be used to provide data safety. If you set this flag to false, you will +# lose data on truncation or drop. +auto_snapshot: true + +# Granularity of the collation index of rows within a partition. +# Increase if your rows are large, or if you have a very large +# number of rows per partition. The competing goals are these: +# +# - a smaller granularity means more index entries are generated +# and looking up rows withing the partition by collation column +# is faster +# - but, Cassandra will keep the collation index in memory for hot +# rows (as part of the key cache), so a larger granularity means +# you can cache more hot rows +column_index_size_in_kb: 64 + +# Per sstable indexed key cache entries (the collation index in memory +# mentioned above) exceeding this size will not be held on heap. +# This means that only partition information is held on heap and the +# index entries are read from disk. +# +# Note that this size refers to the size of the +# serialized index information and not the size of the partition. +column_index_cache_size_in_kb: 2 + +# Number of simultaneous compactions to allow, NOT including +# validation "compactions" for anti-entropy repair. Simultaneous +# compactions can help preserve read performance in a mixed read/write +# workload, by mitigating the tendency of small sstables to accumulate +# during a single long running compactions. The default is usually +# fine and if you experience problems with compaction running too +# slowly or too fast, you should look at +# compaction_throughput_mb_per_sec first. +# +# concurrent_compactors defaults to the smaller of (number of disks, +# number of cores), with a minimum of 2 and a maximum of 8. +# +# If your data directories are backed by SSD, you should increase this +# to the number of cores. +#concurrent_compactors: 1 + +# Throttles compaction to the given total throughput across the entire +# system. The faster you insert data, the faster you need to compact in +# order to keep the sstable count down, but in general, setting this to +# 16 to 32 times the rate you are inserting data is more than sufficient. +# Setting this to 0 disables throttling. Note that this account for all types +# of compaction, including validation compaction. +compaction_throughput_mb_per_sec: 16 + +# When compacting, the replacement sstable(s) can be opened before they +# are completely written, and used in place of the prior sstables for +# any range that has been written. This helps to smoothly transfer reads +# between the sstables, reducing page cache churn and keeping hot rows hot +sstable_preemptive_open_interval_in_mb: 50 + +# Throttles all outbound streaming file transfers on this node to the +# given total throughput in Mbps. This is necessary because Cassandra does +# mostly sequential IO when streaming data during bootstrap or repair, which +# can lead to saturating the network connection and degrading rpc performance. +# When unset, the default is 200 Mbps or 25 MB/s. +# stream_throughput_outbound_megabits_per_sec: 200 + +# Throttles all streaming file transfer between the datacenters, +# this setting allows users to throttle inter dc stream throughput in addition +# to throttling all network stream traffic as configured with +# stream_throughput_outbound_megabits_per_sec +# When unset, the default is 200 Mbps or 25 MB/s +# inter_dc_stream_throughput_outbound_megabits_per_sec: 200 + +# How long the coordinator should wait for read operations to complete +read_request_timeout_in_ms: 5000 +# How long the coordinator should wait for seq or index scans to complete +range_request_timeout_in_ms: 10000 +# How long the coordinator should wait for writes to complete +write_request_timeout_in_ms: 2000 +# How long the coordinator should wait for counter writes to complete +counter_write_request_timeout_in_ms: 5000 +# How long a coordinator should continue to retry a CAS operation +# that contends with other proposals for the same row +cas_contention_timeout_in_ms: 1000 +# How long the coordinator should wait for truncates to complete +# (This can be much longer, because unless auto_snapshot is disabled +# we need to flush first so we can snapshot before removing the data.) +truncate_request_timeout_in_ms: 60000 +# The default timeout for other, miscellaneous operations +request_timeout_in_ms: 10000 + +# How long before a node logs slow queries. Select queries that take longer than +# this timeout to execute, will generate an aggregated log message, so that slow queries +# can be identified. Set this value to zero to disable slow query logging. +slow_query_log_timeout_in_ms: 500 + +# Enable operation timeout information exchange between nodes to accurately +# measure request timeouts. If disabled, replicas will assume that requests +# were forwarded to them instantly by the coordinator, which means that +# under overload conditions we will waste that much extra time processing +# already-timed-out requests. +# +# Warning: before enabling this property make sure to ntp is installed +# and the times are synchronized between the nodes. +cross_node_timeout: false + +# Set keep-alive period for streaming +# This node will send a keep-alive message periodically with this period. +# If the node does not receive a keep-alive message from the peer for +# 2 keep-alive cycles the stream session times out and fail +# Default value is 300s (5 minutes), which means stalled stream +# times out in 10 minutes by default +# streaming_keep_alive_period_in_secs: 300 + +# phi value that must be reached for a host to be marked down. +# most users should never need to adjust this. +# phi_convict_threshold: 8 + +# endpoint_snitch -- Set this to a class that implements +# IEndpointSnitch. The snitch has two functions: +# +# - it teaches Cassandra enough about your network topology to route +# requests efficiently +# - it allows Cassandra to spread replicas around your cluster to avoid +# correlated failures. It does this by grouping machines into +# "datacenters" and "racks." Cassandra will do its best not to have +# more than one replica on the same "rack" (which may not actually +# be a physical location) +# +# CASSANDRA WILL NOT ALLOW YOU TO SWITCH TO AN INCOMPATIBLE SNITCH +# ONCE DATA IS INSERTED INTO THE CLUSTER. This would cause data loss. +# This means that if you start with the default SimpleSnitch, which +# locates every node on "rack1" in "datacenter1", your only options +# if you need to add another datacenter are GossipingPropertyFileSnitch +# (and the older PFS). From there, if you want to migrate to an +# incompatible snitch like Ec2Snitch you can do it by adding new nodes +# under Ec2Snitch (which will locate them in a new "datacenter") and +# decommissioning the old ones. +# +# Out of the box, Cassandra provides: +# +# SimpleSnitch: +# Treats Strategy order as proximity. This can improve cache +# locality when disabling read repair. Only appropriate for +# single-datacenter deployments. +# +# GossipingPropertyFileSnitch +# This should be your go-to snitch for production use. The rack +# and datacenter for the local node are defined in +# cassandra-rackdc.properties and propagated to other nodes via +# gossip. If cassandra-topology.properties exists, it is used as a +# fallback, allowing migration from the PropertyFileSnitch. +# +# PropertyFileSnitch: +# Proximity is determined by rack and data center, which are +# explicitly configured in cassandra-topology.properties. +# +# Ec2Snitch: +# Appropriate for EC2 deployments in a single Region. Loads Region +# and Availability Zone information from the EC2 API. The Region is +# treated as the datacenter, and the Availability Zone as the rack. +# Only private IPs are used, so this will not work across multiple +# Regions. +# +# Ec2MultiRegionSnitch: +# Uses public IPs as broadcast_address to allow cross-region +# connectivity. (Thus, you should set seed addresses to the public +# IP as well.) You will need to open the storage_port or +# ssl_storage_port on the public IP firewall. (For intra-Region +# traffic, Cassandra will switch to the private IP after +# establishing a connection.) +# +# RackInferringSnitch: +# Proximity is determined by rack and data center, which are +# assumed to correspond to the 3rd and 2nd octet of each node's IP +# address, respectively. Unless this happens to match your +# deployment conventions, this is best used as an example of +# writing a custom Snitch class and is provided in that spirit. +# +# You can use a custom Snitch by setting this to the full class name +# of the snitch, which will be assumed to be on your classpath. +endpoint_snitch: SimpleSnitch + +# controls how often to perform the more expensive part of host score +# calculation +dynamic_snitch_update_interval_in_ms: 100 +# controls how often to reset all host scores, allowing a bad host to +# possibly recover +dynamic_snitch_reset_interval_in_ms: 600000 +# if set greater than zero and read_repair_chance is < 1.0, this will allow +# 'pinning' of replicas to hosts in order to increase cache capacity. +# The badness threshold will control how much worse the pinned host has to be +# before the dynamic snitch will prefer other replicas over it. This is +# expressed as a double which represents a percentage. Thus, a value of +# 0.2 means Cassandra would continue to prefer the static snitch values +# until the pinned host was 20% worse than the fastest. +dynamic_snitch_badness_threshold: 0.1 + +# request_scheduler -- Set this to a class that implements +# RequestScheduler, which will schedule incoming client requests +# according to the specific policy. This is useful for multi-tenancy +# with a single Cassandra cluster. +# NOTE: This is specifically for requests from the client and does +# not affect inter node communication. +# org.apache.cassandra.scheduler.NoScheduler - No scheduling takes place +# org.apache.cassandra.scheduler.RoundRobinScheduler - Round robin of +# client requests to a node with a separate queue for each +# request_scheduler_id. The scheduler is further customized by +# request_scheduler_options as described below. +request_scheduler: org.apache.cassandra.scheduler.NoScheduler + +# Scheduler Options vary based on the type of scheduler +# +# NoScheduler +# Has no options +# +# RoundRobin +# throttle_limit +# The throttle_limit is the number of in-flight +# requests per client. Requests beyond +# that limit are queued up until +# running requests can complete. +# The value of 80 here is twice the number of +# concurrent_reads + concurrent_writes. +# default_weight +# default_weight is optional and allows for +# overriding the default which is 1. +# weights +# Weights are optional and will default to 1 or the +# overridden default_weight. The weight translates into how +# many requests are handled during each turn of the +# RoundRobin, based on the scheduler id. +# +# request_scheduler_options: +# throttle_limit: 80 +# default_weight: 5 +# weights: +# Keyspace1: 1 +# Keyspace2: 5 + +# request_scheduler_id -- An identifier based on which to perform +# the request scheduling. Currently the only valid option is keyspace. +# request_scheduler_id: keyspace + +# Enable or disable inter-node encryption +# JVM defaults for supported SSL socket protocols and cipher suites can +# be replaced using custom encryption options. This is not recommended +# unless you have policies in place that dictate certain settings, or +# need to disable vulnerable ciphers or protocols in case the JVM cannot +# be updated. +# FIPS compliant settings can be configured at JVM level and should not +# involve changing encryption settings here: +# https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/FIPS.html +# *NOTE* No custom encryption options are enabled at the moment +# The available internode options are : all, none, dc, rack +# +# If set to dc cassandra will encrypt the traffic between the DCs +# If set to rack cassandra will encrypt the traffic between the racks +# +# The passwords used in these options must match the passwords used when generating +# the keystore and truststore. For instructions on generating these files, see: +# http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore +# +server_encryption_options: + internode_encryption: none + keystore: conf/.keystore + keystore_password: cassandra + truststore: conf/.truststore + truststore_password: cassandra + # More advanced defaults below: + # protocol: TLS + # algorithm: SunX509 + # store_type: JKS + # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA] + # require_client_auth: false + # require_endpoint_verification: false + +# enable or disable client/server encryption. +client_encryption_options: + enabled: false + # If enabled and optional is set to true encrypted and unencrypted connections are handled. + optional: false + keystore: conf/.keystore + keystore_password: cassandra + # require_client_auth: false + # Set trustore and truststore_password if require_client_auth is true + # truststore: conf/.truststore + # truststore_password: cassandra + # More advanced defaults below: + # protocol: TLS + # algorithm: SunX509 + # store_type: JKS + # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA] + +# internode_compression controls whether traffic between nodes is +# compressed. +# Can be: +# +# all +# all traffic is compressed +# +# dc +# traffic between different datacenters is compressed +# +# none +# nothing is compressed. +internode_compression: dc + +# Enable or disable tcp_nodelay for inter-dc communication. +# Disabling it will result in larger (but fewer) network packets being sent, +# reducing overhead from the TCP protocol itself, at the cost of increasing +# latency if you block for cross-datacenter responses. +inter_dc_tcp_nodelay: false + +# TTL for different trace types used during logging of the repair process. +tracetype_query_ttl: 86400 +tracetype_repair_ttl: 604800 + +# By default, Cassandra logs GC Pauses greater than 200 ms at INFO level +# This threshold can be adjusted to minimize logging if necessary +# gc_log_threshold_in_ms: 200 + +# If unset, all GC Pauses greater than gc_log_threshold_in_ms will log at +# INFO level +# UDFs (user defined functions) are disabled by default. +# As of Cassandra 3.0 there is a sandbox in place that should prevent execution of evil code. +enable_user_defined_functions: false + +# Enables scripted UDFs (JavaScript UDFs). +# Java UDFs are always enabled, if enable_user_defined_functions is true. +# Enable this option to be able to use UDFs with "language javascript" or any custom JSR-223 provider. +# This option has no effect, if enable_user_defined_functions is false. +enable_scripted_user_defined_functions: false + +# The default Windows kernel timer and scheduling resolution is 15.6ms for power conservation. +# Lowering this value on Windows can provide much tighter latency and better throughput, however +# some virtualized environments may see a negative performance impact from changing this setting +# below their system default. The sysinternals 'clockres' tool can confirm your system's default +# setting. +windows_timer_interval: 1 + + +# Enables encrypting data at-rest (on disk). Different key providers can be plugged in, but the default reads from +# a JCE-style keystore. A single keystore can hold multiple keys, but the one referenced by +# the "key_alias" is the only key that will be used for encrypt opertaions; previously used keys +# can still (and should!) be in the keystore and will be used on decrypt operations +# (to handle the case of key rotation). +# +# It is strongly recommended to download and install Java Cryptography Extension (JCE) +# Unlimited Strength Jurisdiction Policy Files for your version of the JDK. +# (current link: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html) +# +# Currently, only the following file types are supported for transparent data encryption, although +# more are coming in future cassandra releases: commitlog, hints +transparent_data_encryption_options: + enabled: false + chunk_length_kb: 64 + cipher: AES/CBC/PKCS5Padding + key_alias: testing:1 + # CBC IV length for AES needs to be 16 bytes (which is also the default size) + # iv_length: 16 + key_provider: + - class_name: org.apache.cassandra.security.JKSKeyProvider + parameters: + - keystore: conf/.keystore + keystore_password: cassandra + store_type: JCEKS + key_password: cassandra + + +##################### +# SAFETY THRESHOLDS # +##################### + +# When executing a scan, within or across a partition, we need to keep the +# tombstones seen in memory so we can return them to the coordinator, which +# will use them to make sure other replicas also know about the deleted rows. +# With workloads that generate a lot of tombstones, this can cause performance +# problems and even exaust the server heap. +# (http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets) +# Adjust the thresholds here if you understand the dangers and want to +# scan more tombstones anyway. These thresholds may also be adjusted at runtime +# using the StorageService mbean. +tombstone_warn_threshold: 1000 +tombstone_failure_threshold: 100000 + +# Log WARN on any multiple-partition batch size exceeding this value. 5kb per batch by default. +# Caution should be taken on increasing the size of this threshold as it can lead to node instability. +batch_size_warn_threshold_in_kb: 5 + +# Fail any multiple-partition batch exceeding this value. 50kb (10x warn threshold) by default. +batch_size_fail_threshold_in_kb: 50 + +# Log WARN on any batches not of type LOGGED than span across more partitions than this limit +unlogged_batch_across_partitions_warn_threshold: 10 + +# Log a warning when compacting partitions larger than this value +compaction_large_partition_warning_threshold_mb: 100 + +# GC Pauses greater than gc_warn_threshold_in_ms will be logged at WARN level +# Adjust the threshold based on your application throughput requirement +# By default, Cassandra logs GC Pauses greater than 200 ms at INFO level +gc_warn_threshold_in_ms: 1000 + +# Maximum size of any value in SSTables. Safety measure to detect SSTable corruption +# early. Any value size larger than this threshold will result into marking an SSTable +# as corrupted. This should be positive and less than 2048. +# max_value_size_in_mb: 256 + +# Back-pressure settings # +# If enabled, the coordinator will apply the back-pressure strategy specified below to each mutation +# sent to replicas, with the aim of reducing pressure on overloaded replicas. +back_pressure_enabled: false +# The back-pressure strategy applied. +# The default implementation, RateBasedBackPressure, takes three arguments: +# high ratio, factor, and flow type, and uses the ratio between incoming mutation responses and outgoing mutation requests. +# If below high ratio, outgoing mutations are rate limited according to the incoming rate decreased by the given factor; +# if above high ratio, the rate limiting is increased by the given factor; +# such factor is usually best configured between 1 and 10, use larger values for a faster recovery +# at the expense of potentially more dropped mutations; +# the rate limiting is applied according to the flow type: if FAST, it's rate limited at the speed of the fastest replica, +# if SLOW at the speed of the slowest one. +# New strategies can be added. Implementors need to implement org.apache.cassandra.net.BackpressureStrategy and +# provide a public constructor accepting a Map. +back_pressure_strategy: + - class_name: org.apache.cassandra.net.RateBasedBackPressure + parameters: + - high_ratio: 0.90 + factor: 5 + flow: FAST + +# Coalescing Strategies # +# Coalescing multiples messages turns out to significantly boost message processing throughput (think doubling or more). +# On bare metal, the floor for packet processing throughput is high enough that many applications won't notice, but in +# virtualized environments, the point at which an application can be bound by network packet processing can be +# surprisingly low compared to the throughput of task processing that is possible inside a VM. It's not that bare metal +# doesn't benefit from coalescing messages, it's that the number of packets a bare metal network interface can process +# is sufficient for many applications such that no load starvation is experienced even without coalescing. +# There are other benefits to coalescing network messages that are harder to isolate with a simple metric like messages +# per second. By coalescing multiple tasks together, a network thread can process multiple messages for the cost of one +# trip to read from a socket, and all the task submission work can be done at the same time reducing context switching +# and increasing cache friendliness of network message processing. +# See CASSANDRA-8692 for details. + +# Strategy to use for coalescing messages in OutboundTcpConnection. +# Can be fixed, movingaverage, timehorizon, disabled (default). +# You can also specify a subclass of CoalescingStrategies.CoalescingStrategy by name. +# otc_coalescing_strategy: DISABLED + +# How many microseconds to wait for coalescing. For fixed strategy this is the amount of time after the first +# message is received before it will be sent with any accompanying messages. For moving average this is the +# maximum amount of time that will be waited as well as the interval at which messages must arrive on average +# for coalescing to be enabled. +# otc_coalescing_window_us: 200 + +# Do not try to coalesce messages if we already got that many messages. This should be more than 2 and less than 128. +# otc_coalescing_enough_coalesced_messages: 8 + +# How many milliseconds to wait between two expiration runs on the backlog (queue) of the OutboundTcpConnection. +# Expiration is done if messages are piling up in the backlog. Droppable messages are expired to free the memory +# taken by expired messages. The interval should be between 0 and 1000, and in most installations the default value +# will be appropriate. A smaller value could potentially expire messages slightly sooner at the expense of more CPU +# time and queue contention while iterating the backlog of messages. +# An interval of 0 disables any wait time, which is the behavior of former Cassandra versions. +# +# otc_backlog_expiration_interval_ms: 200 diff --git a/modules/cassandra/src/test/resources/initial-with-error.cql b/modules/cassandra/src/test/resources/initial-with-error.cql new file mode 100644 index 00000000000..4f0e11d721b --- /dev/null +++ b/modules/cassandra/src/test/resources/initial-with-error.cql @@ -0,0 +1,6 @@ +CREATE KEYSPACE keySpaceTest WITH replication = {'class': 'SimpleStrategy', 'replication_factor' : 1}; + +USE keySpaceTest; + +/* The following statement contains an error (missing primary key) on purpose, do not fix it! */ +CREATE TABLE catalog_category (id bigint); From e7f8af5ce4c5e476ae17dc886663752039941a40 Mon Sep 17 00:00:00 2001 From: sullis Date: Tue, 13 Aug 2024 18:23:04 -0700 Subject: [PATCH 0181/1224] [docs] Update localstack version (#8515) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- docs/modules/localstack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/localstack.md b/docs/modules/localstack.md index b6c82ccf67a..827ed4a6534 100644 --- a/docs/modules/localstack.md +++ b/docs/modules/localstack.md @@ -7,7 +7,7 @@ Testcontainers module for [LocalStack](http://localstack.cloud/), 'a fully funct Running LocalStack as a stand-in for AWS S3 during a test: ```java -DockerImageName localstackImage = DockerImageName.parse("localstack/localstack:0.11.3"); +DockerImageName localstackImage = DockerImageName.parse("localstack/localstack:3.5.0"); @Rule public LocalStackContainer localstack = new LocalStackContainer(localstackImage) From 0f9956af805ceb08ae5f26dab0933cc8877afd54 Mon Sep 17 00:00:00 2001 From: lizhou1111 <142761624+lizhou1111@users.noreply.github.com> Date: Thu, 15 Aug 2024 03:04:31 +0800 Subject: [PATCH 0182/1224] Add Timeplus module (#8779) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: lizhou1111 Co-authored-by: Jasmine-ge Co-authored-by: Eddú Meléndez --- .github/ISSUE_TEMPLATE/bug_report.yaml | 1 + .github/ISSUE_TEMPLATE/enhancement.yaml | 1 + .github/ISSUE_TEMPLATE/feature.yaml | 1 + .github/dependabot.yml | 5 + .github/labeler.yml | 4 + .github/settings.yml | 3 + docs/modules/databases/jdbc.md | 4 + docs/modules/databases/timeplus.md | 24 ++++ mkdocs.yml | 1 + modules/timeplus/build.gradle | 10 ++ .../timeplus/TimeplusContainer.java | 125 ++++++++++++++++++ .../timeplus/TimeplusContainerProvider.java | 32 +++++ ...s.containers.JdbcDatabaseContainerProvider | 1 + .../org/testcontainers/TimeplusImages.java | 7 + .../timeplus/TimeplusJDBCDriverTest.java | 19 +++ .../timeplus/TimeplusContainerTest.java | 46 +++++++ .../src/test/resources/logback-test.xml | 16 +++ 17 files changed, 300 insertions(+) create mode 100644 docs/modules/databases/timeplus.md create mode 100644 modules/timeplus/build.gradle create mode 100644 modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainer.java create mode 100644 modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainerProvider.java create mode 100644 modules/timeplus/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider create mode 100644 modules/timeplus/src/test/java/org/testcontainers/TimeplusImages.java create mode 100644 modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java create mode 100644 modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java create mode 100644 modules/timeplus/src/test/resources/logback-test.xml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 5a9cba69083..284e2c561fb 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -60,6 +60,7 @@ body: - Solace - Solr - TiDB + - Timeplus - ToxiProxy - Trino - Vault diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index c6fb9767f60..2ca7de6bc3c 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -60,6 +60,7 @@ body: - Solace - Solr - TiDB + - Timeplus - ToxiProxy - Trino - Vault diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 485e1477a06..311ec8ca2c6 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -60,6 +60,7 @@ body: - Solace - Solr - TiDB + - Timeplus - ToxiProxy - Trino - Vault diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 6bdca459fab..0239be10168 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -342,6 +342,11 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + - package-ecosystem: "gradle" + directory: "/modules/timeplus" + schedule: + interval: "weekly" + open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/toxiproxy" schedule: diff --git a/.github/labeler.yml b/.github/labeler.yml index f449a11685d..875e996c428 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -216,6 +216,10 @@ - changed-files: - any-glob-to-any-file: - modules/tidb/**/* +"modules/timeplus": + - changed-files: + - any-glob-to-any-file: + - modules/timeplus/**/* "modules/toxiproxy": - changed-files: - any-glob-to-any-file: diff --git a/.github/settings.yml b/.github/settings.yml index 2bd2289af79..06b1c06e72f 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -253,6 +253,9 @@ labels: - name: modules/tidb color: '#006b75' + - name: modules/timeplus + color: '#006b75' + - name: modules/toxiproxy color: '#006b75' diff --git a/docs/modules/databases/jdbc.md b/docs/modules/databases/jdbc.md index 3c92e8a99ad..90183228bd5 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -87,6 +87,10 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database `jdbc:tc:tidb:v6.1.0:///databasename` +#### Using Timeplus + +`jdbc:tc:timeplus:2.3.21:///databasename` + #### Using Trino `jdbc:tc:trino:352://localhost/memory/default` diff --git a/docs/modules/databases/timeplus.md b/docs/modules/databases/timeplus.md new file mode 100644 index 00000000000..4f5cd4106a3 --- /dev/null +++ b/docs/modules/databases/timeplus.md @@ -0,0 +1,24 @@ +# Timeplus Module + +## Adding this module to your project dependencies + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" + ```groovy + testImplementation "org.testcontainers:timeplus:{{latest_version}}" + ``` + +=== "Maven" + ```xml + + org.testcontainers + timeplus + {{latest_version}} + test + + ``` + +!!! hint + Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency. + diff --git a/mkdocs.yml b/mkdocs.yml index 8aed24d20f6..2e1c60c7dcc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -72,6 +72,7 @@ nav: - modules/databases/presto.md - modules/databases/questdb.md - modules/databases/tidb.md + - modules/databases/timeplus.md - modules/databases/trino.md - modules/databases/yugabytedb.md - modules/activemq.md diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle new file mode 100644 index 00000000000..74570d821c2 --- /dev/null +++ b/modules/timeplus/build.gradle @@ -0,0 +1,10 @@ +description = "Testcontainers :: JDBC :: Timeplus" + +dependencies { + api project(':testcontainers') + api project(':jdbc') + + testImplementation project(':jdbc-test') + testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.4' + testImplementation 'org.assertj:assertj-core:3.26.3' +} diff --git a/modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainer.java b/modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainer.java new file mode 100644 index 00000000000..0ba28c8f10a --- /dev/null +++ b/modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainer.java @@ -0,0 +1,125 @@ +package org.testcontainers.timeplus; + +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; +import java.util.HashSet; +import java.util.Set; + +/** + * Testcontainers implementation for Timeplus. + *

+ * Supported image: {@code timeplus/timeplusd} + *

+ * Exposed ports: + *

    + *
  • Database: 8463
  • + *
  • HTTP: 3218
  • + *
+ */ +public class TimeplusContainer extends JdbcDatabaseContainer { + + static final String NAME = "timeplus"; + + static final String DOCKER_IMAGE_NAME = "timeplus/timeplusd"; + + private static final DockerImageName TIMEPLUS_IMAGE_NAME = DockerImageName.parse(DOCKER_IMAGE_NAME); + + private static final Integer HTTP_PORT = 3218; + + private static final Integer NATIVE_PORT = 8463; + + private static final String DRIVER_CLASS_NAME = "com.timeplus.jdbc.TimeplusDriver"; + + private static final String JDBC_URL_PREFIX = "jdbc:" + NAME + "://"; + + private static final String TEST_QUERY = "SELECT 1"; + + private String databaseName = "default"; + + private String username = "default"; + + private String password = ""; + + public TimeplusContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public TimeplusContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(TIMEPLUS_IMAGE_NAME); + + addExposedPorts(HTTP_PORT, NATIVE_PORT); + waitingFor(Wait.forHttp("/timeplusd/v1/ping").forStatusCode(200).withStartupTimeout(Duration.ofMinutes(1))); + } + + @Override + protected void configure() { + withEnv("TIMEPLUS_DB", this.databaseName); + withEnv("TIMEPLUS_USER", this.username); + withEnv("TIMEPLUS_PASSWORD", this.password); + } + + @Override + public Set getLivenessCheckPortNumbers() { + return new HashSet<>(getMappedPort(HTTP_PORT)); + } + + @Override + public String getDriverClassName() { + return DRIVER_CLASS_NAME; + } + + @Override + public String getJdbcUrl() { + return ( + JDBC_URL_PREFIX + + getHost() + + ":" + + getMappedPort(NATIVE_PORT) + + "/" + + this.databaseName + + constructUrlParameters("?", "&") + ); + } + + @Override + public String getUsername() { + return this.username; + } + + @Override + public String getPassword() { + return this.password; + } + + @Override + public String getDatabaseName() { + return this.databaseName; + } + + @Override + public String getTestQueryString() { + return TEST_QUERY; + } + + @Override + public TimeplusContainer withUsername(String username) { + this.username = username; + return this; + } + + @Override + public TimeplusContainer withPassword(String password) { + this.password = password; + return this; + } + + @Override + public TimeplusContainer withDatabaseName(String databaseName) { + this.databaseName = databaseName; + return this; + } +} diff --git a/modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainerProvider.java b/modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainerProvider.java new file mode 100644 index 00000000000..1d71e654a45 --- /dev/null +++ b/modules/timeplus/src/main/java/org/testcontainers/timeplus/TimeplusContainerProvider.java @@ -0,0 +1,32 @@ +package org.testcontainers.timeplus; + +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.JdbcDatabaseContainerProvider; +import org.testcontainers.utility.DockerImageName; + +/** + * Factory for Timeplus containers. + */ +public class TimeplusContainerProvider extends JdbcDatabaseContainerProvider { + + private static final String DEFAULT_TAG = "2.3.21"; + + @Override + public boolean supports(String databaseType) { + return databaseType.equals(TimeplusContainer.NAME); + } + + @Override + public JdbcDatabaseContainer newInstance() { + return newInstance(DEFAULT_TAG); + } + + @Override + public JdbcDatabaseContainer newInstance(String tag) { + if (tag != null) { + return new TimeplusContainer(DockerImageName.parse(TimeplusContainer.DOCKER_IMAGE_NAME).withTag(tag)); + } else { + return newInstance(); + } + } +} diff --git a/modules/timeplus/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider b/modules/timeplus/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider new file mode 100644 index 00000000000..f3122d3d73b --- /dev/null +++ b/modules/timeplus/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.timeplus.TimeplusContainerProvider diff --git a/modules/timeplus/src/test/java/org/testcontainers/TimeplusImages.java b/modules/timeplus/src/test/java/org/testcontainers/TimeplusImages.java new file mode 100644 index 00000000000..4079e0b4524 --- /dev/null +++ b/modules/timeplus/src/test/java/org/testcontainers/TimeplusImages.java @@ -0,0 +1,7 @@ +package org.testcontainers; + +import org.testcontainers.utility.DockerImageName; + +public interface TimeplusImages { + DockerImageName TIMEPLUS_IMAGE = DockerImageName.parse("timeplus/timeplusd:2.3.21"); +} diff --git a/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java b/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java new file mode 100644 index 00000000000..3f3a7ac8136 --- /dev/null +++ b/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java @@ -0,0 +1,19 @@ +package org.testcontainers.junit.timeplus; + +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.testcontainers.jdbc.AbstractJDBCDriverTest; + +import java.util.Arrays; +import java.util.EnumSet; + +@RunWith(Parameterized.class) +public class TimeplusJDBCDriverTest extends AbstractJDBCDriverTest { + + @Parameterized.Parameters(name = "{index} - {0}") + public static Iterable data() { + return Arrays.asList( + new Object[][] { { "jdbc:tc:timeplus:2.3.21://hostname", EnumSet.noneOf(Options.class) } } + ); + } +} diff --git a/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java b/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java new file mode 100644 index 00000000000..95ecc1c6ef7 --- /dev/null +++ b/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java @@ -0,0 +1,46 @@ +package org.testcontainers.timeplus; + +import org.junit.Test; +import org.testcontainers.TimeplusImages; +import org.testcontainers.db.AbstractContainerDatabaseTest; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TimeplusContainerTest extends AbstractContainerDatabaseTest { + + @Test + public void testSimple() throws SQLException { + try (TimeplusContainer timeplus = new TimeplusContainer(TimeplusImages.TIMEPLUS_IMAGE)) { + timeplus.start(); + + ResultSet resultSet = performQuery(timeplus, "SELECT 1"); + + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).isEqualTo(1); + } + } + + @Test + public void customCredentialsWithUrlParams() throws SQLException { + try ( + TimeplusContainer timeplus = new TimeplusContainer(TimeplusImages.TIMEPLUS_IMAGE) + .withUsername("system") + .withPassword("sys@t+") + .withDatabaseName("system") + .withUrlParam("interactive_delay", "5") + ) { + timeplus.start(); + + ResultSet resultSet = performQuery( + timeplus, + "SELECT to_int(value) FROM system.settings where name='interactive_delay'" + ); + + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).isEqualTo(5); + } + } +} diff --git a/modules/timeplus/src/test/resources/logback-test.xml b/modules/timeplus/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/timeplus/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + + From 0b3b773c2e0986c283c7f280543ba4c08724c9f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 14 Aug 2024 19:05:05 +0000 Subject: [PATCH 0183/1224] Bump org.junit.platform:junit-platform-testkit in /modules/spock Bumps [org.junit.platform:junit-platform-testkit](https://github.com/junit-team/junit5) from 1.10.3 to 1.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-testkit dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 eebf30e2e2e..0e20e710b94 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -18,7 +18,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.3' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' - testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.10.3' + testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.11.0' testCompileOnly 'org.jetbrains:annotations:24.1.0' } From cb7a793aa695e31345aa906c9dd5283bb98e4d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 15 Aug 2024 10:24:23 -0600 Subject: [PATCH 0184/1224] Run on windows only in main branch --- .github/workflows/ci-windows.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index e6775faf870..8d324b0d9f3 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -42,6 +42,7 @@ permissions: jobs: core: + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} runs-on: self-hosted permissions: checks: write From 5f52583c9cda3f75281585df9b20f7a39081fe39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 19 Aug 2024 22:17:49 +0000 Subject: [PATCH 0185/1224] Bump io.minio:minio from 8.5.11 to 8.5.12 in /modules/minio Bumps [io.minio:minio](https://github.com/minio/minio-java) from 8.5.11 to 8.5.12. - [Release notes](https://github.com/minio/minio-java/releases) - [Commits](https://github.com/minio/minio-java/compare/8.5.11...8.5.12) --- updated-dependencies: - dependency-name: io.minio:minio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index 21886053173..e4ebe5d0b43 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testImplementation("io.minio:minio:8.5.11") + testImplementation("io.minio:minio:8.5.12") testImplementation 'org.assertj:assertj-core:3.26.3' } From 251bca51f4d047d8275b04477273f36de1da7326 Mon Sep 17 00:00:00 2001 From: Reza Morshedi Date: Tue, 20 Aug 2024 17:35:52 +0200 Subject: [PATCH 0186/1224] Fix missing null check for JDBC init script (#9118) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In 6a07650, a new feature was introduced to support multiple init scripts in JdbcDatabaseContainer. However, during this update, a critical null check was inadvertently removed from the `JdbcDatabaseContainer.runInitScriptIfRequired` method. This check was responsible for ignoring null values for the `initScript` parameter. As a result, when no init script is defined, a null value is passed to `ScriptUtils.runInitScript`, leading to an exception being thrown and preventing the database container from starting. This commit reinstates the missing null check, ensuring that undefined init scripts are properly handled. Additionally, a test has been added to verify that the issue is resolved and the database container can start without an init script. --------- Co-authored-by: Eddú Meléndez --- .../containers/JdbcDatabaseContainer.java | 6 +++++- .../junit/postgresql/SimplePostgreSQLTest.java | 11 +++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) 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 713cb81bb62..cf6c995528f 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java +++ b/modules/jdbc/src/main/java/org/testcontainers/containers/JdbcDatabaseContainer.java @@ -22,6 +22,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Properties; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; @@ -361,7 +362,10 @@ protected void optionallyMapResourceParameterAsVolume( * Load init script content and apply it to the database if initScriptPath is set */ protected void runInitScriptIfRequired() { - initScriptPaths.forEach(path -> ScriptUtils.runInitScript(getDatabaseDelegate(), path)); + initScriptPaths + .stream() + .filter(Objects::nonNull) + .forEach(path -> ScriptUtils.runInitScript(getDatabaseDelegate(), path)); } public void setParameters(Map parameters) { 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 bc2fb0289e3..93e49d2d24c 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 @@ -11,6 +11,7 @@ import java.util.logging.LogManager; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatNoException; public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { static { @@ -59,6 +60,16 @@ public void testUnsetCommand() throws SQLException { } } + @Test + public void testMissingInitScript() { + try ( + PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + .withInitScript(null) + ) { + assertThatNoException().isThrownBy(postgres::start); + } + } + @Test public void testExplicitInitScript() throws SQLException { try ( From a85d57a1a530129e64bca2aab24865ffcef4d8dd Mon Sep 17 00:00:00 2001 From: "Marvin K." Date: Wed, 21 Aug 2024 21:09:55 +0200 Subject: [PATCH 0187/1224] Improve GitLab docs (#8775) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez --- .../continuous_integration/gitlab_ci.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/supported_docker_environment/continuous_integration/gitlab_ci.md b/docs/supported_docker_environment/continuous_integration/gitlab_ci.md index 5242e095b56..ccc73f58078 100644 --- a/docs/supported_docker_environment/continuous_integration/gitlab_ci.md +++ b/docs/supported_docker_environment/continuous_integration/gitlab_ci.md @@ -24,10 +24,10 @@ See below for an example runner configuration: Please also include the following in your GitlabCI pipeline definitions (`.gitlab-ci.yml`) that use Testcontainers: ```yml variables: - TESTCONTAINERS_HOST_OVERRIDE: "host.docker.internal" + TESTCONTAINERS_HOST_OVERRIDE: "" ``` -The environment variable `TESTCONTAINERS_HOST_OVERRIDE` needs to be configured, otherwise, a wrong IP address would be used to resolve the Docker host, which will likely lead to failing tests. +The environment variable `TESTCONTAINERS_HOST_OVERRIDE` needs to be configured, otherwise, a wrong IP address would be used to resolve the Docker host, which will likely lead to failing tests. For Windows and MacOS, use `host.docker.internal`. ## Example using DinD (Docker-in-Docker) From c1f4796b45ce45851d56bbf5cff20ee4ff88ca80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 22 Aug 2024 01:59:54 -0500 Subject: [PATCH 0188/1224] Add on-demand execution on windows (#9138) Test should execute on `main` branch or in PRs if `/windows-test` is added in comments. --- .github/workflows/ci-windows-trigger.yml | 27 ++++++++++++++++++++++++ .github/workflows/ci-windows.yml | 4 +++- 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/ci-windows-trigger.yml diff --git a/.github/workflows/ci-windows-trigger.yml b/.github/workflows/ci-windows-trigger.yml new file mode 100644 index 00000000000..540ab221dbf --- /dev/null +++ b/.github/workflows/ci-windows-trigger.yml @@ -0,0 +1,27 @@ +name: windows-test command dispatch + +on: + issue_comment: + types: [created] + +permissions: + contents: read + +jobs: + windows-test-command-trigger: + permissions: + pull-requests: write # for peter-evans/slash-command-dispatch to create PR reaction + runs-on: ubuntu-latest + + steps: + - name: Trigger windows-test command + uses: peter-evans/slash-command-dispatch@13bc09769d122a64f75aa5037256f6f2d78be8c4 # v4.0.0 + with: + token: ${{ secrets.WINDOWS_WORKERS_TOKEN }} + # The command to trigger the pipeline: e.g. /windows-test + # The command name must match the name of the repository_dispatch.type in 'ci-windows.yml' workflow, using '-command' as suffix. E.g. 'windows-test-command' + commands: windows-test + issue-type: pull-request + # The user that owns the above token must belong to the elevated role of 'Maintainers' + permission: maintain + reactions: false diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 8d324b0d9f3..4f11c59c082 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -32,6 +32,8 @@ on: - 'README.md' - 'RELEASING.md' - '.sdkmanrc' + repository_dispatch: + types: [windows-test-command] concurrency: group: "${{ github.workflow }}-${{ github.head_ref || github.sha }}" @@ -42,7 +44,7 @@ permissions: jobs: core: - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + if: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event.client_payload.slash_command.command == 'windows-test' }} runs-on: self-hosted permissions: checks: write From ba22a7b4c47be3216242335b94ef28f6aa1da73a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 23 Aug 2024 13:03:24 -0500 Subject: [PATCH 0189/1224] Add ConfluentKafkaContainer (#9139) * Deprecate `org.testcontainers.containers.KafkaContainer` * Add `org.testcontainers.kafka.ConfluentKafkaContainer` which works with `confluentinc/cp-kafka` images with version `7.4.0` or later. * `KafkaHelper` container common env vars, command, wait strategy to be shared with `org.testcontainers.kafka.KafkaContainer` --------- Co-authored-by: Kevin Wittek --- docs/modules/kafka.md | 38 +++-- .../containers/KafkaContainer.java | 4 + .../kafka/ConfluentKafkaContainer.java | 142 ++++++++++++++++++ .../org/testcontainers/kafka/KafkaHelper.java | 104 +++++++++++++ .../org/testcontainers/KCatContainer.java | 16 ++ .../kafka/ConfluentKafkaContainerTest.java | 65 ++++++++ 6 files changed, 360 insertions(+), 9 deletions(-) create mode 100644 modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java create mode 100644 modules/kafka/src/main/java/org/testcontainers/kafka/KafkaHelper.java create mode 100644 modules/kafka/src/test/java/org/testcontainers/KCatContainer.java create mode 100644 modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java diff --git a/docs/modules/kafka.md b/docs/modules/kafka.md index 091aac0ec72..cf3a5a27df6 100644 --- a/docs/modules/kafka.md +++ b/docs/modules/kafka.md @@ -4,10 +4,14 @@ Testcontainers can be used to automatically instantiate and manage [Apache Kafka Currently, two different Kafka images are supported: -* `org.testcontainers.containers.KafkaContainer` supports +* `org.testcontainers.kafka.ConfluentKafkaContainer` supports [confluentinc/cp-kafka](https://hub.docker.com/r/confluentinc/cp-kafka/) * `org.testcontainers.kafka.KafkaContainer` supports [apache/kafka](https://hub.docker.com/r/apache/kafka/) and [apache/kafka-native](https://hub.docker.com/r/apache/kafka-native/) +!!! note + `org.testcontainers.containers.KafkaContainer` is deprecated. + Please use `org.testcontainers.kafka.ConfluentKafkaContainer` or `org.testcontainers.kafka.KafkaContainer` instead, depending on the used image. + ## Benefits * Running a single node Kafka installation with just one line of code @@ -15,7 +19,10 @@ Currently, two different Kafka images are supported: ## Example +### Using org.testcontainers.containers.KafkaContainer + Create a `KafkaContainer` to use it in your tests: + [Creating a KafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:constructorWithVersion @@ -28,13 +35,24 @@ Now your tests or any other process running on your machine can get access to ru [Bootstrap Servers](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:getBootstrapServers -## Options +### Using org.testcontainers.kafka.ConfluentKafkaContainer + +!!! note + Compatible with `confluentinc/cp-kafka` images version `7.4.0` and later. + +Create a `ConfluentKafkaContainer` to use it in your tests: -!!! note - The options below are only available for `org.testcontainers.containers.KafkaContainer` + +[Creating a ConlfuentKafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java) inside_block:constructorWithVersion + + +## Options ### Using external Zookeeper +!!! note + Only available for `org.testcontainers.containers.KafkaContainer` + If for some reason you want to use an externally running Zookeeper, then just pass its location during construction: [External Zookeeper](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:withExternalZookeeper @@ -42,19 +60,21 @@ If for some reason you want to use an externally running Zookeeper, then just pa ### Using Kraft mode -KRaft mode was declared production ready in 3.3.1 (confluentinc/cp-kafka:7.3.x)" +!!! note + Only available for `org.testcontainers.containers.KafkaContainer` + +KRaft mode was declared production ready in 3.3.1 (confluentinc/cp-kafka:7.3.x) [Kraft mode](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:withKraftMode -See the [versions interoperability matrix](https://docs.confluent.io/platform/current/installation/versions-interoperability.html) for more details. +See the [versions interoperability matrix](https://docs.confluent.io/platform/current/installation/versions-interoperability.html) for more details. -## Register listeners +### Register listeners There are scenarios where additional listeners are needed because the consumer/producer can be in another -container in the same network or a different process where the port to connect differs from the default -exposed port `9093`. E.g [Toxiproxy](../../modules/toxiproxy/). +container in the same network or a different process where the port to connect differs from the default exposed port. E.g [Toxiproxy](../../modules/toxiproxy/). [Register additional listener](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:registerListener 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 870ab03bd0e..f2831514477 100644 --- a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java @@ -26,7 +26,11 @@ *
  • Kafka: 9093
  • *
  • Zookeeper: 2181
  • * + * + * @deprecated use {@link org.testcontainers.kafka.ConfluentKafkaContainer} or + * {@link org.testcontainers.kafka.KafkaContainer} instead */ +@Deprecated public class KafkaContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("confluentinc/cp-kafka"); diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java new file mode 100644 index 00000000000..0a3c1c2dcb3 --- /dev/null +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java @@ -0,0 +1,142 @@ +package org.testcontainers.kafka; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.function.Supplier; + +/** + * Testcontainers implementation for Confluent Kafka. + *

    + * Supported image: {@code confluentinc/cp-kafka} + *

    + * Exposed ports: 9092 + */ +public class ConfluentKafkaContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("confluentinc/cp-kafka"); + + private final Set listeners = new HashSet<>(); + + private final Set> advertisedListeners = new HashSet<>(); + + public ConfluentKafkaContainer(String imageName) { + this(DockerImageName.parse(imageName)); + } + + public ConfluentKafkaContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withExposedPorts(KafkaHelper.KAFKA_PORT); + withEnv(KafkaHelper.envVars()); + + withCommand(KafkaHelper.COMMAND); + waitingFor(KafkaHelper.WAIT_STRATEGY); + } + + @Override + protected void configure() { + KafkaHelper.resolveListeners(this, this.listeners); + + String firstNetworkAlias = getNetworkAliases().stream().findFirst().orElse(null); + String networkAlias = getNetwork() != null ? firstNetworkAlias : "localhost"; + String controllerQuorumVoters = String.format("%s@%s:9094", getEnvMap().get("KAFKA_NODE_ID"), networkAlias); + withEnv("KAFKA_CONTROLLER_QUORUM_VOTERS", controllerQuorumVoters); + } + + @Override + protected void containerIsStarting(InspectContainerResponse containerInfo) { + String brokerAdvertisedListener = String.format( + "BROKER://%s:%s", + containerInfo.getConfig().getHostName(), + "9093" + ); + List advertisedListeners = new ArrayList<>(); + advertisedListeners.add("PLAINTEXT://" + getBootstrapServers()); + advertisedListeners.add(brokerAdvertisedListener); + + advertisedListeners.addAll(KafkaHelper.resolveAdvertisedListeners(this.advertisedListeners)); + String kafkaAdvertisedListeners = String.join(",", advertisedListeners); + + String command = "#!/bin/bash\n"; + // exporting KAFKA_ADVERTISED_LISTENERS with the container hostname + command += String.format("export KAFKA_ADVERTISED_LISTENERS=%s\n", kafkaAdvertisedListeners); + + command += "/etc/confluent/docker/run \n"; + copyFileToContainer(Transferable.of(command, 0777), KafkaHelper.STARTER_SCRIPT); + } + + /** + * Add a listener in the format {@code host:port}. + * Host will be included as a network alias. + *

    + * Use it to register additional connections to the Kafka broker within the same container network. + *

    + * The listener will be added to the list of default listeners. + *

    + * Default listeners: + *

      + *
    • 0.0.0.0:9092
    • + *
    • 0.0.0.0:9093
    • + *
    • 0.0.0.0:9094
    • + *
    + *

    + * The listener will be added to the list of default advertised listeners. + *

    + * Default advertised listeners: + *

      + *
    • {@code container.getConfig().getHostName():9092}
    • + *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    + * @param listener a listener with format {@code host:port} + * @return this {@link ConfluentKafkaContainer} instance + */ + public ConfluentKafkaContainer withListener(String listener) { + this.listeners.add(listener); + this.advertisedListeners.add(() -> listener); + return this; + } + + /** + * Add a listener in the format {@code host:port} and a {@link Supplier} for the advertised listener. + * Host from listener will be included as a network alias. + *

    + * Use it to register additional connections to the Kafka broker from outside the container network + *

    + * The listener will be added to the list of default listeners. + *

    + * Default listeners: + *

      + *
    • 0.0.0.0:9092
    • + *
    • 0.0.0.0:9093
    • + *
    • 0.0.0.0:9094
    • + *
    + *

    + * The {@link Supplier} will be added to the list of default advertised listeners. + *

    + * Default advertised listeners: + *

      + *
    • {@code container.getConfig().getHostName():9092}
    • + *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    + * @param listener a supplier that will provide a listener + * @param advertisedListener a supplier that will provide a listener + * @return this {@link ConfluentKafkaContainer} instance + */ + public ConfluentKafkaContainer withListener(String listener, Supplier advertisedListener) { + this.listeners.add(listener); + this.advertisedListeners.add(advertisedListener); + return this; + } + + public String getBootstrapServers() { + return String.format("%s:%s", getHost(), getMappedPort(KafkaHelper.KAFKA_PORT)); + } +} diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaHelper.java b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaHelper.java new file mode 100644 index 00000000000..00b10a4d519 --- /dev/null +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaHelper.java @@ -0,0 +1,104 @@ +package org.testcontainers.kafka; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.containers.wait.strategy.WaitStrategy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; +import java.util.stream.Collectors; + +class KafkaHelper { + + private static final String DEFAULT_INTERNAL_TOPIC_RF = "1"; + + private static final String DEFAULT_CLUSTER_ID = "4L6g3nShT-eMCtK--X86sw"; + + private static final String PROTOCOL_PREFIX = "TC"; + + static final int KAFKA_PORT = 9092; + + static final String STARTER_SCRIPT = "/tmp/testcontainers_start.sh"; + + static final String[] COMMAND = { + "sh", + "-c", + "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT, + }; + + static final WaitStrategy WAIT_STRATEGY = Wait.forLogMessage(".*Transitioning from RECOVERY to RUNNING.*", 1); + + static Map envVars() { + Map envVars = new HashMap<>(); + envVars.put("CLUSTER_ID", DEFAULT_CLUSTER_ID); + + envVars.put( + "KAFKA_LISTENERS", + "PLAINTEXT://0.0.0.0:" + KAFKA_PORT + ",BROKER://0.0.0.0:9093,CONTROLLER://0.0.0.0:9094" + ); + envVars.put( + "KAFKA_LISTENER_SECURITY_PROTOCOL_MAP", + "BROKER:PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT" + ); + envVars.put("KAFKA_INTER_BROKER_LISTENER_NAME", "BROKER"); + envVars.put("KAFKA_PROCESS_ROLES", "broker,controller"); + envVars.put("KAFKA_CONTROLLER_LISTENER_NAMES", "CONTROLLER"); + + envVars.put("KAFKA_NODE_ID", "1"); + envVars.put("KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR", DEFAULT_INTERNAL_TOPIC_RF); + envVars.put("KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS", DEFAULT_INTERNAL_TOPIC_RF); + envVars.put("KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR", DEFAULT_INTERNAL_TOPIC_RF); + envVars.put("KAFKA_TRANSACTION_STATE_LOG_MIN_ISR", DEFAULT_INTERNAL_TOPIC_RF); + envVars.put("KAFKA_LOG_FLUSH_INTERVAL_MESSAGES", Long.MAX_VALUE + ""); + envVars.put("KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS", "0"); + return envVars; + } + + static void resolveListeners(GenericContainer kafkaContainer, Set listenersSuppliers) { + Set listeners = Arrays + .stream(kafkaContainer.getEnvMap().get("KAFKA_LISTENERS").split(",")) + .collect(Collectors.toSet()); + Set listenerSecurityProtocolMap = Arrays + .stream(kafkaContainer.getEnvMap().get("KAFKA_LISTENER_SECURITY_PROTOCOL_MAP").split(",")) + .collect(Collectors.toSet()); + + List listenersToTransform = new ArrayList<>(listenersSuppliers); + for (int i = 0; i < listenersToTransform.size(); i++) { + String protocol = String.format("%s-%d", PROTOCOL_PREFIX, i); + String listener = listenersToTransform.get(i); + String listenerHost = listener.split(":")[0]; + String listenerPort = listener.split(":")[1]; + String listenerProtocol = String.format("%s://%s:%s", protocol, listenerHost, listenerPort); + String protocolMap = String.format("%s:PLAINTEXT", protocol); + listeners.add(listenerProtocol); + listenerSecurityProtocolMap.add(protocolMap); + + String host = listener.split(":")[0]; + kafkaContainer.withNetworkAliases(host); + } + + String kafkaListeners = String.join(",", listeners); + String kafkaListenerSecurityProtocolMap = String.join(",", listenerSecurityProtocolMap); + + kafkaContainer.getEnvMap().put("KAFKA_LISTENERS", kafkaListeners); + kafkaContainer.getEnvMap().put("KAFKA_LISTENER_SECURITY_PROTOCOL_MAP", kafkaListenerSecurityProtocolMap); + } + + static List resolveAdvertisedListeners(Set> listenerSuppliers) { + List advertisedListeners = new ArrayList<>(); + List> listenersToTransform = new ArrayList<>(listenerSuppliers); + for (int i = 0; i < listenersToTransform.size(); i++) { + Supplier listenerSupplier = listenersToTransform.get(i); + String protocol = String.format("%s-%d", PROTOCOL_PREFIX, i); + String listener = listenerSupplier.get(); + String listenerProtocol = String.format("%s://%s", protocol, listener); + advertisedListeners.add(listenerProtocol); + } + return advertisedListeners; + } +} diff --git a/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java b/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java new file mode 100644 index 00000000000..84ad97b52b7 --- /dev/null +++ b/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java @@ -0,0 +1,16 @@ +package org.testcontainers; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.builder.Transferable; + +public class KCatContainer extends GenericContainer { + + public KCatContainer() { + super("confluentinc/cp-kcat:7.4.1"); + withCreateContainerCmdModifier(cmd -> { + cmd.withEntrypoint("sh"); + }); + withCopyToContainer(Transferable.of("Message produced by kcat"), "/data/msgs.txt"); + withCommand("-c", "tail -f /dev/null"); + } +} diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java new file mode 100644 index 00000000000..45bc846c021 --- /dev/null +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java @@ -0,0 +1,65 @@ +package org.testcontainers.kafka; + +import org.junit.Test; +import org.testcontainers.AbstractKafka; +import org.testcontainers.KCatContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.SocatContainer; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ConfluentKafkaContainerTest extends AbstractKafka { + + @Test + public void testUsage() throws Exception { + try ( // constructorWithVersion { + ConfluentKafkaContainer kafka = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.4.0") + // } + ) { + kafka.start(); + testKafkaFunctionality(kafka.getBootstrapServers()); + } + } + + @Test + public void testUsageWithListener() throws Exception { + try ( + Network network = Network.newNetwork(); + // registerListener { + ConfluentKafkaContainer kafka = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.4.0") + .withListener("kafka:19092") + .withNetwork(network); + // } + KCatContainer kcat = new KCatContainer().withNetwork(network) + ) { + kafka.start(); + kcat.start(); + + kcat.execInContainer("kcat", "-b", "kafka:19092", "-t", "msgs", "-P", "-l", "/data/msgs.txt"); + String stdout = kcat + .execInContainer("kcat", "-b", "kafka:19092", "-C", "-t", "msgs", "-c", "1") + .getStdout(); + + assertThat(stdout).contains("Message produced by kcat"); + } + } + + @Test + public void testUsageWithListenerFromProxy() throws Exception { + try ( + Network network = Network.newNetwork(); + // registerListenerFromProxy { + SocatContainer socat = new SocatContainer().withNetwork(network).withTarget(2000, "kafka", 19092); + ConfluentKafkaContainer kafka = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.4.0") + .withListener("kafka:19092", () -> socat.getHost() + ":" + socat.getMappedPort(2000)) + .withNetwork(network) + // } + ) { + socat.start(); + kafka.start(); + + String bootstrapServers = String.format("%s:%s", socat.getHost(), socat.getMappedPort(2000)); + testKafkaFunctionality(bootstrapServers); + } + } +} From e60b1ac78417989f4c0a04711d2432ff7af574f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 23 Aug 2024 19:32:17 -0500 Subject: [PATCH 0190/1224] Support adding new listeners to Apache Kafka (#9142) Fixes #8669 --- docs/modules/kafka.md | 8 ++ .../testcontainers/kafka/KafkaContainer.java | 96 +++++++++++++++---- .../kafka/CompatibleApacheKafkaImageTest.java | 26 +++++ .../kafka/KafkaContainerTest.java | 57 ++++++++--- 4 files changed, 155 insertions(+), 32 deletions(-) create mode 100644 modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java diff --git a/docs/modules/kafka.md b/docs/modules/kafka.md index cf3a5a27df6..a284163248a 100644 --- a/docs/modules/kafka.md +++ b/docs/modules/kafka.md @@ -46,6 +46,14 @@ Create a `ConfluentKafkaContainer` to use it in your tests: [Creating a ConlfuentKafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java) inside_block:constructorWithVersion +### Using org.testcontainers.kafka.KafkaContainer + +Create a `KafkaContainer` to use it in your tests: + + +[Creating a KafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java) inside_block:constructorWithVersion + + ## Options ### Using external Zookeeper diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java index 7eb8fa18c8b..e6f58474404 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java @@ -7,7 +7,10 @@ import org.testcontainers.utility.DockerImageName; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.function.Supplier; /** * Testcontainers implementation for Apache Kafka. @@ -24,11 +27,11 @@ public class KafkaContainer extends GenericContainer { private static final int KAFKA_PORT = 9092; - private static final String DEFAULT_INTERNAL_TOPIC_RF = "1"; - private static final String STARTER_SCRIPT = "/tmp/testcontainers_start.sh"; - private static final String DEFAULT_CLUSTER_ID = "4L6g3nShT-eMCtK--X86sw"; + private final Set listeners = new HashSet<>(); + + private final Set> advertisedListeners = new HashSet<>(); public KafkaContainer(String imageName) { this(DockerImageName.parse(imageName)); @@ -39,24 +42,7 @@ public KafkaContainer(DockerImageName dockerImageName) { dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, APACHE_KAFKA_NATIVE_IMAGE_NAME); withExposedPorts(KAFKA_PORT); - withEnv("CLUSTER_ID", DEFAULT_CLUSTER_ID); - - withEnv( - "KAFKA_LISTENERS", - "PLAINTEXT://0.0.0.0:" + KAFKA_PORT + ",BROKER://0.0.0.0:9093, CONTROLLER://0.0.0.0:9094" - ); - withEnv("KAFKA_LISTENER_SECURITY_PROTOCOL_MAP", "BROKER:PLAINTEXT,PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT"); - withEnv("KAFKA_INTER_BROKER_LISTENER_NAME", "BROKER"); - withEnv("KAFKA_PROCESS_ROLES", "broker,controller"); - withEnv("KAFKA_CONTROLLER_LISTENER_NAMES", "CONTROLLER"); - - withEnv("KAFKA_NODE_ID", "1"); - withEnv("KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR", DEFAULT_INTERNAL_TOPIC_RF); - withEnv("KAFKA_OFFSETS_TOPIC_NUM_PARTITIONS", DEFAULT_INTERNAL_TOPIC_RF); - withEnv("KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR", DEFAULT_INTERNAL_TOPIC_RF); - withEnv("KAFKA_TRANSACTION_STATE_LOG_MIN_ISR", DEFAULT_INTERNAL_TOPIC_RF); - withEnv("KAFKA_LOG_FLUSH_INTERVAL_MESSAGES", Long.MAX_VALUE + ""); - withEnv("KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS", "0"); + withEnv(KafkaHelper.envVars()); withCommand("sh", "-c", "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT); waitingFor(Wait.forLogMessage(".*Transitioning from RECOVERY to RUNNING.*", 1)); @@ -64,6 +50,8 @@ public KafkaContainer(DockerImageName dockerImageName) { @Override protected void configure() { + KafkaHelper.resolveListeners(this, this.listeners); + String firstNetworkAlias = getNetworkAliases().stream().findFirst().orElse(null); String networkAlias = getNetwork() != null ? firstNetworkAlias : "localhost"; String controllerQuorumVoters = String.format("%s@%s:9094", getEnvMap().get("KAFKA_NODE_ID"), networkAlias); @@ -80,7 +68,10 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { List advertisedListeners = new ArrayList<>(); advertisedListeners.add("PLAINTEXT://" + getBootstrapServers()); advertisedListeners.add(brokerAdvertisedListener); + + advertisedListeners.addAll(KafkaHelper.resolveAdvertisedListeners(this.advertisedListeners)); String kafkaAdvertisedListeners = String.join(",", advertisedListeners); + String command = "#!/bin/bash\n"; // exporting KAFKA_ADVERTISED_LISTENERS with the container hostname command += String.format("export KAFKA_ADVERTISED_LISTENERS=%s\n", kafkaAdvertisedListeners); @@ -89,6 +80,69 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { copyFileToContainer(Transferable.of(command, 0777), STARTER_SCRIPT); } + /** + * Add a listener in the format {@code host:port}. + * Host will be included as a network alias. + *

    + * Use it to register additional connections to the Kafka broker within the same container network. + *

    + * The listener will be added to the list of default listeners. + *

    + * Default listeners: + *

      + *
    • 0.0.0.0:9092
    • + *
    • 0.0.0.0:9093
    • + *
    • 0.0.0.0:9094
    • + *
    + *

    + * The listener will be added to the list of default advertised listeners. + *

    + * Default advertised listeners: + *

      + *
    • {@code container.getConfig().getHostName():9092}
    • + *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    + * @param listener a listener with format {@code host:port} + * @return this {@link KafkaContainer} instance + */ + public KafkaContainer withListener(String listener) { + this.listeners.add(listener); + this.advertisedListeners.add(() -> listener); + return this; + } + + /** + * Add a listener in the format {@code host:port} and a {@link Supplier} for the advertised listener. + * Host from listener will be included as a network alias. + *

    + * Use it to register additional connections to the Kafka broker from outside the container network + *

    + * The listener will be added to the list of default listeners. + *

    + * Default listeners: + *

      + *
    • 0.0.0.0:9092
    • + *
    • 0.0.0.0:9093
    • + *
    • 0.0.0.0:9094
    • + *
    + *

    + * The {@link Supplier} will be added to the list of default advertised listeners. + *

    + * Default advertised listeners: + *

      + *
    • {@code container.getConfig().getHostName():9092}
    • + *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    + * @param listener a supplier that will provide a listener + * @param advertisedListener a supplier that will provide a listener + * @return this {@link KafkaContainer} instance + */ + public KafkaContainer withListener(String listener, Supplier advertisedListener) { + this.listeners.add(listener); + this.advertisedListeners.add(advertisedListener); + return this; + } + public String getBootstrapServers() { return String.format("%s:%s", getHost(), getMappedPort(KAFKA_PORT)); } diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java new file mode 100644 index 00000000000..b2bb31ae502 --- /dev/null +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java @@ -0,0 +1,26 @@ +package org.testcontainers.kafka; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.testcontainers.AbstractKafka; + +@RunWith(Parameterized.class) +public class CompatibleApacheKafkaImageTest extends AbstractKafka { + + @Parameterized.Parameters(name = "{0}") + public static String[] params() { + return new String[] { "apache/kafka:3.8.0", "apache/kafka-native:3.8.0" }; + } + + @Parameterized.Parameter + public String imageName; + + @Test + public void testUsage() throws Exception { + try (KafkaContainer kafka = new KafkaContainer(this.imageName)) { + kafka.start(); + testKafkaFunctionality(kafka.getBootstrapServers()); + } + } +} diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java index 233ee1cd2d4..b1764d3b522 100644 --- a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java @@ -1,26 +1,61 @@ package org.testcontainers.kafka; import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.AbstractKafka; +import org.testcontainers.KCatContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.SocatContainer; + +import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) public class KafkaContainerTest extends AbstractKafka { - @Parameterized.Parameters(name = "{0}") - public static String[] params() { - return new String[] { "apache/kafka:3.8.0", "apache/kafka-native:3.8.0" }; + @Test + public void testUsage() throws Exception { + try ( // constructorWithVersion { + KafkaContainer kafka = new KafkaContainer("apache/kafka-native:3.8.0") + // } + ) { + kafka.start(); + testKafkaFunctionality(kafka.getBootstrapServers()); + } } - @Parameterized.Parameter - public String imageName; + @Test + public void testUsageWithListener() throws Exception { + try ( + Network network = Network.newNetwork(); + KafkaContainer kafka = new KafkaContainer("apache/kafka-native:3.8.0") + .withListener("kafka:19092") + .withNetwork(network); + KCatContainer kcat = new KCatContainer().withNetwork(network) + ) { + kafka.start(); + kcat.start(); + + kcat.execInContainer("kcat", "-b", "kafka:19092", "-t", "msgs", "-P", "-l", "/data/msgs.txt"); + String stdout = kcat + .execInContainer("kcat", "-b", "kafka:19092", "-C", "-t", "msgs", "-c", "1") + .getStdout(); + + assertThat(stdout).contains("Message produced by kcat"); + } + } @Test - public void testUsage() throws Exception { - try (KafkaContainer kafka = new KafkaContainer(imageName)) { + public void testUsageWithListenerFromProxy() throws Exception { + try ( + Network network = Network.newNetwork(); + SocatContainer socat = new SocatContainer().withNetwork(network).withTarget(2000, "kafka", 19092); + KafkaContainer kafka = new KafkaContainer("apache/kafka-native:3.8.0") + .withListener("kafka:19092", () -> socat.getHost() + ":" + socat.getMappedPort(2000)) + .withNetwork(network) + ) { + socat.start(); kafka.start(); - testKafkaFunctionality(kafka.getBootstrapServers()); + + String bootstrapServers = String.format("%s:%s", socat.getHost(), socat.getMappedPort(2000)); + testKafkaFunctionality(bootstrapServers); } } } From c08d0039739c38a9ce83bcf09b07a5c59814acd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 23 Aug 2024 22:24:07 -0500 Subject: [PATCH 0191/1224] Do not use network aliases in KAFKA_CONTROLLER_QUORUM_VOTERS (#9144) Fixes #9143 --- .../org/testcontainers/containers/KafkaContainer.java | 8 +------- .../org/testcontainers/kafka/ConfluentKafkaContainer.java | 4 +--- .../java/org/testcontainers/kafka/KafkaContainer.java | 4 +--- 3 files changed, 3 insertions(+), 13 deletions(-) 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 f2831514477..7eb836ade18 100644 --- a/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/containers/KafkaContainer.java @@ -331,13 +331,7 @@ void withRaft() { addEnvVar("KAFKA_LISTENERS", kafkaListeners()); addEnvVar("KAFKA_PROCESS_ROLES", "broker,controller"); - String firstNetworkAlias = getNetworkAliases().stream().findFirst().orElse(null); - String networkAlias = getNetwork() != null ? firstNetworkAlias : "localhost"; - String controllerQuorumVoters = String.format( - "%s@%s:9094", - getEnvVars().get("KAFKA_NODE_ID"), - networkAlias - ); + String controllerQuorumVoters = String.format("%s@localhost:9094", getEnvVars().get("KAFKA_NODE_ID")); this.envVars.computeIfAbsent("KAFKA_CONTROLLER_QUORUM_VOTERS", key -> controllerQuorumVoters); addEnvVar("KAFKA_CONTROLLER_LISTENER_NAMES", "CONTROLLER"); diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java index 0a3c1c2dcb3..8c2cce855bc 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java @@ -45,9 +45,7 @@ public ConfluentKafkaContainer(DockerImageName dockerImageName) { protected void configure() { KafkaHelper.resolveListeners(this, this.listeners); - String firstNetworkAlias = getNetworkAliases().stream().findFirst().orElse(null); - String networkAlias = getNetwork() != null ? firstNetworkAlias : "localhost"; - String controllerQuorumVoters = String.format("%s@%s:9094", getEnvMap().get("KAFKA_NODE_ID"), networkAlias); + String controllerQuorumVoters = String.format("%s@localhost:9094", getEnvMap().get("KAFKA_NODE_ID")); withEnv("KAFKA_CONTROLLER_QUORUM_VOTERS", controllerQuorumVoters); } diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java index e6f58474404..63e3a0d35cf 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java @@ -52,9 +52,7 @@ public KafkaContainer(DockerImageName dockerImageName) { protected void configure() { KafkaHelper.resolveListeners(this, this.listeners); - String firstNetworkAlias = getNetworkAliases().stream().findFirst().orElse(null); - String networkAlias = getNetwork() != null ? firstNetworkAlias : "localhost"; - String controllerQuorumVoters = String.format("%s@%s:9094", getEnvMap().get("KAFKA_NODE_ID"), networkAlias); + String controllerQuorumVoters = String.format("%s@localhost:9094", getEnvMap().get("KAFKA_NODE_ID")); withEnv("KAFKA_CONTROLLER_QUORUM_VOTERS", controllerQuorumVoters); } From ce83c36797a627a84b393c8cf909eda5a820fccc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 23 Aug 2024 22:24:49 -0500 Subject: [PATCH 0192/1224] Improve test logging in examples and smoke-test (#9145) --- examples/build.gradle | 10 ++++++++++ smoke-test/build.gradle | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/examples/build.gradle b/examples/build.gradle index a83df2bedce..6eaf2f73e49 100644 --- a/examples/build.gradle +++ b/examples/build.gradle @@ -14,6 +14,16 @@ subprojects { mavenCentral() } + test { + defaultCharacterEncoding = "UTF-8" + testLogging { + displayGranularity 1 + showStackTraces = true + exceptionFormat = 'full' + events "STARTED", "PASSED", "FAILED", "SKIPPED" + } + } + checkstyle { toolVersion = "9.3" configFile = rootProject.file('../config/checkstyle/checkstyle.xml') diff --git a/smoke-test/build.gradle b/smoke-test/build.gradle index 830cfaf0b66..d0998b5f9f2 100644 --- a/smoke-test/build.gradle +++ b/smoke-test/build.gradle @@ -14,6 +14,16 @@ subprojects { mavenCentral() } + test { + defaultCharacterEncoding = "UTF-8" + testLogging { + displayGranularity 1 + showStackTraces = true + exceptionFormat = 'full' + events "STARTED", "PASSED", "FAILED", "SKIPPED" + } + } + checkstyle { toolVersion = "9.3" configFile = rootProject.file('../config/checkstyle/checkstyle.xml') From fb511a6511caaa6fa410407908bdf85ba422d930 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:25:52 +0000 Subject: [PATCH 0193/1224] Bump io.lettuce:lettuce-core in /smoke-test Bumps [io.lettuce:lettuce-core](https://github.com/lettuce-io/lettuce-core) from 6.3.2.RELEASE to 6.4.0.RELEASE. - [Release notes](https://github.com/lettuce-io/lettuce-core/releases) - [Changelog](https://github.com/redis/lettuce/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/lettuce-io/lettuce-core/compare/6.3.2.RELEASE...6.4.0.RELEASE) --- updated-dependencies: - dependency-name: io.lettuce:lettuce-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 87f43b7c3b0..2a0bfb73e7c 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.3.2.RELEASE" + api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 08a3e32bb88..12779709f10 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.3.2.RELEASE" + api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index 292d3786851..2f6cf78a6ce 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - api "io.lettuce:lettuce-core:6.3.2.RELEASE" + api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(":spock") testImplementation 'ch.qos.logback:logback-classic:1.3.14' From afb35a405d1890577fbfe93579df205e6b4ee104 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:02 +0000 Subject: [PATCH 0194/1224] Bump org.slf4j:slf4j-api from 1.7.36 to 2.0.16 in /smoke-test Bumps org.slf4j:slf4j-api from 1.7.36 to 2.0.16. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- test-support/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-support/build.gradle b/test-support/build.gradle index 6908ad63ace..1df20ae6fba 100644 --- a/test-support/build.gradle +++ b/test-support/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation 'junit:junit:4.13.2' - implementation 'org.slf4j:slf4j-api:1.7.36' + implementation 'org.slf4j:slf4j-api:2.0.16' testImplementation 'org.assertj:assertj-core:3.26.3' } From 192dbbfed22dd920415992122cf0ef5f2a41787b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:04 +0000 Subject: [PATCH 0195/1224] Bump io.lettuce:lettuce-core in /examples Bumps [io.lettuce:lettuce-core](https://github.com/lettuce-io/lettuce-core) from 6.3.2.RELEASE to 6.4.0.RELEASE. - [Release notes](https://github.com/lettuce-io/lettuce-core/releases) - [Changelog](https://github.com/redis/lettuce/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/lettuce-io/lettuce-core/compare/6.3.2.RELEASE...6.4.0.RELEASE) --- updated-dependencies: - dependency-name: io.lettuce:lettuce-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 87f43b7c3b0..2a0bfb73e7c 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.3.2.RELEASE" + api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 08a3e32bb88..12779709f10 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.3.2.RELEASE" + api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index 292d3786851..2f6cf78a6ce 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - api "io.lettuce:lettuce-core:6.3.2.RELEASE" + api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(":spock") testImplementation 'ch.qos.logback:logback-classic:1.3.14' From a313f35be9898b379df8a1eef54697abb9ec71bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:12 +0000 Subject: [PATCH 0196/1224] Bump org.junit.jupiter:junit-jupiter from 5.10.3 to 5.11.0 in /examples Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/selenium-container/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/spring-boot/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 84a54bce45f..5b3789480ad 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index ebf209b5e7a..c99dceac836 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 283e24f3229..54ae4eee8ff 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 2854790e0a3..6f37a47fde2 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation 'io.nats:jnats:2.19.1' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 7b2225e850e..186a910be2f 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -11,5 +11,5 @@ dependencies { testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 0143eb66423..77fe23ea1c2 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:ollama' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'io.rest-assured:rest-assured:5.5.0' } diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index f41e7524a83..b7d50f16c39 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index 244e9bdc7eb..b7528880ca3 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation 'org.testcontainers:selenium' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 786f0e2d4a9..d8ed52d255f 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index e6b8cfaa142..384c792dc98 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 8f87c69c546..3b61202818e 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/spring-boot/build.gradle b/examples/spring-boot/build.gradle index 8249b18eddc..657b544e119 100644 --- a/examples/spring-boot/build.gradle +++ b/examples/spring-boot/build.gradle @@ -17,7 +17,7 @@ dependencies { runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.testcontainers:postgresql' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index 35bef8255d9..50555fe8f85 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' } test { From c7a056b309228e82a9d236d581e5f59430a02c8c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:15 +0000 Subject: [PATCH 0197/1224] Bump org.junit.jupiter:junit-jupiter-api in /examples Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 08a3e32bb88..df80970335c 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,7 +3,7 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.3.2.RELEASE" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" + testImplementation "org.junit.jupiter:junit-jupiter-api:5.11.0" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") From dad4d9feb5dcccf6f02b4da22daa696cf75aea67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:17 +0000 Subject: [PATCH 0198/1224] Bump org.junit.jupiter:junit-jupiter in /smoke-test Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- smoke-test/turbo-mode/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index 5b2f6ab9625..8a47c80aeee 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' } From 50f43a0c6994a6421e2217641e68d797def9531b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:22 +0000 Subject: [PATCH 0199/1224] Bump redis.clients:jedis from 5.1.3 to 5.1.5 in /examples Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.3 to 5.1.5. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.3...v5.1.5) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index dc07bf0f8c3..d28b2a0cc66 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:5.1.3' + implementation 'redis.clients:jedis:5.1.5' implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index f41e7524a83..2c3c8f72a80 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:5.1.3' + implementation 'redis.clients:jedis:5.1.5' implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index e6b8cfaa142..28805d881cc 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { - implementation 'redis.clients:jedis:5.1.3' + implementation 'redis.clients:jedis:5.1.5' implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From 7ccd076bd7379b4e30862f3c62eace30fb93b02a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:23 +0000 Subject: [PATCH 0200/1224] Bump org.junit.jupiter:junit-jupiter-api in /smoke-test Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 08a3e32bb88..df80970335c 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,7 +3,7 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.3.2.RELEASE" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" + testImplementation "org.junit.jupiter:junit-jupiter-api:5.11.0" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" testImplementation project(":testcontainers") From 23fb2495087f71d4e8b7fe22e4ad945d17b8fb39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 24 Aug 2024 03:26:24 +0000 Subject: [PATCH 0201/1224] Bump org.junit.jupiter:junit-jupiter-engine in /examples Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.10.3 to 5.11.0. - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.3...r5.11.0) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 08a3e32bb88..84e8d6deff7 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation "org.junit.jupiter:junit-jupiter-api:5.10.3" testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.10.3" + testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.11.0" testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") testImplementation 'org.assertj:assertj-core:3.26.3' From 73c1488fc03538bc6ca03a2aa45adeff1744ae87 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:10:11 +0000 Subject: [PATCH 0202/1224] Bump org.postgresql:postgresql in /modules/junit-jupiter Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b13343e30b4..74d22babcd3 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter' - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } From 1dabb2ca2be7e31a300d5e38296cb803eec60913 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:10:16 +0000 Subject: [PATCH 0203/1224] Bump redis.clients:jedis from 5.1.3 to 5.1.5 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.3 to 5.1.5. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.3...v5.1.5) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b13343e30b4..efe0db354ba 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') testImplementation 'com.zaxxer:HikariCP:4.0.3' - testImplementation 'redis.clients:jedis:5.1.3' + testImplementation 'redis.clients:jedis:5.1.5' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From de200bd9e072e56eb73e41b01798ff5b5395bafb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:13:59 +0000 Subject: [PATCH 0204/1224] Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 in /modules/spock Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 eebf30e2e2e..87e33355e17 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'com.zaxxer:HikariCP:4.0.3' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.10.3' From a30c3b755c45df030dd8353b2bdbf9406863d29e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:20:05 +0000 Subject: [PATCH 0205/1224] Bump io.kubernetes:client-java in /modules/k3s Bumps [io.kubernetes:client-java](https://github.com/kubernetes-client/java) from 21.0.0-legacy to 21.0.1-legacy. - [Release notes](https://github.com/kubernetes-client/java/releases) - [Changelog](https://github.com/kubernetes-client/java/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes-client/java/commits) --- updated-dependencies: - dependency-name: io.kubernetes:client-java dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index f0e0f8a9fa1..3f795d99743 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -9,6 +9,6 @@ dependencies { shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.8' testImplementation 'io.fabric8:kubernetes-client:6.13.1' - testImplementation 'io.kubernetes:client-java:21.0.0-legacy' + testImplementation 'io.kubernetes:client-java:21.0.1-legacy' testImplementation 'org.assertj:assertj-core:3.26.3' } From 8c2b193cac4856a9ac21f3940fa65cac6efbdac2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:23:32 +0000 Subject: [PATCH 0206/1224] Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 in /modules/questdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index b2ccaa9dc38..98adb9c40a3 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testImplementation project(':jdbc-test') testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.questdb:questdb:7.3.9' From 5f1fc146c514c9167d6333fa8255214f24796498 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:27:27 +0000 Subject: [PATCH 0207/1224] Bump io.nats:jnats from 2.19.1 to 2.20.2 in /examples Bumps [io.nats:jnats](https://github.com/nats-io/nats.java) from 2.19.1 to 2.20.2. - [Release notes](https://github.com/nats-io/nats.java/releases) - [Changelog](https://github.com/nats-io/nats.java/blob/main/CHANGELOG.md) - [Commits](https://github.com/nats-io/nats.java/compare/2.19.1...2.20.2) --- updated-dependencies: - dependency-name: io.nats:jnats dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/nats/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 2854790e0a3..e5376e754b0 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'io.nats:jnats:2.19.1' + testImplementation 'io.nats:jnats:2.20.2' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' From 42b4bad15e4d83c5afb3c3a7144c554358a951ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:35:59 +0000 Subject: [PATCH 0208/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 12.7.1.jre8-preview to 12.8.1.jre8. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 5249edf9781..257d8954709 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' testImplementation project(':jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.7.1.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8' testImplementation project(':r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' From c67bfa8b4a01337d0064d08161e8624d66359a1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:38:56 +0000 Subject: [PATCH 0209/1224] Bump org.postgresql:postgresql in /modules/cockroachdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cockroachdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 603c9361065..fa1e7f06839 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testImplementation 'org.assertj:assertj-core:3.26.3' } From d971b9dfc7f544f321318e9f7a9145fb725d98c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:46:15 +0000 Subject: [PATCH 0210/1224] Bump org.postgresql:postgresql in /modules/postgresql Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 aa06a2d0249..834656a3dac 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' From 658fd9d32b2a037d5aecf51363996189c333d3e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Aug 2024 22:57:16 +0000 Subject: [PATCH 0211/1224] Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 in /modules/cratedb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index 8240d805b13..9e269731b4b 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' compileOnly 'org.jetbrains:annotations:24.1.0' } From 0217e78eb986da4e73402288959d05f34b37546f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 27 Aug 2024 16:46:33 -0500 Subject: [PATCH 0212/1224] Update ryuk version to 0.9.0 (#9169) --- .../src/main/java/org/testcontainers/utility/RyukContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/utility/RyukContainer.java b/core/src/main/java/org/testcontainers/utility/RyukContainer.java index a4032619ae2..a39b276e56f 100644 --- a/core/src/main/java/org/testcontainers/utility/RyukContainer.java +++ b/core/src/main/java/org/testcontainers/utility/RyukContainer.java @@ -9,7 +9,7 @@ class RyukContainer extends GenericContainer { RyukContainer() { - super("testcontainers/ryuk:0.8.1"); + super("testcontainers/ryuk:0.9.0"); withExposedPorts(8080); withCreateContainerCmdModifier(cmd -> { cmd.withName("testcontainers-ryuk-" + DockerClientFactory.SESSION_ID); From 8e74ac60c9e3ae862967276458ceead7105a26a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Sep 2024 22:16:37 +0000 Subject: [PATCH 0213/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.35.0 to 2.37.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 49842bd274c..7ee0971b251 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation "org.apache.activemq:activemq-client:6.1.2" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.35.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.37.0" } test { From 2f34af252799a7bebc85b966d3c68552d7541fe7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:26:24 +0000 Subject: [PATCH 0214/1224] Bump org.postgresql:postgresql from 42.7.3 to 42.7.4 in /examples Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.3 to 42.7.4. - [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.7.3...REL42.7.4) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 a78c362113a..028e457fc5d 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.36' implementation 'com.squareup.okhttp3:okhttp:4.12.0' implementation 'org.json:json:20240303' - testRuntimeOnly 'org.postgresql:postgresql:42.7.3' + testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:postgresql' testImplementation 'org.assertj:assertj-core:3.26.3' From 6e32062ddb38fb772079306aed8e3d2a53512db5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:28:28 +0000 Subject: [PATCH 0215/1224] Bump com.orientechnologies:orientdb-gremlin in /modules/orientdb Bumps [com.orientechnologies:orientdb-gremlin](https://github.com/orientechnologies/orientdb-gremlin) from 3.2.32 to 3.2.33. - [Commits](https://github.com/orientechnologies/orientdb-gremlin/compare/3.2.32...3.2.33) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-gremlin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index dbe1714cfc5..8c5671a9669 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.32" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.33" } From c2400b00832d480c49166c0d357663253c2a0b20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:28:32 +0000 Subject: [PATCH 0216/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.32 to 3.2.33. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/3.2.33/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.32...3.2.33) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index dbe1714cfc5..3cb0de7ca46 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.32" + api "com.orientechnologies:orientdb-client:3.2.33" testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' From 92ac644b82aeece34d2e0c72443310c8428eac6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:41:01 +0000 Subject: [PATCH 0217/1224] Bump slackapi/slack-github-action from 1.26.0 to 1.27.0 Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 1.26.0 to 1.27.0. - [Release notes](https://github.com/slackapi/slack-github-action/releases) - [Commits](https://github.com/slackapi/slack-github-action/compare/v1.26.0...v1.27.0) --- updated-dependencies: - dependency-name: slackapi/slack-github-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/moby-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index 62ce85b1c9b..7ef7a1c7ff8 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -44,7 +44,7 @@ jobs: - name: Notify to Slack on failures if: failure() id: slack - uses: slackapi/slack-github-action@v1.26.0 + uses: slackapi/slack-github-action@v1.27.0 with: payload: | { From 9ac65272d9741e1a0dc9be49565e4fe5bd28b079 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:47:23 +0000 Subject: [PATCH 0218/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.30.0 to 4.32.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.30.0...4.32.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b19333fa14f..043bc5ec1e6 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter:5.10.3") testImplementation(project(":junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.30.0") + testImplementation("com.hivemq:hivemq-extension-sdk:4.32.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.6") From f29f8288b2d286ad0b538fd2f9e15db7f22c28a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Sep 2024 22:53:05 +0000 Subject: [PATCH 0219/1224] Bump dev.openfga:openfga-sdk from 0.5.0 to 0.7.0 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.5.0 to 0.7.0. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.5.0...v0.7.0) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index e7db231db18..c2e9f67c43d 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'dev.openfga:openfga-sdk:0.5.0' + testImplementation 'dev.openfga:openfga-sdk:0.7.0' } test { From baf3870cefadcf51d280bc75ddcca1b8210283c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:01:53 +0000 Subject: [PATCH 0220/1224] Bump ch.qos.logback:logback-classic in /modules/hivemq Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.6 to 1.5.8. - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.6...v_1.5.8) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b19333fa14f..9c27cc84933 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation("com.hivemq:hivemq-extension-sdk:4.30.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") - testImplementation("ch.qos.logback:logback-classic:1.5.6") + testImplementation("ch.qos.logback:logback-classic:1.5.8") testImplementation 'org.assertj:assertj-core:3.26.3' } From fc2486d804f8de3ed2360ced97a412056e725a33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:10:46 +0000 Subject: [PATCH 0221/1224] Bump com.timeplus:timeplus-native-jdbc in /modules/timeplus Bumps [com.timeplus:timeplus-native-jdbc](https://github.com/timeplus-io/timeplus-native-jdbc) from 2.0.4 to 2.0.5. - [Release notes](https://github.com/timeplus-io/timeplus-native-jdbc/releases) - [Commits](https://github.com/timeplus-io/timeplus-native-jdbc/compare/v2.0.4...v2.0.5) --- updated-dependencies: - dependency-name: com.timeplus:timeplus-native-jdbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/timeplus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index 74570d821c2..007b46e23e4 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -5,6 +5,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.4' + testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.5' testImplementation 'org.assertj:assertj-core:3.26.3' } From a56b412ecfbb129cdf7d2398384a8beb8f1d54f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:27:23 +0000 Subject: [PATCH 0222/1224] Bump org.mongodb:mongodb-driver-sync in /modules/mongodb Bumps [org.mongodb:mongodb-driver-sync](https://github.com/mongodb/mongo-java-driver) from 5.1.2 to 5.1.4. - [Release notes](https://github.com/mongodb/mongo-java-driver/releases) - [Commits](https://github.com/mongodb/mongo-java-driver/compare/r5.1.2...r5.1.4) --- updated-dependencies: - dependency-name: org.mongodb:mongodb-driver-sync dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/mongodb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index 2a4c0b67063..0904df92824 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: MongoDB" dependencies { api project(':testcontainers') - testImplementation("org.mongodb:mongodb-driver-sync:5.1.2") + testImplementation("org.mongodb:mongodb-driver-sync:5.1.4") testImplementation 'org.assertj:assertj-core:3.26.3' } From 3d97ff762099721476f93f5d966087dfb42f91ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 9 Sep 2024 22:52:35 +0000 Subject: [PATCH 0223/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.13.2 to 1.13.4. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.13.2...v1.13.4) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 565a1ee60e8..550779c4d55 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.2' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' } From e3653fd7211acccd82eddcb36c71705e18a550a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:05:12 +0000 Subject: [PATCH 0224/1224] Bump gradle-update/update-gradle-wrapper-action from 1.0.20 to 2.0.0 Bumps [gradle-update/update-gradle-wrapper-action](https://github.com/gradle-update/update-gradle-wrapper-action) from 1.0.20 to 2.0.0. - [Release notes](https://github.com/gradle-update/update-gradle-wrapper-action/releases) - [Changelog](https://github.com/gradle-update/update-gradle-wrapper-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/gradle-update/update-gradle-wrapper-action/compare/0407394b9d173dfc9cf5695f9f560fef6d61a5fe...9268373d69bd0974b6318eb3b512b8e025060bbe) --- updated-dependencies: - dependency-name: gradle-update/update-gradle-wrapper-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/update-gradle-wrapper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index a6d7423d9c3..b69353a6ab5 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - name: Update Gradle Wrapper - uses: gradle-update/update-gradle-wrapper-action@0407394b9d173dfc9cf5695f9f560fef6d61a5fe # v1.0.13 + uses: gradle-update/update-gradle-wrapper-action@9268373d69bd0974b6318eb3b512b8e025060bbe # v1.0.13 with: repo-token: ${{ secrets.GITHUB_TOKEN }} labels: dependencies From ca29e2079d4294ee4e195c632b6b652c7d221958 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:11:07 +0000 Subject: [PATCH 0225/1224] Bump com.rabbitmq:amqp-client from 5.21.0 to 5.22.0 in /core Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.21.0 to 5.22.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.21.0...v5.22.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 7ab2408fe05..633e40ee64b 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -111,7 +111,7 @@ dependencies { } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'redis.clients:jedis:5.1.3' - testImplementation 'com.rabbitmq:amqp-client:5.21.0' + testImplementation 'com.rabbitmq:amqp-client:5.22.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From c15da3910ceca9199bd6cc78c5a47d3b4226be48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:12:37 +0000 Subject: [PATCH 0226/1224] Bump org.elasticsearch.client:transport in /modules/elasticsearch Bumps [org.elasticsearch.client:transport](https://github.com/elastic/elasticsearch) from 7.17.22 to 7.17.24. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v7.17.22...v7.17.24) --- updated-dependencies: - dependency-name: org.elasticsearch.client:transport dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 a6ad2e8ed3f..65c3b08ef0b 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.14.3" - testImplementation "org.elasticsearch.client:transport:7.17.22" + testImplementation "org.elasticsearch.client:transport:7.17.24" testImplementation 'org.assertj:assertj-core:3.26.3' } From 9e2f7ec743182f64c29deebcd4bacc83dd07b940 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:19:21 +0000 Subject: [PATCH 0227/1224] Bump com.rabbitmq:amqp-client from 5.21.0 to 5.22.0 in /modules/rabbitmq Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.21.0 to 5.22.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.21.0...v5.22.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index f8959b6c5ea..42a12d68759 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testImplementation 'com.rabbitmq:amqp-client:5.21.0' + testImplementation 'com.rabbitmq:amqp-client:5.22.0' testImplementation 'org.assertj:assertj-core:3.26.3' compileOnly 'org.jetbrains:annotations:24.1.0' } From d24832a1b954671df33887b9b26cf310376aa7dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:38:38 +0000 Subject: [PATCH 0228/1224] Bump com.amazonaws:aws-java-sdk-dynamodb in /modules/dynalite Bumps [com.amazonaws:aws-java-sdk-dynamodb](https://github.com/aws/aws-sdk-java) from 1.12.765 to 1.12.772. - [Changelog](https://github.com/aws/aws-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/aws/aws-sdk-java/compare/1.12.765...1.12.772) --- updated-dependencies: - dependency-name: com.amazonaws:aws-java-sdk-dynamodb dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/dynalite/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/dynalite/build.gradle b/modules/dynalite/build.gradle index 0c7c0c67793..d8fe2377b76 100644 --- a/modules/dynalite/build.gradle +++ b/modules/dynalite/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Dynalite (deprecated)" dependencies { api project(':testcontainers') - compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.765' - testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.765' + compileOnly 'com.amazonaws:aws-java-sdk-dynamodb:1.12.772' + testImplementation 'com.amazonaws:aws-java-sdk-dynamodb:1.12.772' testImplementation 'org.assertj:assertj-core:3.26.3' } From 9c2ef47a425cac54b0ead2c3a91db396b87cc8d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:42:01 +0000 Subject: [PATCH 0229/1224] Bump com.azure:azure-cosmos from 4.62.0 to 4.63.3 in /modules/azure Bumps [com.azure:azure-cosmos](https://github.com/Azure/azure-sdk-for-java) from 4.62.0 to 4.63.3. - [Release notes](https://github.com/Azure/azure-sdk-for-java/releases) - [Commits](https://github.com/Azure/azure-sdk-for-java/compare/azure-cosmos_4.62.0...azure-cosmos_4.63.3) --- updated-dependencies: - dependency-name: com.azure:azure-cosmos dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 81931707562..d31a549abe5 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -6,5 +6,5 @@ dependencies { shaded 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'com.azure:azure-cosmos:4.62.0' + testImplementation 'com.azure:azure-cosmos:4.63.3' } From a74291525677b1a0ac562f259c87069bc46282a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:51:03 +0000 Subject: [PATCH 0230/1224] Bump com.gradle.enterprise:com.gradle.enterprise.gradle.plugin Bumps com.gradle.enterprise:com.gradle.enterprise.gradle.plugin from 3.17.6 to 3.18.1. --- updated-dependencies: - dependency-name: com.gradle.enterprise:com.gradle.enterprise.gradle.plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 5838b93507b..5d8ea6e2d76 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,7 +5,7 @@ buildscript { } } dependencies { - classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.17.6" + classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.18.1" classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.2" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } From 85fc33c29047e7c1c3377cc29d0326c4b5ab8e07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:54:31 +0000 Subject: [PATCH 0231/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.6.8 to 3.6.10. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.6.8...v3.6.10) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index a1c68855d55..a440af1dc97 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -15,6 +15,6 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.6.8' + testFixturesImplementation 'io.projectreactor:reactor-core:3.6.10' testFixturesImplementation 'org.assertj:assertj-core:3.26.3' } From f2ed9e06773e8f8894f9691cf52a94277276d9cb Mon Sep 17 00:00:00 2001 From: Andrei Nevedomskii Date: Tue, 17 Sep 2024 19:26:21 +0200 Subject: [PATCH 0232/1224] Fix no match for platform in manifest when containerd is enabled using Docker Desktop (#9200) --- .../main/java/org/testcontainers/images/RemoteDockerImage.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java index af3ed08984a..e97b4afad23 100644 --- a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java +++ b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java @@ -4,6 +4,7 @@ import com.github.dockerjava.api.command.PullImageCmd; import com.github.dockerjava.api.exception.DockerClientException; import com.github.dockerjava.api.exception.InternalServerErrorException; +import com.github.dockerjava.api.exception.NotFoundException; import com.google.common.util.concurrent.Futures; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -155,7 +156,7 @@ private TimeLimitedLoggedPullImageResultCallback pullImage(PullImageCmd pullImag throws InterruptedException { try { return pullImageCmd.exec(new TimeLimitedLoggedPullImageResultCallback(logger)).awaitCompletion(); - } catch (DockerClientException e) { + } catch (DockerClientException | NotFoundException e) { // Try to fallback to x86 return pullImageCmd .withPlatform("linux/amd64") From bd0b75fa0f1011d3251f53c902eef02addc4b0ee Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 18 Sep 2024 04:39:58 +0800 Subject: [PATCH 0233/1224] Add module for Databend (#9148) --- .github/ISSUE_TEMPLATE/bug_report.yaml | 1 + .github/ISSUE_TEMPLATE/enhancement.yaml | 1 + .github/ISSUE_TEMPLATE/feature.yaml | 1 + .github/dependabot.yml | 4 + .github/labeler.yml | 4 + .github/settings.yml | 3 + docs/modules/databases/databend.md | 24 ++++ mkdocs.yml | 1 + modules/databend/build.gradle | 9 ++ .../databend/DatabendContainer.java | 112 ++++++++++++++++++ .../databend/DatabendContainerProvider.java | 28 +++++ ...s.containers.JdbcDatabaseContainerProvider | 1 + .../databend/DatabendContainerTest.java | 41 +++++++ .../databend/DatabendJDBCDriverTest.java | 21 ++++ .../src/test/resources/logback-test.xml | 16 +++ 15 files changed, 267 insertions(+) create mode 100644 docs/modules/databases/databend.md create mode 100644 modules/databend/build.gradle create mode 100644 modules/databend/src/main/java/org/testcontainers/databend/DatabendContainer.java create mode 100644 modules/databend/src/main/java/org/testcontainers/databend/DatabendContainerProvider.java create mode 100644 modules/databend/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider create mode 100644 modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java create mode 100644 modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java create mode 100644 modules/databend/src/test/resources/logback-test.xml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml index 284e2c561fb..4251a2db853 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yaml +++ b/.github/ISSUE_TEMPLATE/bug_report.yaml @@ -23,6 +23,7 @@ body: - Consul - Couchbase - CrateDB + - Databend - DB2 - Dynalite - Elasticsearch diff --git a/.github/ISSUE_TEMPLATE/enhancement.yaml b/.github/ISSUE_TEMPLATE/enhancement.yaml index 2ca7de6bc3c..24d6b33ffdd 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yaml +++ b/.github/ISSUE_TEMPLATE/enhancement.yaml @@ -23,6 +23,7 @@ body: - Consul - Couchbase - CrateDB + - Databend - DB2 - Dynalite - Elasticsearch diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 311ec8ca2c6..d36532b7d9d 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -23,6 +23,7 @@ body: - CrateDB - Consul - Couchbase + - Databend - DB2 - Dynalite - Elasticsearch diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 0239be10168..22977397e03 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -90,6 +90,10 @@ updates: directory: "/modules/database-commons" schedule: interval: "weekly" + - package-ecosystem: "gradle" + directory: "/modules/databend" + schedule: + interval: "weekly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/db2" diff --git a/.github/labeler.yml b/.github/labeler.yml index 875e996c428..e88811fd50a 100644 --- a/.github/labeler.yml +++ b/.github/labeler.yml @@ -55,6 +55,10 @@ - changed-files: - any-glob-to-any-file: - modules/cratedb/**/* +"modules/databend": + - changed-files: + - any-glob-to-any-file: + - modules/databend/**/* "modules/db2": - changed-files: - any-glob-to-any-file: diff --git a/.github/settings.yml b/.github/settings.yml index 06b1c06e72f..d02aee1c7da 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -271,6 +271,9 @@ labels: - name: modules/yugabytedb color: '#006b75' + - name: modules/databend + color: '#006b75' + - name: os/linux color: '#1d76db' diff --git a/docs/modules/databases/databend.md b/docs/modules/databases/databend.md new file mode 100644 index 00000000000..c399dc2bb51 --- /dev/null +++ b/docs/modules/databases/databend.md @@ -0,0 +1,24 @@ +# Databend Module + +## Adding this module to your project dependencies + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" + ```groovy + testImplementation "org.testcontainers:databend:{{latest_version}}" + ``` + +=== "Maven" + ```xml + + org.testcontainers + databend + {{latest_version}} + test + + ``` + +!!! hint +Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency. + diff --git a/mkdocs.yml b/mkdocs.yml index 2e1c60c7dcc..f3cd49bab30 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -56,6 +56,7 @@ nav: - modules/databases/couchbase.md - modules/databases/clickhouse.md - modules/databases/cratedb.md + - modules/databases/databend.md - modules/databases/db2.md - modules/databases/dynalite.md - modules/databases/influxdb.md diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle new file mode 100644 index 00000000000..81cc9ef2cbe --- /dev/null +++ b/modules/databend/build.gradle @@ -0,0 +1,9 @@ +description = "Testcontainers :: JDBC :: Databend" + +dependencies { + api project(':jdbc') + + testImplementation project(':jdbc-test') + testRuntimeOnly 'com.databend:databend-jdbc:0.2.9' + testImplementation 'org.assertj:assertj-core:3.26.3' +} diff --git a/modules/databend/src/main/java/org/testcontainers/databend/DatabendContainer.java b/modules/databend/src/main/java/org/testcontainers/databend/DatabendContainer.java new file mode 100644 index 00000000000..389c8c44963 --- /dev/null +++ b/modules/databend/src/main/java/org/testcontainers/databend/DatabendContainer.java @@ -0,0 +1,112 @@ +package org.testcontainers.databend; + +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +import java.util.HashSet; +import java.util.Set; + +/** + * Testcontainers implementation for Databend. + *

    + * Supported image: {@code datafuselabs/databend} + *

    + * Exposed ports: + *

      + *
    • Database: 8000
    • + *
    + */ +public class DatabendContainer extends JdbcDatabaseContainer { + + static final String NAME = "databend"; + + static final DockerImageName DOCKER_IMAGE_NAME = DockerImageName.parse("datafuselabs/databend"); + + private static final Integer HTTP_PORT = 8000; + + private static final String DRIVER_CLASS_NAME = "com.databend.jdbc.DatabendDriver"; + + private static final String JDBC_URL_PREFIX = "jdbc:" + NAME + "://"; + + private static final String TEST_QUERY = "SELECT 1"; + + private String databaseName = "default"; + + private String username = "databend"; + + private String password = "databend"; + + public DatabendContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public DatabendContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DOCKER_IMAGE_NAME); + + addExposedPorts(HTTP_PORT); + waitingFor(Wait.forHttp("/").forResponsePredicate(response -> response.equals("Ok."))); + } + + @Override + protected void configure() { + withEnv("QUERY_DEFAULT_USER", this.username); + withEnv("QUERY_DEFAULT_PASSWORD", this.password); + } + + @Override + public Set getLivenessCheckPortNumbers() { + return new HashSet<>(getMappedPort(HTTP_PORT)); + } + + @Override + public String getDriverClassName() { + return DRIVER_CLASS_NAME; + } + + @Override + public String getJdbcUrl() { + return ( + JDBC_URL_PREFIX + + getHost() + + ":" + + getMappedPort(HTTP_PORT) + + "/" + + this.databaseName + + constructUrlParameters("?", "&") + ); + } + + @Override + public String getUsername() { + return this.username; + } + + @Override + public String getPassword() { + return this.password; + } + + @Override + public String getDatabaseName() { + return this.databaseName; + } + + @Override + public String getTestQueryString() { + return TEST_QUERY; + } + + @Override + public DatabendContainer withUsername(String username) { + this.username = username; + return this; + } + + @Override + public DatabendContainer withPassword(String password) { + this.password = password; + return this; + } +} diff --git a/modules/databend/src/main/java/org/testcontainers/databend/DatabendContainerProvider.java b/modules/databend/src/main/java/org/testcontainers/databend/DatabendContainerProvider.java new file mode 100644 index 00000000000..9142bebcfd3 --- /dev/null +++ b/modules/databend/src/main/java/org/testcontainers/databend/DatabendContainerProvider.java @@ -0,0 +1,28 @@ +package org.testcontainers.databend; + +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.JdbcDatabaseContainerProvider; + +public class DatabendContainerProvider extends JdbcDatabaseContainerProvider { + + private static final String DEFAULT_TAG = "v1.2.615"; + + @Override + public boolean supports(String databaseType) { + return databaseType.equals(DatabendContainer.NAME); + } + + @Override + public JdbcDatabaseContainer newInstance() { + return newInstance(DEFAULT_TAG); + } + + @Override + public JdbcDatabaseContainer newInstance(String tag) { + if (tag != null) { + return new DatabendContainer(DatabendContainer.DOCKER_IMAGE_NAME.withTag(tag)); + } else { + return newInstance(); + } + } +} diff --git a/modules/databend/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider b/modules/databend/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider new file mode 100644 index 00000000000..ead69e77bee --- /dev/null +++ b/modules/databend/src/main/resources/META-INF/services/org.testcontainers.containers.JdbcDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.databend.DatabendContainerProvider diff --git a/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java b/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java new file mode 100644 index 00000000000..92f4842d119 --- /dev/null +++ b/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java @@ -0,0 +1,41 @@ +package org.testcontainers.databend; + +import org.junit.Test; +import org.testcontainers.db.AbstractContainerDatabaseTest; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DatabendContainerTest extends AbstractContainerDatabaseTest { + + @Test + public void testSimple() throws SQLException { + try (DatabendContainer databend = new DatabendContainer("datafuselabs/databend:v1.2.615")) { + databend.start(); + + ResultSet resultSet = performQuery(databend, "SELECT 1"); + + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).isEqualTo(1); + } + } + + @Test + public void customCredentialsWithUrlParams() throws SQLException { + try ( + DatabendContainer databend = new DatabendContainer("datafuselabs/databend:v1.2.615") + .withUsername("test") + .withPassword("test") + .withUrlParam("ssl", "false") + ) { + databend.start(); + + ResultSet resultSet = performQuery(databend, "SELECT 1;"); + + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).isEqualTo(1); + } + } +} diff --git a/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java b/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java new file mode 100644 index 00000000000..a36039dc8d1 --- /dev/null +++ b/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java @@ -0,0 +1,21 @@ +package org.testcontainers.databend; + +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.testcontainers.jdbc.AbstractJDBCDriverTest; + +import java.util.Arrays; +import java.util.EnumSet; + +@RunWith(Parameterized.class) +public class DatabendJDBCDriverTest extends AbstractJDBCDriverTest { + + @Parameterized.Parameters(name = "{index} - {0}") + public static Iterable data() { + return Arrays.asList( + new Object[][] { // + { "jdbc:tc:databend://hostname/databasename", EnumSet.of(Options.PmdKnownBroken) }, + } + ); + } +} diff --git a/modules/databend/src/test/resources/logback-test.xml b/modules/databend/src/test/resources/logback-test.xml new file mode 100644 index 00000000000..83ef7a1a3ef --- /dev/null +++ b/modules/databend/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + %d{HH:mm:ss.SSS} %-5level %logger - %msg%n + + + + + + + + + From c4807805f4281e26e1874858ae8e5b5474569363 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 20:40:25 +0000 Subject: [PATCH 0234/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 10.1.26 to 10.1.30. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 36d832aefa5..2b2868ebbc6 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:24.1.0' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:25.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:10.1.26' + testImplementation 'org.apache.tomcat:tomcat-jdbc:10.1.30' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation ('org.mockito:mockito-core:4.11.0') { From 031fd06a20cc6cfb3e9a428e7adc038f5abfda96 Mon Sep 17 00:00:00 2001 From: Jake W Date: Thu, 19 Sep 2024 22:22:54 +0800 Subject: [PATCH 0235/1224] Fix gcloud docs (#9246) --- docs/modules/gcloud.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index 31542a5d387..049931b3be1 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -111,7 +111,7 @@ Create a test Database in the Emulator: And test against the Emulator: -[Testing with a Firestore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) inside_block:testWithEmulatorContainer +[Testing with a Spanner Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) inside_block:testWithEmulatorContainer See more examples: From f763945ad79b5c3f64865ce19755361250d82832 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 19 Sep 2024 11:04:26 -0500 Subject: [PATCH 0236/1224] Fix register listeners in RedpandaContainer (#9247) Previously, RedpandaContainer allowed to register a new listener using a Supplier and the new listener's host was also added as a network alias. However, if the listener's host was an IP the listener configuration was wrong and didn't allow to connect to the broker. --- docs/modules/redpanda.md | 20 ++++ modules/redpanda/build.gradle | 1 + .../redpanda/RedpandaContainer.java | 108 +++++++++++++++++- .../testcontainers/redpanda.yaml.ftl | 11 ++ .../redpanda/AbstractRedpanda.java | 19 +-- .../redpanda/RedpandaContainerTest.java | 62 +++++++++- 6 files changed, 197 insertions(+), 24 deletions(-) diff --git a/docs/modules/redpanda.md b/docs/modules/redpanda.md index 22545ffb026..2ce4a284836 100644 --- a/docs/modules/redpanda.md +++ b/docs/modules/redpanda.md @@ -63,6 +63,26 @@ Client using the new registered listener: [Produce/Consume via new listener](../../modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java) inside_block:produceConsumeMessage +The following examples shows how to register a proxy as a new listener in `RedpandaContainer`: + +Use `SocatContainer` to create the proxy + + +[Create Proxy](../../modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java) inside_block:createProxy + + +Register the listener and advertised listener + + +[Register Listener](../../modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java) inside_block:registerListenerAndAdvertisedListener + + +Client using the new registered listener: + + +[Produce/Consume via new listener](../../modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java) inside_block:produceConsumeMessageFromProxy + + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index bffcc8b133a..56bf81761b4 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -7,4 +7,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'org.awaitility:awaitility:4.2.0' } diff --git a/modules/redpanda/src/main/java/org/testcontainers/redpanda/RedpandaContainer.java b/modules/redpanda/src/main/java/org/testcontainers/redpanda/RedpandaContainer.java index 8960487e39b..a7cfc245d95 100644 --- a/modules/redpanda/src/main/java/org/testcontainers/redpanda/RedpandaContainer.java +++ b/modules/redpanda/src/main/java/org/testcontainers/redpanda/RedpandaContainer.java @@ -71,8 +71,11 @@ public class RedpandaContainer extends GenericContainer { private final List superusers = new ArrayList<>(); + @Deprecated private final Set> listenersValueSupplier = new HashSet<>(); + private final Map> listeners = new HashMap<>(); + public RedpandaContainer(String image) { this(DockerImageName.parse(image)); } @@ -109,6 +112,7 @@ protected void configure() { .map(Supplier::get) .map(Listener::getAddress) .forEach(this::withNetworkAliases); + this.listeners.keySet().stream().map(listener -> listener.split(":")[0]).forEach(this::withNetworkAliases); } @SneakyThrows @@ -212,13 +216,74 @@ public RedpandaContainer withSuperuser(String username) { * * @param listenerSupplier a supplier that will provide a listener * @return this {@link RedpandaContainer} instance + * @deprecated use {@link #withListener(String, Supplier)} instead */ + @Deprecated public RedpandaContainer withListener(Supplier listenerSupplier) { String[] parts = listenerSupplier.get().split(":"); this.listenersValueSupplier.add(() -> new Listener(parts[0], Integer.parseInt(parts[1]))); return this; } + /** + * Add a listener in the format {@code host:port}. + * Host will be included as a network alias. + *

    + * Use it to register additional connections to the Kafka broker within the same container network. + *

    + * The listener will be added to the list of default listeners. + *

    + * Default listeners: + *

      + *
    • 0.0.0.0:9092
    • + *
    • 0.0.0.0:9093
    • + *
    + *

    + * The listener will be added to the list of default advertised listeners. + *

    + * Default advertised listeners: + *

      + *
    • {@code container.getConfig().getHostName():9092}
    • + *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    + * @param listener a listener with format {@code host:port} + * @return this {@link RedpandaContainer} instance + */ + public RedpandaContainer withListener(String listener) { + this.listeners.put(listener, () -> listener); + return this; + } + + /** + * Add a listener in the format {@code host:port} and a {@link Supplier} for the advertised listener. + * Host from listener will be included as a network alias. + *

    + * Use it to register additional connections to the Kafka broker from outside the container network + *

    + * The listener will be added to the list of default listeners. + *

    + * Default listeners: + *

      + *
    • 0.0.0.0:9092
    • + *
    • 0.0.0.0:9093
    • + *
    + *

    + * The {@link Supplier} will be added to the list of default advertised listeners. + *

    + * Default advertised listeners: + *

      + *
    • {@code container.getConfig().getHostName():9092}
    • + *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    + * @param listener a supplier that will provide a listener + * @param advertisedListener a supplier that will provide a listener + * @return this {@link RedpandaContainer} instance + */ + public RedpandaContainer withListener(String listener, Supplier advertisedListener) { + this.listeners.put(listener, advertisedListener); + return this; + } + private Transferable getBootstrapFile(Configuration cfg) { Map kafkaApi = new HashMap<>(); kafkaApi.put("enableAuthorization", this.enableAuthorization); @@ -233,6 +298,12 @@ private Transferable getBootstrapFile(Configuration cfg) { } private Transferable getRedpandaFile(Configuration cfg) { + Map kafkaApi = new HashMap<>(); + kafkaApi.put("authenticationMethod", this.authenticationMethod); + kafkaApi.put("enableAuthorization", this.enableAuthorization); + kafkaApi.put("advertisedHost", getHost()); + kafkaApi.put("advertisedPort", getMappedPort(9092)); + List> listeners = this.listenersValueSupplier.stream() .map(Supplier::get) @@ -244,19 +315,44 @@ private Transferable getRedpandaFile(Configuration cfg) { return listenerMap; }) .collect(Collectors.toList()); - - Map kafkaApi = new HashMap<>(); - kafkaApi.put("authenticationMethod", this.authenticationMethod); - kafkaApi.put("enableAuthorization", this.enableAuthorization); - kafkaApi.put("advertisedHost", getHost()); - kafkaApi.put("advertisedPort", getMappedPort(9092)); kafkaApi.put("listeners", listeners); + List> kafkaListeners = + this.listeners.keySet() + .stream() + .map(listener -> { + Map listenerMap = new HashMap<>(); + listenerMap.put("name", listener.split(":")[0]); + listenerMap.put("address", listener.split(":")[0]); + listenerMap.put("port", listener.split(":")[1]); + listenerMap.put("authentication_method", this.authenticationMethod); + return listenerMap; + }) + .collect(Collectors.toList()); + + List> kafkaAdvertisedListeners = + this.listeners.entrySet() + .stream() + .map(entry -> { + String advertisedListener = entry.getValue().get(); + Map listenerMap = new HashMap<>(); + listenerMap.put("name", entry.getKey().split(":")[0]); + listenerMap.put("address", advertisedListener.split(":")[0]); + listenerMap.put("port", advertisedListener.split(":")[1]); + return listenerMap; + }) + .collect(Collectors.toList()); + + Map kafka = new HashMap<>(); + kafka.put("listeners", kafkaListeners); + kafka.put("advertisedListeners", kafkaAdvertisedListeners); + Map schemaRegistry = new HashMap<>(); schemaRegistry.put("authenticationMethod", this.schemaRegistryAuthenticationMethod); Map root = new HashMap<>(); root.put("kafkaApi", kafkaApi); + root.put("kafka", kafka); root.put("schemaRegistry", schemaRegistry); String file = resolveTemplate(cfg, "redpanda.yaml.ftl", root); diff --git a/modules/redpanda/src/main/resources/testcontainers/redpanda.yaml.ftl b/modules/redpanda/src/main/resources/testcontainers/redpanda.yaml.ftl index 457a3738652..80fb3c09418 100644 --- a/modules/redpanda/src/main/resources/testcontainers/redpanda.yaml.ftl +++ b/modules/redpanda/src/main/resources/testcontainers/redpanda.yaml.ftl @@ -27,6 +27,12 @@ redpanda: port: ${listener.port} authentication_method: ${listener.authentication_method} +<#list kafka.listeners as listener> + - address: ${listener.address} + name: ${listener.name} + port: ${listener.port} + authentication_method: ${listener.authentication_method} + advertised_kafka_api: - address: ${ kafkaApi.advertisedHost } @@ -40,6 +46,11 @@ redpanda: name: ${listener.address} port: ${listener.port} +<#list kafka.advertisedListeners as listener> + - address: ${listener.address} + name: ${listener.name} + port: ${listener.port} + schema_registry: schema_registry_api: diff --git a/modules/redpanda/src/test/java/org/testcontainers/redpanda/AbstractRedpanda.java b/modules/redpanda/src/test/java/org/testcontainers/redpanda/AbstractRedpanda.java index 35998e8e8fa..ce985a59fdb 100644 --- a/modules/redpanda/src/test/java/org/testcontainers/redpanda/AbstractRedpanda.java +++ b/modules/redpanda/src/test/java/org/testcontainers/redpanda/AbstractRedpanda.java @@ -13,7 +13,7 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; -import org.rnorth.ducttape.unreliables.Unreliables; +import org.awaitility.Awaitility; import java.time.Duration; import java.util.Collection; @@ -67,24 +67,17 @@ protected void testKafkaFunctionality(String bootstrapServers, int partitions, i producer.send(new ProducerRecord<>(topicName, "testcontainers", "rulezzz")).get(); - Unreliables.retryUntilTrue( - 10, - TimeUnit.SECONDS, - () -> { + Awaitility + .await() + .atMost(Duration.ofSeconds(10)) + .untilAsserted(() -> { ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); - if (records.isEmpty()) { - return false; - } - assertThat(records) .hasSize(1) .extracting(ConsumerRecord::topic, ConsumerRecord::key, ConsumerRecord::value) .containsExactly(tuple(topicName, "testcontainers", "rulezzz")); - - return true; - } - ); + }); consumer.unsubscribe(); } diff --git a/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java b/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java index d0df2d7c95b..dcdaad4da28 100644 --- a/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java +++ b/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java @@ -15,6 +15,7 @@ import org.junit.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; +import org.testcontainers.containers.SocatContainer; import org.testcontainers.images.builder.Transferable; import org.testcontainers.utility.DockerImageName; @@ -114,10 +115,37 @@ public void testSchemaRegistry() { public void testUsageWithListener() throws Exception { try ( Network network = Network.newNetwork(); - // registerListener { RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") .withListener(() -> "redpanda:19092") .withNetwork(network); + GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") + .withCreateContainerCmdModifier(cmd -> { + cmd.withEntrypoint("sh"); + }) + .withCopyToContainer(Transferable.of("Message produced by kcat"), "/data/msgs.txt") + .withNetwork(network) + .withCommand("-c", "tail -f /dev/null") + ) { + redpanda.start(); + kcat.start(); + + kcat.execInContainer("kcat", "-b", "redpanda:19092", "-t", "msgs", "-P", "-l", "/data/msgs.txt"); + String stdout = kcat + .execInContainer("kcat", "-b", "redpanda:19092", "-C", "-t", "msgs", "-c", "1") + .getStdout(); + + assertThat(stdout).contains("Message produced by kcat"); + } + } + + @Test + public void testUsageWithListenerInTheSameNetwork() throws Exception { + try ( + Network network = Network.newNetwork(); + // registerListener { + RedpandaContainer kafka = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") + .withListener("kafka:19092") + .withNetwork(network); // } // createKCatContainer { GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") @@ -129,18 +157,42 @@ public void testUsageWithListener() throws Exception { .withCommand("-c", "tail -f /dev/null") // } ) { - redpanda.start(); + kafka.start(); kcat.start(); + // produceConsumeMessage { - kcat.execInContainer("kcat", "-b", "redpanda:19092", "-t", "msgs", "-P", "-l", "/data/msgs.txt"); + kcat.execInContainer("kcat", "-b", "kafka:19092", "-t", "msgs", "-P", "-l", "/data/msgs.txt"); String stdout = kcat - .execInContainer("kcat", "-b", "redpanda:19092", "-C", "-t", "msgs", "-c", "1") + .execInContainer("kcat", "-b", "kafka:19092", "-C", "-t", "msgs", "-c", "1") .getStdout(); // } + assertThat(stdout).contains("Message produced by kcat"); } } + @Test + public void testUsageWithListenerFromProxy() throws Exception { + try ( + Network network = Network.newNetwork(); + // createProxy { + SocatContainer socat = new SocatContainer().withNetwork(network).withTarget(2000, "kafka", 19092); + // } + // registerListenerAndAdvertisedListener { + RedpandaContainer kafka = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") + .withListener("kafka:19092", () -> socat.getHost() + ":" + socat.getMappedPort(2000)) + .withNetwork(network) + // } + ) { + socat.start(); + kafka.start(); + // produceConsumeMessageFromProxy { + String bootstrapServers = String.format("%s:%s", socat.getHost(), socat.getMappedPort(2000)); + testKafkaFunctionality(bootstrapServers); + // } + } + } + @Test public void testUsageWithListenerAndSasl() throws Exception { final String username = "panda"; @@ -153,7 +205,7 @@ public void testUsageWithListenerAndSasl() throws Exception { .enableAuthorization() .enableSasl() .withSuperuser("panda") - .withListener(() -> "my-panda:29092") + .withListener("my-panda:29092") .withNetwork(network); GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") .withCreateContainerCmdModifier(cmd -> { From 1231a1269c77c41587364dd727e80c9c0b55fcea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 19 Sep 2024 12:10:42 -0500 Subject: [PATCH 0237/1224] Use awaitility in Kafka module (#9248) Remove usage of `Unreliables` from `duct-tape` lib. --- modules/kafka/build.gradle | 1 + .../org/testcontainers/AbstractKafka.java | 19 ++++++------------- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/modules/kafka/build.gradle b/modules/kafka/build.gradle index 554275a2037..176fe253375 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -6,4 +6,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' + testImplementation 'org.awaitility:awaitility:4.2.0' } diff --git a/modules/kafka/src/test/java/org/testcontainers/AbstractKafka.java b/modules/kafka/src/test/java/org/testcontainers/AbstractKafka.java index f7e9dcedb30..7fc5bb3851e 100644 --- a/modules/kafka/src/test/java/org/testcontainers/AbstractKafka.java +++ b/modules/kafka/src/test/java/org/testcontainers/AbstractKafka.java @@ -14,7 +14,7 @@ import org.apache.kafka.common.config.SaslConfigs; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; -import org.rnorth.ducttape.unreliables.Unreliables; +import org.awaitility.Awaitility; import java.time.Duration; import java.util.Collection; @@ -101,24 +101,17 @@ protected void testKafkaFunctionality(String bootstrapServers, boolean authentic producer.send(new ProducerRecord<>(topicName, "testcontainers", "rulezzz")).get(); - Unreliables.retryUntilTrue( - 10, - TimeUnit.SECONDS, - () -> { + Awaitility + .await() + .atMost(Duration.ofSeconds(10)) + .untilAsserted(() -> { ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); - if (records.isEmpty()) { - return false; - } - assertThat(records) .hasSize(1) .extracting(ConsumerRecord::topic, ConsumerRecord::key, ConsumerRecord::value) .containsExactly(tuple(topicName, "testcontainers", "rulezzz")); - - return true; - } - ); + }); consumer.unsubscribe(); } From d90623da2160b60379e718e5c073914201cb2a93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 19 Sep 2024 12:54:40 -0500 Subject: [PATCH 0238/1224] Update redis version to 5.1.3 (#9250) --- modules/toxiproxy/build.gradle | 2 +- .../test/java/org/testcontainers/containers/ToxiproxyTest.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 95cc199dca1..84eeb74603d 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' - testImplementation 'redis.clients:jedis:3.0.1' + testImplementation 'redis.clients:jedis:5.1.3' testImplementation 'org.assertj:assertj-core:3.26.3' } 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 b3caaf4f083..bb941640055 100644 --- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java +++ b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java @@ -104,6 +104,7 @@ public void testConnectionCut() throws IOException { proxy.toxics().get("CUT_CONNECTION_DOWNSTREAM").remove(); proxy.toxics().get("CUT_CONNECTION_UPSTREAM").remove(); + jedis.close(); // and with the connection re-established, expect success assertThat(jedis.get("somekey")) .as("access to the container works OK after re-establishing the connection") From d2beecb9176835a0aa70e41c7b72e81b09316432 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 17:55:59 +0000 Subject: [PATCH 0239/1224] Bump redis.clients:jedis from 3.0.1 to 5.1.5 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 3.0.1 to 5.1.5. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/jedis-3.0.1...v5.1.5) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 84eeb74603d..211d5e38ae3 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' - testImplementation 'redis.clients:jedis:5.1.3' + testImplementation 'redis.clients:jedis:5.1.5' testImplementation 'org.assertj:assertj-core:3.26.3' } From 751aa4eee75aa135d365647d8b0b32347f98151d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 19 Sep 2024 18:40:51 -0500 Subject: [PATCH 0240/1224] Update MSSQL images to execute in ubuntu-22.04 (#9254) --- .../src/test/java/org/testcontainers/MSSQLServerTestImages.java | 2 +- .../containers/MSSQLR2DBCDatabaseContainerTest.java | 2 +- .../jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java | 2 +- .../junit/mssqlserver/CustomizableMSSQLServerTest.java | 2 +- .../src/test/resources/container-license-acceptance.txt | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java b/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java index 0cec042e19f..804691e2baf 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/MSSQLServerTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface MSSQLServerTestImages { - DockerImageName MSSQL_SERVER_IMAGE = DockerImageName.parse("mcr.microsoft.com/mssql/server:2017-CU12"); + DockerImageName MSSQL_SERVER_IMAGE = DockerImageName.parse("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04"); } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java index 8c0c9ab1c2b..a0d3106f9c6 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerTest.java @@ -13,7 +13,7 @@ protected ConnectionFactoryOptions getOptions(MSSQLServerContainer container) @Override protected String createR2DBCUrl() { - return "r2dbc:tc:sqlserver:///?TC_IMAGE_TAG=2017-CU12"; + return "r2dbc:tc:sqlserver:///?TC_IMAGE_TAG=2022-CU14-ubuntu-22.04"; } @Override 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 index bdb623136fb..4ed4db9e8ab 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java @@ -15,7 +15,7 @@ public static Iterable data() { return Arrays.asList( new Object[][] { { - "jdbc:tc:sqlserver:2017-CU12://hostname:hostport;databaseName=databasename", + "jdbc:tc:sqlserver:2022-CU14-ubuntu-22.04://hostname:hostport;databaseName=databasename", EnumSet.noneOf(Options.class), }, } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java index 4cfc34f9e73..03e0affa00c 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java @@ -18,7 +18,7 @@ public class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest { public void testSqlServerConnection() throws SQLException { try ( MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>( - DockerImageName.parse("mcr.microsoft.com/mssql/server:2017-CU12") + DockerImageName.parse("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04") ) .withPassword(STRONG_PASSWORD) ) { diff --git a/modules/mssqlserver/src/test/resources/container-license-acceptance.txt b/modules/mssqlserver/src/test/resources/container-license-acceptance.txt index 8a704b9c066..5ae6ecbd4d1 100644 --- a/modules/mssqlserver/src/test/resources/container-license-acceptance.txt +++ b/modules/mssqlserver/src/test/resources/container-license-acceptance.txt @@ -1 +1 @@ -mcr.microsoft.com/mssql/server:2017-CU12 +mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04 From 47716a7fb597cf46a78857a6270b7e7cf4c8196a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:06:01 +0000 Subject: [PATCH 0241/1224] Bump org.awaitility:awaitility from 4.2.0 to 4.2.2 in /modules/redpanda Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.2.2. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.2.2) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 56bf81761b4..2db469936f6 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' - testImplementation 'org.awaitility:awaitility:4.2.0' + testImplementation 'org.awaitility:awaitility:4.2.2' } From 8d2705fb14b22e17f888103fa45ee88925bcc9d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:06:21 +0000 Subject: [PATCH 0242/1224] Bump io.grpc:grpc-bom from 1.65.1 to 1.68.0 in /modules/qdrant Bumps [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) from 1.65.1 to 1.68.0. - [Release notes](https://github.com/grpc/grpc-java/releases) - [Commits](https://github.com/grpc/grpc-java/commits) --- updated-dependencies: - dependency-name: io.grpc:grpc-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 8f7ddcfab2a..790b22520ae 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'io.qdrant:client:1.10.0' - testImplementation platform('io.grpc:grpc-bom:1.65.1') + testImplementation platform('io.grpc:grpc-bom:1.68.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' testImplementation 'io.grpc:grpc-netty-shaded' From e7fd353a4c3c9618c83d593425aa5e3adfc19030 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:08:45 +0000 Subject: [PATCH 0243/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.7.1 to 3.7.3. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/java-client-3.7.1...core-io-3.7.3) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 4ecab1d0f6b..973af4b2ffb 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,7 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:4.12.0' - testImplementation 'com.couchbase.client:java-client:3.7.1' + testImplementation 'com.couchbase.client:java-client:3.7.3' testImplementation 'org.awaitility:awaitility:4.2.0' testImplementation 'org.assertj:assertj-core:3.26.3' } From 44d37ecf5c4387996562529bd1500a344e488a08 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:11:14 +0000 Subject: [PATCH 0244/1224] Bump org.seleniumhq.selenium:selenium-bom in /examples Bumps [org.seleniumhq.selenium:selenium-bom](https://github.com/SeleniumHQ/selenium) from 4.21.0 to 4.25.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.21.0...selenium-4.25.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 96da350b888..3ee4054ce71 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - implementation platform('org.seleniumhq.selenium:selenium-bom:4.21.0') + implementation platform('org.seleniumhq.selenium:selenium-bom:4.25.0') implementation 'org.seleniumhq.selenium:selenium-remote-driver' implementation 'org.seleniumhq.selenium:selenium-firefox-driver' implementation 'org.seleniumhq.selenium:selenium-chrome-driver' From 51f92bd448862a5774e779efe26996cbc1e75e1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:11:33 +0000 Subject: [PATCH 0245/1224] Bump org.seleniumhq.selenium:selenium-api in /examples Bumps [org.seleniumhq.selenium:selenium-api](https://github.com/SeleniumHQ/selenium) from 4.22.0 to 4.25.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.22.0...selenium-4.25.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index 14fa146ed89..296e936953f 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(":mysql") testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation "org.seleniumhq.selenium:selenium-api:4.22.0" + testImplementation "org.seleniumhq.selenium:selenium-api:4.25.0" testImplementation 'org.assertj:assertj-core:3.26.3' } From 7108657ee8c5946181b78e0ecacfb8674c437414 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:12:43 +0000 Subject: [PATCH 0246/1224] Bump org.seleniumhq.selenium:selenium-api in /smoke-test Bumps [org.seleniumhq.selenium:selenium-api](https://github.com/SeleniumHQ/selenium) from 4.22.0 to 4.25.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.22.0...selenium-4.25.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-api dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index 14fa146ed89..296e936953f 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(":mysql") testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation "org.seleniumhq.selenium:selenium-api:4.22.0" + testImplementation "org.seleniumhq.selenium:selenium-api:4.25.0" testImplementation 'org.assertj:assertj-core:3.26.3' } From 1135bf00ea7089a5bba046859bf80459f4c333fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:12:52 +0000 Subject: [PATCH 0247/1224] Bump com.google.guava:guava from 33.2.1-jre to 33.3.1-jre in /smoke-test Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.2.1-jre to 33.3.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2c1f63426d6..af1f408b35e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { dependencies { // https://github.com/melix/japicmp-gradle-plugin/issues/36 - classpath 'com.google.guava:guava:33.2.1-jre' + classpath 'com.google.guava:guava:33.3.1-jre' classpath 'com.github.tjni.captainhook:captain-hook:0.1.5' } } From 2d20f73a37d8d14008c5f35a48be335f3c87655f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:14:01 +0000 Subject: [PATCH 0248/1224] Bump com.google.guava:guava in /modules/jdbc-test Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.2.1-jre to 33.3.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 b841865a7a8..6cf8d682d0d 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -1,7 +1,7 @@ dependencies { api project(':jdbc') - api 'com.google.guava:guava:33.2.1-jre' + api 'com.google.guava:guava:33.3.1-jre' api 'org.apache.commons:commons-lang3:3.15.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 350d541982f8ef2f0922881339e39556529fc710 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:17:36 +0000 Subject: [PATCH 0249/1224] Bump software.amazon.awssdk:s3 in /modules/localstack Bumps software.amazon.awssdk:s3 from 2.26.25 to 2.28.6. --- updated-dependencies: - dependency-name: software.amazon.awssdk:s3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 6fef28f27c2..2994bb7d2f2 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,6 +9,6 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-logs' testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.26.25' + testImplementation 'software.amazon.awssdk:s3:2.28.6' testImplementation 'org.assertj:assertj-core:3.26.3' } From 49b55530832c6ca40e9c74694564b8ed92f218d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:24:27 +0000 Subject: [PATCH 0250/1224] Bump io.trino:trino-jdbc from 453 to 458 in /modules/trino Bumps io.trino:trino-jdbc from 453 to 458. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 8b146c07e8c..ce37aa68718 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:453' + testRuntimeOnly 'io.trino:trino-jdbc:458' compileOnly 'org.jetbrains:annotations:24.1.0' } From 5c2bba50cc163a7531d69196de731dadc9560b04 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:35:46 +0000 Subject: [PATCH 0251/1224] Bump peter-evans/create-pull-request from 6.1.0 to 7.0.5 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 6.1.0 to 7.0.5. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/c5a7806660adbe173f04e3e038b0ccdcd758773c...5e914681df9dc83aa4e4905692ca88beb2f9e91f) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-testcontainers-version.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index 6cc431d3a52..b6501902995 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/latest_version: .*/latest_version: ${GITHUB_REF##*/}/g" mkdocs.yml git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v3.10.1 + uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v3.10.1 with: title: Update docs version to ${GITHUB_REF##*/} body: | diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index 7f3faa0e92d..7623b3dff69 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/^testcontainers\.version=.*/testcontainers\.version=${GITHUB_REF##*/}/g" gradle.properties git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@c5a7806660adbe173f04e3e038b0ccdcd758773c # v3.10.1 + uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v3.10.1 with: title: Update testcontainers version to ${GITHUB_REF##*/} body: | From 3905646f9b0b1b668f330099f8fb9baedc2b2256 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:35:53 +0000 Subject: [PATCH 0252/1224] Bump com.databend:databend-jdbc from 0.2.9 to 0.3.2 in /modules/databend Bumps [com.databend:databend-jdbc](https://github.com/databendcloud/databend-jdbc) from 0.2.9 to 0.3.2. - [Release notes](https://github.com/databendcloud/databend-jdbc/releases) - [Commits](https://github.com/databendcloud/databend-jdbc/commits/v0.3.2) --- updated-dependencies: - dependency-name: com.databend:databend-jdbc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 81cc9ef2cbe..d3daa5575a2 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.databend:databend-jdbc:0.2.9' + testRuntimeOnly 'com.databend:databend-jdbc:0.3.2' testImplementation 'org.assertj:assertj-core:3.26.3' } From dd730f2c881757406be9ad8decee1ee4e88330cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:39:09 +0000 Subject: [PATCH 0253/1224] Bump com.google.guava:guava from 33.2.1-jre to 33.3.1-jre in /core Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.2.1-jre to 33.3.1-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 7ab2408fe05..60249e8d3dd 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -99,7 +99,7 @@ dependencies { api 'com.github.docker-java:docker-java-transport-zerodep' - shaded 'com.google.guava:guava:33.2.1-jre' + shaded 'com.google.guava:guava:33.3.1-jre' shaded "org.yaml:snakeyaml:1.33" shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2' From 47f5b0183d32b727ba476cf89420b488709cbc2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:46:59 +0000 Subject: [PATCH 0254/1224] Bump io.milvus:milvus-sdk-java from 2.4.2 to 2.4.4 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.4.2 to 2.4.4. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.4.2...v2.4.4) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 2f4c25b055a..45e7df4e927 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation('io.milvus:milvus-sdk-java:2.4.2') { + testImplementation('io.milvus:milvus-sdk-java:2.4.4') { exclude(group: 'org.testcontainers', module: 'milvus') exclude(group: 'org.testcontainers', module: 'junit-jupiter') } From 241990701133350463a2fa8366f5dbe0d68576de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:49:53 +0000 Subject: [PATCH 0255/1224] Bump org.awaitility:awaitility from 4.2.0 to 4.2.2 in /modules/kafka Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.2.2. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.2.2) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 176fe253375..5f0658a51d0 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' - testImplementation 'org.awaitility:awaitility:4.2.0' + testImplementation 'org.awaitility:awaitility:4.2.2' } From 9648210046f8b47074bfbb7f8a62eeec10dc8f2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 22:50:29 +0000 Subject: [PATCH 0256/1224] Bump commons-io:commons-io from 2.16.1 to 2.17.0 in /modules/hivemq Bumps commons-io:commons-io from 2.16.1 to 2.17.0. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b19333fa14f..44882a3e96a 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -5,7 +5,7 @@ dependencies { api("org.jetbrains:annotations:24.1.0") shaded("org.apache.commons:commons-lang3:3.15.0") - shaded("commons-io:commons-io:2.16.1") + shaded("commons-io:commons-io:2.17.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") From 231c8b52a0f447130d7a8baeff0e48c7d0bd1ee3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 23 Sep 2024 23:00:36 +0000 Subject: [PATCH 0257/1224] Bump io.weaviate:client from 4.8.2 to 4.8.3 in /modules/weaviate Bumps [io.weaviate:client](https://github.com/weaviate/java-client) from 4.8.2 to 4.8.3. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/4.8.2...4.8.3) --- updated-dependencies: - dependency-name: io.weaviate:client dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index f110cdcb17f..1281fa120d0 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'io.weaviate:client:4.8.2' + testImplementation 'io.weaviate:client:4.8.3' } From b8a710a61eb469f1a4b9580c844893a4560edccc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:50:53 +0000 Subject: [PATCH 0258/1224] Bump redis.clients:jedis from 5.1.3 to 5.1.5 in /core Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.3 to 5.1.5. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.3...v5.1.5) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 36e6aaed65e..10368b59f1f 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -110,7 +110,7 @@ dependencies { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'redis.clients:jedis:5.1.3' + testImplementation 'redis.clients:jedis:5.1.5' testImplementation 'com.rabbitmq:amqp-client:5.22.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' From 3790b89541b7c959d717e6a8b48ef88d5295e45a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:50:59 +0000 Subject: [PATCH 0259/1224] Bump org.apache.commons:commons-lang3 in /modules/jdbc-test Bumps org.apache.commons:commons-lang3 from 3.15.0 to 3.17.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 6cf8d682d0d..a4c42db38ce 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -2,7 +2,7 @@ dependencies { api project(':jdbc') api 'com.google.guava:guava:33.3.1-jre' - api 'org.apache.commons:commons-lang3:3.15.0' + api 'org.apache.commons:commons-lang3:3.17.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 667cefda14edc97a4368ee68928dd228b4bfbc16 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:51:02 +0000 Subject: [PATCH 0260/1224] Bump org.apache.commons:commons-lang3 in /modules/hivemq Bumps org.apache.commons:commons-lang3 from 3.15.0 to 3.17.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index f043ea20fdc..1c748a8d2e3 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -4,7 +4,7 @@ dependencies { api(project(":testcontainers")) api("org.jetbrains:annotations:24.1.0") - shaded("org.apache.commons:commons-lang3:3.15.0") + shaded("org.apache.commons:commons-lang3:3.17.0") shaded("commons-io:commons-io:2.17.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") From 61b8ff73bb313aa23c6a7d55165b7ee0a0bac719 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Sep 2024 18:51:08 +0000 Subject: [PATCH 0261/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 8.14.3 to 8.15.1. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v8.14.3...v8.15.1) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 65c3b08ef0b..79faefdde24 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.14.3" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.15.1" testImplementation "org.elasticsearch.client:transport:7.17.24" testImplementation 'org.assertj:assertj-core:3.26.3' } From 04206d9dff440e875906f01151f09ad04da3c68f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 25 Sep 2024 15:31:08 -0600 Subject: [PATCH 0262/1224] Remove exclusions from milvus-sdk-java dependency --- modules/milvus/build.gradle | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 45e7df4e927..a15d24bbbe5 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,8 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation('io.milvus:milvus-sdk-java:2.4.4') { - exclude(group: 'org.testcontainers', module: 'milvus') - exclude(group: 'org.testcontainers', module: 'junit-jupiter') - } + testImplementation 'io.milvus:milvus-sdk-java:2.4.4' } From 8921a5a8645fa63e824eef027465b9fd8166d5a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 30 Sep 2024 17:06:59 -0500 Subject: [PATCH 0263/1224] Add MongoDB Atlas implementation (#9290) Co-authored-by: Luke Thompson --- docs/modules/databases/mongodb.md | 42 ++++- .../mongodb/MongoDBAtlasLocalContainer.java | 38 ++++ .../mongodb/AtlasLocalDataAccess.java | 177 ++++++++++++++++++ .../MongoDBAtlasLocalContainerTest.java | 79 ++++++++ .../src/test/resources/atlas-local-index.json | 18 ++ 5 files changed, 352 insertions(+), 2 deletions(-) create mode 100644 modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java create mode 100644 modules/mongodb/src/test/java/org/testcontainers/mongodb/AtlasLocalDataAccess.java create mode 100644 modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java create mode 100644 modules/mongodb/src/test/resources/atlas-local-index.json diff --git a/docs/modules/databases/mongodb.md b/docs/modules/databases/mongodb.md index 9e81e28c39f..441025a8d92 100644 --- a/docs/modules/databases/mongodb.md +++ b/docs/modules/databases/mongodb.md @@ -3,7 +3,14 @@ !!! 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. -## Usage example +The MongoDB module provides two Testcontainers for MongoDB unit testing: + +* [MongoDBContainer](#mongodbcontainer) - the core MongoDB database +* [MongoDBAtlasLocalContainer](#mongodbatlaslocalcontainer) - the core MongoDB database combined with MongoDB Atlas Search + Atlas Vector Search + +## MongoDBContainer + +### Usage example The following example shows how to create a MongoDBContainer: @@ -36,6 +43,37 @@ For instance, to initialize a single node replica set on fixed ports via Docker, As we can see, there is a lot of operations to execute and we even haven't touched a non-fixed port approach. That's where the MongoDBContainer might come in handy. +## MongoDBAtlasLocalContainer + +### Usage example + +The following example shows how to create a MongoDBAtlasLocalContainer: + + +[Creating a MongoDB Atlas Local Container](../../../modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java) inside_block:creatingAtlasLocalContainer + + +And how to start it: + + +[Start the Container](../../../modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java) inside_block:startingAtlasLocalContainer + + +The connection string provided by the MongoDBAtlasLocalContainer's getConnectionString() method includes the dynamically allocated port: + + +[Get the Connection String](../../../modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java) inside_block:getConnectionStringAtlasLocalContainer + + +e.g. `mongodb://localhost:12345/?directConnection=true` + +### References +MongoDB Atlas Local combines the MongoDB database engine with MongoT, a sidecar process for advanced searching capabilities built by MongoDB and powered by [Apache Lucene](https://lucene.apache.org/). + +The container (mongodb/mongodb-atlas-local) documentation can be found [here](https://www.mongodb.com/docs/atlas/cli/current/atlas-cli-deploy-docker/). + +General information about Atlas Search can be found [here](https://www.mongodb.com/docs/atlas/atlas-search/). + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: @@ -55,7 +93,7 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: ``` !!! hint -Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency + Adding this Testcontainers library JAR will not automatically add a database driver JAR to your project. You should ensure that your project also has a suitable database driver as a dependency #### Copyright Copyright (c) 2019 Konstantin Silaev diff --git a/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java b/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java new file mode 100644 index 00000000000..52067c01ff2 --- /dev/null +++ b/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java @@ -0,0 +1,38 @@ +package org.testcontainers.mongodb; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for MongoDB Atlas. + *

    + * Supported images: {@code mongodb/mongodb-atlas-local} + *

    + * Exposed ports: 27017 + */ +public class MongoDBAtlasLocalContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mongodb/mongodb-atlas-local"); + + private static final int MONGODB_INTERNAL_PORT = 27017; + + public MongoDBAtlasLocalContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public MongoDBAtlasLocalContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withExposedPorts(MONGODB_INTERNAL_PORT); + waitingFor(Wait.forSuccessfulCommand("runner healthcheck")); + } + + /** + * Get the connection string to MongoDB. + */ + public String getConnectionString() { + return String.format("mongodb://%s:%d/?directConnection=true", getHost(), getMappedPort(MONGODB_INTERNAL_PORT)); + } +} diff --git a/modules/mongodb/src/test/java/org/testcontainers/mongodb/AtlasLocalDataAccess.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/AtlasLocalDataAccess.java new file mode 100644 index 00000000000..c3e6aff41f9 --- /dev/null +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/AtlasLocalDataAccess.java @@ -0,0 +1,177 @@ +package org.testcontainers.mongodb; + +import com.mongodb.ConnectionString; +import com.mongodb.MongoClientSettings; +import com.mongodb.client.ListSearchIndexesIterable; +import com.mongodb.client.MongoClient; +import com.mongodb.client.MongoClients; +import com.mongodb.client.MongoCollection; +import com.mongodb.client.MongoDatabase; +import com.mongodb.client.model.Aggregates; +import com.mongodb.client.model.search.SearchOperator; +import com.mongodb.client.model.search.SearchOptions; +import com.mongodb.client.model.search.SearchPath; +import org.bson.BsonDocument; +import org.bson.Document; +import org.bson.codecs.configuration.CodecRegistries; +import org.bson.codecs.configuration.CodecRegistry; +import org.bson.codecs.pojo.PojoCodecProvider; +import org.bson.conversions.Bson; +import org.bson.json.JsonWriterSettings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Collections; +import java.util.concurrent.TimeUnit; + +import static org.awaitility.Awaitility.await; + +public class AtlasLocalDataAccess implements AutoCloseable { + + private static final Logger log = LoggerFactory.getLogger(AtlasLocalDataAccess.class); + + private final MongoClient mongoClient; + + private final MongoDatabase testDB; + + private final MongoCollection testCollection; + + private final String collectionName; + + public AtlasLocalDataAccess(String connectionString, String databaseName, String collectionName) { + this.collectionName = collectionName; + log.info("DataAccess connecting to {}", connectionString); + + CodecRegistry pojoCodecRegistry = CodecRegistries.fromProviders( + PojoCodecProvider.builder().automatic(true).build() + ); + CodecRegistry codecRegistry = CodecRegistries.fromRegistries( + MongoClientSettings.getDefaultCodecRegistry(), + pojoCodecRegistry + ); + MongoClientSettings clientSettings = MongoClientSettings + .builder() + .applyConnectionString(new ConnectionString(connectionString)) + .codecRegistry(codecRegistry) + .build(); + mongoClient = MongoClients.create(clientSettings); + testDB = mongoClient.getDatabase(databaseName); + testCollection = testDB.getCollection(collectionName, TestData.class); + } + + @Override + public void close() { + mongoClient.close(); + } + + public void initAtlasSearchIndex() throws URISyntaxException, IOException, InterruptedException { + //Create the collection (if it doesn't exist). Required because unlike other database operations, createSearchIndex will fail if the collection doesn't exist yet + testDB.createCollection(collectionName); + + //Read the atlas search index JSON from a resource file + String atlasSearchIndexJson = new String( + Files.readAllBytes(Paths.get(getClass().getResource("/atlas-local-index.json").toURI())), + StandardCharsets.UTF_8 + ); + log.info( + "Creating Atlas Search index AtlasSearchIndex on collection {}:\n{}", + collectionName, + atlasSearchIndexJson + ); + testCollection.createSearchIndex("AtlasSearchIndex", BsonDocument.parse(atlasSearchIndexJson)); + + //wait for the atlas search index to be ready + Instant start = Instant.now(); + await() + .atMost(5, TimeUnit.SECONDS) + .pollInterval(10, TimeUnit.MILLISECONDS) + .pollInSameThread() + .until(this::getIndexStatus, "READY"::equalsIgnoreCase); + + log.info( + "Atlas Search index AtlasSearchIndex on collection {} is ready (took {} milliseconds) to create.", + collectionName, + start.until(Instant.now(), ChronoUnit.MILLIS) + ); + } + + private String getIndexStatus() { + ListSearchIndexesIterable searchIndexes = testCollection.listSearchIndexes(); + for (Document searchIndex : searchIndexes) { + if (searchIndex.get("name").equals("AtlasSearchIndex")) { + return searchIndex.getString("status"); + } + } + return null; + } + + public void insertData(TestData data) { + log.info("Inserting document {}", data); + testCollection.insertOne(data); + } + + public TestData findAtlasSearch(String test) { + Bson searchClause = Aggregates.search( + SearchOperator.of(SearchOperator.text(SearchPath.fieldPath("test"), test).fuzzy()), + SearchOptions.searchOptions().index("AtlasSearchIndex") + ); + log.trace( + "Searching for document using Atlas Search:\n{}", + searchClause.toBsonDocument().toJson(JsonWriterSettings.builder().indent(true).build()) + ); + return testCollection.aggregate(Collections.singletonList(searchClause)).first(); + } + + public static class TestData { + + String test; + + int test2; + + boolean test3; + + public TestData() {} + + public TestData(String test, int test2, boolean test3) { + this.test = test; + this.test2 = test2; + this.test3 = test3; + } + + public String getTest() { + return test; + } + + public void setTest(String test) { + this.test = test; + } + + public int getTest2() { + return test2; + } + + public void setTest2(int test2) { + this.test2 = test2; + } + + public boolean isTest3() { + return test3; + } + + public void setTest3(boolean test3) { + this.test3 = test3; + } + + @Override + public String toString() { + return "TestData{" + "test='" + test + '\'' + ", test2=" + test2 + ", test3=" + test3 + '}'; + } + } +} diff --git a/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java new file mode 100644 index 00000000000..2d7664d51fa --- /dev/null +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java @@ -0,0 +1,79 @@ +package org.testcontainers.mongodb; + +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Objects; +import java.util.concurrent.TimeUnit; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.awaitility.Awaitility.await; + +public class MongoDBAtlasLocalContainerTest { + + private static final Logger log = LoggerFactory.getLogger(MongoDBAtlasLocalContainerTest.class); + + @Test + public void getConnectionString() { + try ( + MongoDBAtlasLocalContainer container = new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9") + ) { + container.start(); + String connectionString = container.getConnectionString(); + assertThat(connectionString).isNotNull(); + assertThat(connectionString).startsWith("mongodb://"); + assertThat(connectionString) + .isEqualTo( + String.format( + "mongodb://%s:%d/?directConnection=true", + container.getHost(), + container.getFirstMappedPort() + ) + ); + } + } + + @Test + public void createAtlasIndexAndSearchIt() throws Exception { + try ( + // creatingAtlasLocalContainer { + MongoDBAtlasLocalContainer atlasLocalContainer = new MongoDBAtlasLocalContainer( + "mongodb/mongodb-atlas-local:7.0.9" + ); + // } + ) { + // startingAtlasLocalContainer { + atlasLocalContainer.start(); + // } + + // getConnectionStringAtlasLocalContainer { + String connectionString = atlasLocalContainer.getConnectionString(); + // } + + try ( + AtlasLocalDataAccess atlasLocalDataAccess = new AtlasLocalDataAccess(connectionString, "test", "test") + ) { + atlasLocalDataAccess.initAtlasSearchIndex(); + + atlasLocalDataAccess.insertData(new AtlasLocalDataAccess.TestData("tests", 123, true)); + + Instant start = Instant.now(); + log.info( + "Waiting for Atlas Search to index the data by polling atlas search query (Atlas Search is eventually consistent)" + ); + await() + .atMost(5, TimeUnit.SECONDS) + .pollInterval(10, TimeUnit.MILLISECONDS) + .pollInSameThread() + .until(() -> atlasLocalDataAccess.findAtlasSearch("test"), Objects::nonNull); + log.info( + "Atlas Search indexed the new data and was searchable after {}ms.", + start.until(Instant.now(), ChronoUnit.MILLIS) + ); + } + } + } +} diff --git a/modules/mongodb/src/test/resources/atlas-local-index.json b/modules/mongodb/src/test/resources/atlas-local-index.json new file mode 100644 index 00000000000..1bca016025f --- /dev/null +++ b/modules/mongodb/src/test/resources/atlas-local-index.json @@ -0,0 +1,18 @@ +{ + "mappings": { + "dynamic": false, + "fields": { + "test": { + "type": "string" + }, + "test2": { + "type": "number", + "representation": "int64", + "indexDoubles": false + }, + "test3": { + "type": "boolean" + } + } + } +} From 8b363914284f5c1267b112e4fe90ae9283fa75ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 30 Sep 2024 16:07:51 -0600 Subject: [PATCH 0264/1224] [mongodb] Remove incubating note --- docs/modules/databases/mongodb.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/modules/databases/mongodb.md b/docs/modules/databases/mongodb.md index 441025a8d92..0d410d115d5 100644 --- a/docs/modules/databases/mongodb.md +++ b/docs/modules/databases/mongodb.md @@ -1,8 +1,5 @@ # MongoDB Module -!!! 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. - The MongoDB module provides two Testcontainers for MongoDB unit testing: * [MongoDBContainer](#mongodbcontainer) - the core MongoDB database From 6550a5c19172ef22eeb12f669acaf5b4ae5c2dec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:58:43 -0500 Subject: [PATCH 0265/1224] [create-pull-request] automated change (#9308) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index f3cd49bab30..3823455b0db 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -135,4 +135,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 1.20.1 + latest_version: 1.20.2 From b1f8ada00b27e51d3f629a0beb9978e2ecd0817a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Sep 2024 18:58:54 -0500 Subject: [PATCH 0266/1224] [create-pull-request] automated change (#9307) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 270386ac997..01c18a4c987 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=1.20.1 +testcontainers.version=1.20.2 From 5c56011799852119d2000311147dfe279a7c5411 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Wed, 2 Oct 2024 22:14:32 -0400 Subject: [PATCH 0267/1224] Add "integration-testing" topic (#9338) --- .github/settings.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/settings.yml b/.github/settings.yml index d02aee1c7da..7571d82d55f 100644 --- a/.github/settings.yml +++ b/.github/settings.yml @@ -13,7 +13,7 @@ repository: homepage: https://testcontainers.org # A comma-separated list of topics to set on the repository - topics: java,testing,docker,docker-compose,jvm,test-automation,junit,hacktoberfest + topics: java,testing,docker,docker-compose,jvm,test-automation,junit,hacktoberfest,integration-testing # Either `true` to make the repository private, or `false` to make it public. private: false From 49b5a161bc9465d340cbf3e2c4803275f9b2ce3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 3 Oct 2024 13:01:22 -0500 Subject: [PATCH 0268/1224] Polish Cassandra tests (#9339) --- docs/modules/databases/cassandra.md | 4 +- .../cassandra/CassandraContainerTest.java | 41 ++++++++++++------- .../cassandra/CassandraServer4Test.java | 35 ---------------- .../cassandra/CassandraServer5Test.java | 35 ---------------- ...java => CompatibleCassandraImageTest.java} | 25 +++++++---- .../containers/CassandraDriver3Test.java | 37 ----------------- .../containers/CassandraDriver4Test.java | 35 ---------------- ...java => CompatibleCassandraImageTest.java} | 26 +++++++++--- 8 files changed, 65 insertions(+), 173 deletions(-) delete mode 100644 modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java delete mode 100644 modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java rename modules/cassandra/src/test/java/org/testcontainers/cassandra/{CassandraDriver4Test.java => CompatibleCassandraImageTest.java} (61%) delete mode 100644 modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver3Test.java delete mode 100644 modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver4Test.java rename modules/cassandra/src/test/java/org/testcontainers/containers/{CassandraServer4Test.java => CompatibleCassandraImageTest.java} (53%) diff --git a/docs/modules/databases/cassandra.md b/docs/modules/databases/cassandra.md index 72213dad4a7..5a062e4a059 100644 --- a/docs/modules/databases/cassandra.md +++ b/docs/modules/databases/cassandra.md @@ -6,12 +6,12 @@ This example connects to the Cassandra cluster: 1. Define a container: - [Container definition](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java) inside_block:container-definition + [Container definition](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java) inside_block:container-definition 2. Build a `CqlSession`: - [Building CqlSession](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java) inside_block:cql-session + [Building CqlSession](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java) inside_block:cql-session 3. Define a container with custom `cassandra.yaml` located in a directory `cassandra-auth-required-configuration`: diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java index 4bf776b96c8..632966d1bb3 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java @@ -1,7 +1,6 @@ package org.testcontainers.cassandra; import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.CqlSessionBuilder; import com.datastax.oss.driver.api.core.cql.ResultSet; import com.datastax.oss.driver.api.core.cql.Row; import org.junit.Test; @@ -20,7 +19,10 @@ public class CassandraContainerTest { @Test public void testSimple() { - try (CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE)) { + try ( // container-definition { + CassandraContainer cassandraContainer = new CassandraContainer("cassandra:3.11.2") + // } + ) { cassandraContainer.start(); ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY); assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); @@ -115,11 +117,15 @@ public void testInitScriptWithLegacyCassandra() { } private void testInitScript(CassandraContainer cassandraContainer, boolean withCredentials) { - ResultSet resultSet = performQuery( - cassandraContainer, - "SELECT * FROM keySpaceTest.catalog_category", - withCredentials - ); + String query = "SELECT * FROM keySpaceTest.catalog_category"; + ResultSet resultSet; + + if (withCredentials) { + resultSet = performQueryWithAuth(cassandraContainer, query); + } else { + resultSet = performQuery(cassandraContainer, query); + } + assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); Row row = resultSet.one(); assertThat(row.getLong(0)).as("Inserted row is in expected state").isEqualTo(1); @@ -127,18 +133,23 @@ private void testInitScript(CassandraContainer cassandraContainer, boolean withC } private ResultSet performQuery(CassandraContainer cassandraContainer, String cql) { - return performQuery(cassandraContainer, cql, false); + // cql-session { + final CqlSession cqlSession = CqlSession + .builder() + .addContactPoint(cassandraContainer.getContactPoint()) + .withLocalDatacenter(cassandraContainer.getLocalDatacenter()) + .build(); + // } + return performQuery(cqlSession, cql); } - private ResultSet performQuery(CassandraContainer cassandraContainer, String cql, boolean withCredentials) { - final CqlSessionBuilder cqlSessionBuilder = CqlSession + private ResultSet performQueryWithAuth(CassandraContainer cassandraContainer, String cql) { + final CqlSession cqlSession = CqlSession .builder() .addContactPoint(cassandraContainer.getContactPoint()) - .withLocalDatacenter(cassandraContainer.getLocalDatacenter()); - if (withCredentials) { - cqlSessionBuilder.withAuthCredentials(cassandraContainer.getUsername(), cassandraContainer.getPassword()); - } - final CqlSession cqlSession = cqlSessionBuilder.build(); + .withLocalDatacenter(cassandraContainer.getLocalDatacenter()) + .withAuthCredentials(cassandraContainer.getUsername(), cassandraContainer.getPassword()) + .build(); return performQuery(cqlSession, cql); } diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java deleted file mode 100644 index b509a77e9e8..00000000000 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer4Test.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.testcontainers.cassandra; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Rule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CassandraServer4Test { - - @Rule - public CassandraContainer cassandra = new CassandraContainer("cassandra:4.1.1"); - - @Test - public void testCassandraGetContactPoint() { - try ( - CqlSession session = CqlSession - .builder() - .addContactPoint(this.cassandra.getContactPoint()) - .withLocalDatacenter(this.cassandra.getLocalDatacenter()) - .build() - ) { - session.execute( - "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + - "{'class':'SimpleStrategy','replication_factor':'1'};" - ); - - KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); - - assertThat(keyspace).as("test keyspace created").isNotNull(); - } - } -} diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java deleted file mode 100644 index d4e1c858382..00000000000 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraServer5Test.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.testcontainers.cassandra; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Rule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CassandraServer5Test { - - @Rule - public CassandraContainer cassandra = new CassandraContainer("cassandra:5"); - - @Test - public void testCassandraGetContactPoint() { - try ( - CqlSession session = CqlSession - .builder() - .addContactPoint(this.cassandra.getContactPoint()) - .withLocalDatacenter(this.cassandra.getLocalDatacenter()) - .build() - ) { - session.execute( - "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + - "{'class':'SimpleStrategy','replication_factor':'1'};" - ); - - KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); - - assertThat(keyspace).as("test keyspace created").isNotNull(); - } - } -} diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java similarity index 61% rename from modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java rename to modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java index 5e1b682e878..868e11c881e 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraDriver4Test.java +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java @@ -3,29 +3,38 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import static org.assertj.core.api.Assertions.assertThat; -public class CassandraDriver4Test { +@RunWith(Parameterized.class) +public class CompatibleCassandraImageTest { - @Rule - // container-definition { - public CassandraContainer cassandra = new CassandraContainer("cassandra:3.11.2"); + @Parameterized.Parameters(name = "{0}") + public static String[] params() { + return new String[] { "cassandra:3.11.2", "cassandra:4.1.1", "cassandra:5" }; + } - // } + @Parameterized.Parameter + public String imageName; @Test public void testCassandraGetContactPoint() { + try (CassandraContainer cassandra = new CassandraContainer(this.imageName)) { + cassandra.start(); + assertCassandraFunctionality(cassandra); + } + } + + private void assertCassandraFunctionality(CassandraContainer cassandra) { try ( - // cql-session { CqlSession session = CqlSession .builder() .addContactPoint(cassandra.getContactPoint()) .withLocalDatacenter(cassandra.getLocalDatacenter()) .build() - // } ) { session.execute( "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver3Test.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver3Test.java deleted file mode 100644 index 502f2ca8e67..00000000000 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver3Test.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.testcontainers.containers; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Rule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CassandraDriver3Test { - - @Rule - public CassandraContainer cassandra = new CassandraContainer<>("cassandra:3.11.2"); - - @Test - public void testCassandraGetContactPoint() { - try ( - // cassandra { - CqlSession session = CqlSession - .builder() - .addContactPoint(this.cassandra.getContactPoint()) - .withLocalDatacenter(this.cassandra.getLocalDatacenter()) - .build() - // } - ) { - session.execute( - "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + - "{'class':'SimpleStrategy','replication_factor':'1'};" - ); - - KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); - - assertThat(keyspace).as("keyspace created").isNotNull(); - } - } -} diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver4Test.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver4Test.java deleted file mode 100644 index a4fb8c87b8e..00000000000 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraDriver4Test.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.testcontainers.containers; - -import com.datastax.oss.driver.api.core.CqlIdentifier; -import com.datastax.oss.driver.api.core.CqlSession; -import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Rule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class CassandraDriver4Test { - - @Rule - public CassandraContainer cassandra = new CassandraContainer<>("cassandra:3.11.2"); - - @Test - public void testCassandraGetContactPoint() { - try ( - CqlSession session = CqlSession - .builder() - .addContactPoint(this.cassandra.getContactPoint()) - .withLocalDatacenter(this.cassandra.getLocalDatacenter()) - .build() - ) { - session.execute( - "CREATE KEYSPACE IF NOT EXISTS test WITH replication = \n" + - "{'class':'SimpleStrategy','replication_factor':'1'};" - ); - - KeyspaceMetadata keyspace = session.getMetadata().getKeyspaces().get(CqlIdentifier.fromCql("test")); - - assertThat(keyspace).as("test keyspace created").isNotNull(); - } - } -} diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraServer4Test.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java similarity index 53% rename from modules/cassandra/src/test/java/org/testcontainers/containers/CassandraServer4Test.java rename to modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java index 1a8447e7036..dc5e830f79a 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraServer4Test.java +++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java @@ -3,23 +3,37 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Rule; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; import static org.assertj.core.api.Assertions.assertThat; -public class CassandraServer4Test { +@RunWith(Parameterized.class) +public class CompatibleCassandraImageTest { - @Rule - public CassandraContainer cassandra = new CassandraContainer<>("cassandra:4.1.1"); + @Parameterized.Parameters(name = "{0}") + public static String[] params() { + return new String[] { "cassandra:3.11.2", "cassandra:4.1.1" }; + } + + @Parameterized.Parameter + public String imageName; @Test public void testCassandraGetContactPoint() { + try (CassandraContainer cassandra = new CassandraContainer<>(this.imageName)) { + cassandra.start(); + assertCassandraFunctionality(cassandra); + } + } + + private void assertCassandraFunctionality(CassandraContainer cassandra) { try ( CqlSession session = CqlSession .builder() - .addContactPoint(this.cassandra.getContactPoint()) - .withLocalDatacenter(this.cassandra.getLocalDatacenter()) + .addContactPoint(cassandra.getContactPoint()) + .withLocalDatacenter(cassandra.getLocalDatacenter()) .build() ) { session.execute( From 35cf6d323ae87482f5ef40b87b7bd0709c934318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 3 Oct 2024 13:35:25 -0500 Subject: [PATCH 0269/1224] Polish Kafka examples (#9340) --- examples/kafka-cluster/build.gradle | 1 + .../kafkacluster/KafkaContainerCluster.java | 18 +++++++++--------- .../KafkaContainerClusterTest.java | 19 ++++++------------- .../KafkaContainerKraftCluster.java | 18 +++++++++--------- 4 files changed, 25 insertions(+), 31 deletions(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 54ae4eee8ff..623fcd66175 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -15,6 +15,7 @@ dependencies { testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.awaitility:awaitility:4.2.2' } test { diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java index 9ab3f25e0ff..403d087af3e 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java @@ -1,7 +1,7 @@ package com.example.kafkacluster; import lombok.SneakyThrows; -import org.rnorth.ducttape.unreliables.Unreliables; +import org.awaitility.Awaitility; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.KafkaContainer; @@ -11,11 +11,12 @@ import java.time.Duration; import java.util.Collection; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; +import static org.assertj.core.api.Assertions.assertThat; + /** * Provides an easy way to launch a Kafka cluster with multiple brokers. */ @@ -87,10 +88,10 @@ public void start() { // sequential start to avoid resource contention on CI systems with weaker hardware brokers.forEach(GenericContainer::start); - Unreliables.retryUntilTrue( - 30, - TimeUnit.SECONDS, - () -> { + Awaitility + .await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { Container.ExecResult result = this.zookeeper.execInContainer( "sh", @@ -101,9 +102,8 @@ public void start() { ); String brokers = result.getStdout(); - return brokers != null && brokers.split(",").length == this.brokersNum; - } - ); + assertThat(brokers.split(",")).hasSize(this.brokersNum); + }); } @Override diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerClusterTest.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerClusterTest.java index 51221b5d56f..6a66cf0ca2e 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerClusterTest.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerClusterTest.java @@ -13,8 +13,8 @@ import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.common.serialization.StringDeserializer; import org.apache.kafka.common.serialization.StringSerializer; +import org.awaitility.Awaitility; import org.junit.jupiter.api.Test; -import org.rnorth.ducttape.unreliables.Unreliables; import java.time.Duration; import java.util.Collection; @@ -100,24 +100,17 @@ protected void testKafkaFunctionality(String bootstrapServers, int partitions, i producer.send(new ProducerRecord<>(topicName, "testcontainers", "rulezzz")).get(); - Unreliables.retryUntilTrue( - 10, - TimeUnit.SECONDS, - () -> { + Awaitility + .await() + .atMost(Duration.ofSeconds(10)) + .untilAsserted(() -> { ConsumerRecords records = consumer.poll(Duration.ofMillis(100)); - if (records.isEmpty()) { - return false; - } - assertThat(records) .hasSize(1) .extracting(ConsumerRecord::topic, ConsumerRecord::key, ConsumerRecord::value) .containsExactly(tuple(topicName, "testcontainers", "rulezzz")); - - return true; - } - ); + }); consumer.unsubscribe(); } diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java index 4411cb14540..f42e3c5b1ba 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java @@ -1,7 +1,7 @@ package com.example.kafkacluster; import org.apache.kafka.common.Uuid; -import org.rnorth.ducttape.unreliables.Unreliables; +import org.awaitility.Awaitility; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.KafkaContainer; @@ -11,10 +11,11 @@ import java.time.Duration; import java.util.Collection; -import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import java.util.stream.IntStream; +import static org.assertj.core.api.Assertions.assertThat; + public class KafkaContainerKraftCluster implements Startable { private final int brokersNum; @@ -79,10 +80,10 @@ public void start() { // Needs to start all the brokers at once brokers.parallelStream().forEach(GenericContainer::start); - Unreliables.retryUntilTrue( - 30, - TimeUnit.SECONDS, - () -> { + Awaitility + .await() + .atMost(Duration.ofSeconds(30)) + .untilAsserted(() -> { Container.ExecResult result = this.brokers.stream() .findFirst() @@ -94,9 +95,8 @@ public void start() { ); String brokers = result.getStdout().replace("\n", ""); - return brokers != null && Integer.valueOf(brokers) == this.brokersNum; - } - ); + assertThat(brokers).asInt().isEqualTo(this.brokersNum); + }); } @Override From dee4cbe83a63034a597db8bce2417d2c4d6b6cf2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 3 Oct 2024 19:15:35 -0500 Subject: [PATCH 0270/1224] Use Awaitility in FixedHostPortContainerTest (#9341) --- .../junit/FixedHostPortContainerTest.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java index 72fc4b70519..a123b800f3a 100644 --- a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java @@ -1,8 +1,7 @@ package org.testcontainers.junit; -import com.google.common.util.concurrent.Uninterruptibles; +import org.awaitility.Awaitility; import org.junit.Test; -import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.TestImages; import org.testcontainers.containers.FixedHostPortGenericContainer; import org.testcontainers.containers.GenericContainer; @@ -11,7 +10,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.net.Socket; -import java.util.concurrent.TimeUnit; +import java.time.Duration; import static org.assertj.core.api.Assertions.assertThat; @@ -71,7 +70,7 @@ public void testFixedHostPortMapping() throws IOException { .as("Port mapping does not seem to match given fixed port") .isEqualTo(unusedHostPort); - final String content = this.readResponse(echoServer, unusedHostPort); + final String content = readResponse(echoServer, unusedHostPort); assertThat(content).as("Returned echo from fixed port does not match expected").isEqualTo(TEST_RESPONSE); } } @@ -86,15 +85,11 @@ public void testFixedHostPortMapping() throws IOException { */ private String readResponse(GenericContainer container, Integer port) throws IOException { try ( - final BufferedReader reader = Unreliables.retryUntilSuccess( - 10, - TimeUnit.SECONDS, - () -> { - Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); - final Socket socket = new Socket(container.getHost(), port); - return new BufferedReader(new InputStreamReader(socket.getInputStream())); - } - ) + Socket socket = Awaitility + .await() + .pollDelay(Duration.ofSeconds(1)) + .until(() -> new Socket(container.getHost(), port), Socket::isConnected); + BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream())) ) { return reader.readLine(); } From b2aa06279f14c59b9dc1dafc979c5017cf8c7c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 4 Oct 2024 15:30:49 -0500 Subject: [PATCH 0271/1224] Check docker compose version (#9342) --- .../containers/DockerComposeProfilesOptionTest.java | 3 +++ .../junit/DockerComposeContainerWithOptionsTest.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java index 0f7e41a8454..72f80cc877e 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java @@ -31,6 +31,9 @@ public void setUp() { .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) .as("docker-compose executable exists") .isTrue(); + Assumptions + .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) + .doesNotStartWith("Docker Compose version v2"); } } diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java index 0de25fa2946..ae5dbc1d0b4 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java @@ -83,6 +83,9 @@ public void setUp() { .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) .as("docker-compose executable exists") .isTrue(); + Assumptions + .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) + .doesNotStartWith("Docker Compose version v2"); } } From 49b13d8400e73abcb225f98f641db5c4123d2038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 4 Oct 2024 19:21:45 -0500 Subject: [PATCH 0272/1224] Support reset value in Docker Compose (#9343) Fixes #7919 --- .../containers/ParsedDockerComposeFile.java | 20 +++++---- .../junit/ComposeContainerOverrideTest.java | 41 +++++++++++++++++++ .../compose-override/compose-override.yml | 7 ++++ .../resources/compose-override/compose.yml | 7 ++++ 4 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java create mode 100644 core/src/test/resources/compose-override/compose-override.yml create mode 100644 core/src/test/resources/compose-override/compose.yml diff --git a/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java b/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java index 23831d3f026..b5b11686491 100644 --- a/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java +++ b/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java @@ -11,6 +11,8 @@ import org.yaml.snakeyaml.LoaderOptions; import org.yaml.snakeyaml.Yaml; import org.yaml.snakeyaml.constructor.SafeConstructor; +import org.yaml.snakeyaml.nodes.Node; +import org.yaml.snakeyaml.nodes.Tag; import org.yaml.snakeyaml.representer.Representer; import org.yaml.snakeyaml.resolver.Resolver; @@ -44,13 +46,17 @@ class ParsedDockerComposeFile { LoaderOptions options = new LoaderOptions(); options.setMaxAliasesForCollections(1_000); DumperOptions dumperOptions = new DumperOptions(); - Yaml yaml = new Yaml( - new SafeConstructor(options), - new Representer(dumperOptions), - dumperOptions, - options, - new Resolver() - ); + + SafeConstructor constructor = new SafeConstructor(options) { + @Override + protected Object constructObject(Node node) { + if (node.getTag().equals(new Tag("!reset"))) { + return null; + } + return super.constructObject(node); + } + }; + Yaml yaml = new Yaml(constructor, new Representer(dumperOptions), dumperOptions, options, new Resolver()); try (FileInputStream fileInputStream = FileUtils.openInputStream(composeFile)) { composeFileContent = yaml.load(fileInputStream); } catch (Exception e) { diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java new file mode 100644 index 00000000000..453fe9207ad --- /dev/null +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java @@ -0,0 +1,41 @@ +package org.testcontainers.junit; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import org.junit.Test; +import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.containers.ContainerState; + +import java.io.File; + +import static org.assertj.core.api.Assertions.assertThat; + +public class ComposeContainerOverrideTest { + + private static final File BASE = new File("src/test/resources/compose-override/compose.yml"); + + private static final File OVERRIDE = new File("src/test/resources/compose-override/compose-override.yml"); + + @Test + public void readEnvironment() { + try (ComposeContainer compose = new ComposeContainer(BASE).withExposedService("redis", 6379)) { + compose.start(); + InspectContainerResponse container = compose + .getContainerByServiceName("redis-1") + .map(ContainerState::getContainerInfo) + .get(); + assertThat(container.getConfig().getEnv()).contains("foo=bar"); + } + } + + @Test + public void resetEnvironment() { + try (ComposeContainer compose = new ComposeContainer(BASE, OVERRIDE).withExposedService("redis", 6379)) { + compose.start(); + InspectContainerResponse container = compose + .getContainerByServiceName("redis-1") + .map(ContainerState::getContainerInfo) + .get(); + assertThat(container.getConfig().getEnv()).doesNotContain("foo=bar"); + } + } +} diff --git a/core/src/test/resources/compose-override/compose-override.yml b/core/src/test/resources/compose-override/compose-override.yml new file mode 100644 index 00000000000..f5f457a6236 --- /dev/null +++ b/core/src/test/resources/compose-override/compose-override.yml @@ -0,0 +1,7 @@ +services: + redis: + image: redis:6-alpine + ports: + - 6379 + environment: + foo: !reset null diff --git a/core/src/test/resources/compose-override/compose.yml b/core/src/test/resources/compose-override/compose.yml new file mode 100644 index 00000000000..a304ae82273 --- /dev/null +++ b/core/src/test/resources/compose-override/compose.yml @@ -0,0 +1,7 @@ +services: + redis: + image: redis:6-alpine + ports: + - 6379 + environment: + foo: bar From 94e4c8532a6f87e9b978f6c256681c41508ca2bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 9 Oct 2024 21:09:03 -0500 Subject: [PATCH 0273/1224] Clear docker compose initialization (#9370) Currently, an instance of `DockerComposeContainer` and `ComposeContainer` keep information from previous initialization which causes issues when running the instance more than once. Fixes #7443 --------- Co-authored-by: jenodekeyzer --- .../containers/ComposeCommand.java | 8 ++--- .../containers/ComposeContainer.java | 1 + .../containers/ComposeDelegate.java | 7 +++++ .../containers/DockerComposeContainer.java | 1 + .../ComposeContainerWithServicesTest.java | 30 +++++++++++++++++++ ...ockerComposeContainerWithServicesTest.java | 30 +++++++++++++++++++ .../resources/docker-compose-healthcheck.yml | 6 ++++ 7 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 core/src/test/resources/docker-compose-healthcheck.yml diff --git a/core/src/main/java/org/testcontainers/containers/ComposeCommand.java b/core/src/main/java/org/testcontainers/containers/ComposeCommand.java index d85f093578e..f603761e3ce 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeCommand.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeCommand.java @@ -1,14 +1,12 @@ package org.testcontainers.containers; -import org.apache.commons.lang3.StringUtils; - import java.util.Set; class ComposeCommand { static String getDownCommand(ComposeDelegate.ComposeVersion composeVersion, Set options) { String composeOptions = optionsAsString(options); - if (composeOptions == null || composeOptions.equals("")) { + if (composeOptions.isEmpty()) { return composeVersion == ComposeDelegate.ComposeVersion.V1 ? "down" : "compose down"; } String cmd = composeVersion == ComposeDelegate.ComposeVersion.V1 ? "%s down" : "compose %s down"; @@ -17,7 +15,7 @@ static String getDownCommand(ComposeDelegate.ComposeVersion composeVersion, Set< static String getUpCommand(ComposeDelegate.ComposeVersion composeVersion, Set options) { String composeOptions = optionsAsString(options); - if (composeOptions == null || composeOptions.equals("")) { + if (composeOptions.isEmpty()) { return composeVersion == ComposeDelegate.ComposeVersion.V1 ? "up -d" : "compose up -d"; } String cmd = composeVersion == ComposeDelegate.ComposeVersion.V1 ? "%s up -d" : "compose %s up -d"; @@ -31,7 +29,7 @@ private static String optionsAsString(final Set options) { return optionsString; } else { // otherwise two spaces would appear between 'docker-compose' and 'up' - return StringUtils.EMPTY; + return ""; } } } diff --git a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java index 0a804cfddb2..79d706d3b6a 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java @@ -171,6 +171,7 @@ public void stop() { } this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env, this.filesInDirectory); } finally { + this.composeDelegate.clear(); this.project = this.composeDelegate.randomProjectId(); } } diff --git a/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java b/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java index 4dc396a6922..3365a0b0681 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeDelegate.java @@ -386,6 +386,13 @@ String getServiceHost() { return this.ambassadorContainer.getHost(); } + void clear() { + this.logConsumers.clear(); + this.ambassadorPortMappings.clear(); + this.serviceInstanceMap.clear(); + this.waitStrategyMap.clear(); + } + enum ComposeVersion { V1("_"), diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index cf78cfa4be2..92dc75b6cde 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -177,6 +177,7 @@ public void stop() { } this.composeDelegate.runWithCompose(this.localCompose, cmd, this.env, this.filesInDirectory); } finally { + this.composeDelegate.clear(); this.project = this.composeDelegate.randomProjectId(); } } diff --git a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java index 8524f804444..9a73c83981b 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java @@ -23,6 +23,10 @@ public class ComposeContainerWithServicesTest { "src/test/resources/compose-with-inline-scale-test.yml" ); + public static final File COMPOSE_FILE_WITH_HEALTHCHECK = new File( + "src/test/resources/docker-compose-healthcheck.yml" + ); + @Test public void testDesiredSubsetOfServicesAreStarted() { try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE).withServices("redis")) { @@ -108,6 +112,32 @@ public void testStartupTimeoutSetsTheHighestTimeout() { .isInstanceOf(TimeoutException.class); } + @Test + public void testWaitingForHealthcheck() { + try ( + ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK) + .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) + ) { + compose.start(); + + verifyStartedContainers(compose, "redis-1"); + } + } + + @Test + public void testWaitingForHealthcheckWithRestartDoesNotCrash() { + try ( + ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK) + .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) + ) { + compose.start(); + compose.stop(); + compose.start(); + + verifyStartedContainers(compose, "redis-1"); + } + } + private void verifyStartedContainers(final ComposeContainer compose, final String... names) { final List containerNames = compose .listChildContainers() diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java index 029e8447a81..f92c4727921 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java @@ -23,6 +23,10 @@ public class DockerComposeContainerWithServicesTest { "src/test/resources/compose-with-inline-scale-test.yml" ); + public static final File COMPOSE_FILE_WITH_HEALTHCHECK = new File( + "src/test/resources/docker-compose-healthcheck.yml" + ); + @Test public void testDesiredSubsetOfServicesAreStarted() { try ( @@ -113,6 +117,32 @@ public void testStartupTimeoutSetsTheHighestTimeout() { .isInstanceOf(TimeoutException.class); } + @Test + public void testWaitingForHealthcheck() { + try ( + DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK) + .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) + ) { + compose.start(); + + verifyStartedContainers(compose, "redis_1"); + } + } + + @Test + public void testWaitingForHealthcheckWithRestartDoesNotCrash() { + try ( + DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK) + .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) + ) { + compose.start(); + compose.stop(); + compose.start(); + + verifyStartedContainers(compose, "redis_1"); + } + } + private void verifyStartedContainers(final DockerComposeContainer compose, final String... names) { final List containerNames = compose .listChildContainers() diff --git a/core/src/test/resources/docker-compose-healthcheck.yml b/core/src/test/resources/docker-compose-healthcheck.yml new file mode 100644 index 00000000000..f4d6ed65386 --- /dev/null +++ b/core/src/test/resources/docker-compose-healthcheck.yml @@ -0,0 +1,6 @@ +version: "3.9" +services: + redis: + image: redis:alpine + healthcheck: + test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ] From bcca9f37c1d5c07d77e2b4e1d94c67b78b254449 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 14 Oct 2024 23:17:12 -0500 Subject: [PATCH 0274/1224] Add ComposeContainer test to junit-jupiter module (#9407) --- .../junit/jupiter/ComposeContainerTests.java | 22 ++++-------- .../jupiter/DockerComposeContainerTests.java | 35 +++++++++++++++++++ 2 files changed, 41 insertions(+), 16 deletions(-) create mode 100644 modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ComposeContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ComposeContainerTests.java index 866b76df301..a60b24a23d2 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ComposeContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/ComposeContainerTests.java @@ -4,9 +4,8 @@ import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; import java.io.File; @@ -17,25 +16,16 @@ class ComposeContainerTests { @Container - private DockerComposeContainer composeContainer = new DockerComposeContainer( - new File("src/test/resources/docker-compose.yml") - ) - .withExposedService("whoami_1", 80, Wait.forHttp("/")); - - private String host; - - private int port; - - @BeforeEach - void setup() { - host = composeContainer.getServiceHost("whoami_1", 80); - port = composeContainer.getServicePort("whoami_1", 80); - } + private ComposeContainer composeContainer = new ComposeContainer(new File("src/test/resources/docker-compose.yml")) + .withExposedService("whoami-1", 80, Wait.forHttp("/")); @Test void running_compose_defined_container_is_accessible_on_configured_port() throws Exception { HttpClient client = HttpClientBuilder.create().build(); + String host = composeContainer.getServiceHost("whoami-1", 80); + int port = composeContainer.getServicePort("whoami-1", 80); + HttpResponse response = client.execute(new HttpGet("http://" + host + ":" + port)); assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java new file mode 100644 index 00000000000..7a43ed67a7d --- /dev/null +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java @@ -0,0 +1,35 @@ +package org.testcontainers.junit.jupiter; + +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.HttpClientBuilder; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.containers.wait.strategy.Wait; + +import java.io.File; + +import static org.assertj.core.api.Assertions.assertThat; + +@Testcontainers +class DockerComposeContainerTests { + + @Container + private DockerComposeContainer composeContainer = new DockerComposeContainer( + new File("src/test/resources/docker-compose.yml") + ) + .withExposedService("whoami_1", 80, Wait.forHttp("/")); + + @Test + void running_compose_defined_container_is_accessible_on_configured_port() throws Exception { + HttpClient client = HttpClientBuilder.create().build(); + + String host = composeContainer.getServiceHost("whoami_1", 80); + int port = composeContainer.getServicePort("whoami_1", 80); + + HttpResponse response = client.execute(new HttpGet("http://" + host + ":" + port)); + + assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); + } +} From 51374723726945edbd2552db1bea6f6f4cce7787 Mon Sep 17 00:00:00 2001 From: Chris Eager <79161849+eager-signal@users.noreply.github.com> Date: Tue, 15 Oct 2024 00:35:41 -0500 Subject: [PATCH 0275/1224] Use server URL from auth query if helper does not return one (#9056) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../utility/RegistryAuthLocator.java | 9 ++-- .../utility/RegistryAuthLocatorTest.java | 42 +++++++++++++++++++ ...with-helper-no-server-url-using-token.json | 11 +++++ .../config-with-helper-no-server-url.json | 11 +++++ .../auth-config/docker-credential-fake | 14 +++++++ 5 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 core/src/test/resources/auth-config/config-with-helper-no-server-url-using-token.json create mode 100644 core/src/test/resources/auth-config/config-with-helper-no-server-url.json diff --git a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java index af2db247eb8..600a800c0df 100644 --- a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java +++ b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java @@ -318,13 +318,12 @@ private AuthConfig runCredentialProvider(String hostName, String helperOrStoreNa final String username = helperResponse.at("/Username").asText(); final String password = helperResponse.at("/Secret").asText(); + final String serverUrl = helperResponse.at("/ServerURL").asText(); + final AuthConfig authConfig = new AuthConfig().withRegistryAddress(serverUrl.isEmpty() ? hostName : serverUrl); if ("".equals(username)) { - return new AuthConfig().withIdentityToken(password); + return authConfig.withIdentityToken(password); } else { - return new AuthConfig() - .withRegistryAddress(helperResponse.at("/ServerURL").asText()) - .withUsername(username) - .withPassword(password); + return authConfig.withUsername(username).withPassword(password); } } diff --git a/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java b/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java index 835c1dff101..2e6f87d08b7 100644 --- a/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java +++ b/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java @@ -131,6 +131,9 @@ public void lookupAuthConfigUsingHelperWithToken() throws URISyntaxException, IO new AuthConfig() ); + assertThat(authConfig.getRegistryAddress()) + .as("Correct server URL is obtained from a credential store") + .isEqualTo("url"); assertThat(authConfig.getIdentitytoken()) .as("Correct identitytoken is obtained from a credential store") .isEqualTo("secret"); @@ -176,6 +179,45 @@ public void lookupNonEmptyAuthWithHelper() throws URISyntaxException, IOExceptio .isEqualTo("secret"); } + @Test + public void lookupAuthConfigUsingHelperNoServerUrl() throws URISyntaxException, IOException { + final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-helper-no-server-url.json"); + + final AuthConfig authConfig = authLocator.lookupAuthConfig( + DockerImageName.parse("registrynoserverurl.example.com/org/repo"), + new AuthConfig() + ); + + assertThat(authConfig.getRegistryAddress()) + .as("Fallback (registry) server URL is used") + .isEqualTo("registrynoserverurl.example.com"); + assertThat(authConfig.getUsername()) + .as("Correct username is obtained from a credential store") + .isEqualTo("username"); + assertThat(authConfig.getPassword()) + .as("Correct secret is obtained from a credential store") + .isEqualTo("secret"); + } + + @Test + public void lookupAuthConfigUsingHelperNoServerUrlWithToken() throws URISyntaxException, IOException { + final RegistryAuthLocator authLocator = createTestAuthLocator( + "config-with-helper-no-server-url-using-token.json" + ); + + final AuthConfig authConfig = authLocator.lookupAuthConfig( + DockerImageName.parse("registrynoserverurltoken.example.com/org/repo"), + new AuthConfig() + ); + + assertThat(authConfig.getRegistryAddress()) + .as("Fallback (registry) server URL is used") + .isEqualTo("registrynoserverurltoken.example.com"); + assertThat(authConfig.getIdentitytoken()) + .as("Correct identitytoken is obtained from a credential store") + .isEqualTo("secret"); + } + @Test public void lookupAuthConfigWithCredentialsNotFound() throws URISyntaxException, IOException { Map notFoundMessagesReference = new HashMap<>(); diff --git a/core/src/test/resources/auth-config/config-with-helper-no-server-url-using-token.json b/core/src/test/resources/auth-config/config-with-helper-no-server-url-using-token.json new file mode 100644 index 00000000000..836204cd7fb --- /dev/null +++ b/core/src/test/resources/auth-config/config-with-helper-no-server-url-using-token.json @@ -0,0 +1,11 @@ +{ + "auths": { + "registrynoserverurltoken.example.com": {} + }, + "HttpHeaders": { + "User-Agent": "Docker-Client/18.03.0-ce (darwin)" + }, + "credHelpers": { + "registrynoserverurltoken.example.com": "fake" + } +} diff --git a/core/src/test/resources/auth-config/config-with-helper-no-server-url.json b/core/src/test/resources/auth-config/config-with-helper-no-server-url.json new file mode 100644 index 00000000000..2ebe514d547 --- /dev/null +++ b/core/src/test/resources/auth-config/config-with-helper-no-server-url.json @@ -0,0 +1,11 @@ +{ + "auths": { + "registrynoserverurl.example.com": {} + }, + "HttpHeaders": { + "User-Agent": "Docker-Client/18.03.0-ce (darwin)" + }, + "credHelpers": { + "registrynoserverurl.example.com": "fake" + } +} diff --git a/core/src/test/resources/auth-config/docker-credential-fake b/core/src/test/resources/auth-config/docker-credential-fake index 753e62ca347..4a851d93322 100755 --- a/core/src/test/resources/auth-config/docker-credential-fake +++ b/core/src/test/resources/auth-config/docker-credential-fake @@ -31,5 +31,19 @@ if [ "$inputLine" = "registrytoken.example.com" ]; then '}' exit 0 fi +if [ "$inputLine" = "registrynoserverurl.example.com" ]; then + echo '{' \ + ' "Username": "username",' \ + ' "Secret": "secret"' \ + '}' + exit 0 +fi +if [ "$inputLine" = "registrynoserverurltoken.example.com" ]; then + echo '{' \ + ' "Username": "",' \ + ' "Secret": "secret"' \ + '}' + exit 0 +fi exit 1 From a3a0464da38e240ea4f293ba0ff2022d999b0016 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 15 Oct 2024 11:51:26 -0500 Subject: [PATCH 0276/1224] Fix windows test (#9409) --- .../auth-config/win/docker-credential-fake.bat | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/src/test/resources/auth-config/win/docker-credential-fake.bat b/core/src/test/resources/auth-config/win/docker-credential-fake.bat index 4b248973b48..c1095f0908c 100644 --- a/core/src/test/resources/auth-config/win/docker-credential-fake.bat +++ b/core/src/test/resources/auth-config/win/docker-credential-fake.bat @@ -30,5 +30,19 @@ if "%inputLine%" == "registrytoken.example.com" ( echo } exit 0 ) +if "%inputLine%" == "registrynoserverurl.example.com" ( + echo { + echo "Username": "username", + echo "Secret": "secret" + echo } + exit 0 +) +if "%inputLine%" == "registrynoserverurltoken.example.com" ( + echo { + echo "Username": "", + echo "Secret": "secret" + echo } + exit 0 +) exit 1 From 3c7714e5f2b27bcbe73e9b38943218605c81775d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 15 Oct 2024 15:14:34 -0600 Subject: [PATCH 0277/1224] Fix javadoc --- .../java/org/testcontainers/cassandra/CassandraContainer.java | 2 +- .../java/org/testcontainers/containers/CassandraContainer.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java index f8fc5d58dbb..c687c63eaa3 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java @@ -159,7 +159,7 @@ public String getPassword() { /** * Retrieve an {@link InetSocketAddress} for connecting to the Cassandra container via the driver. * - * @return A InetSocketAddrss representation of this Cassandra container's host and port. + * @return A InetSocketAddress representation of this Cassandra container's host and port. */ public InetSocketAddress getContactPoint() { return new InetSocketAddress(getHost(), getMappedPort(CQL_PORT)); 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 0f5c67992c6..fcaada177ce 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/CassandraContainer.java @@ -228,7 +228,7 @@ public static Cluster getCluster(ContainerState containerState) { /** * Retrieve an {@link InetSocketAddress} for connecting to the Cassandra container via the driver. * - * @return A InetSocketAddrss representation of this Cassandra container's host and port. + * @return A InetSocketAddress representation of this Cassandra container's host and port. */ public InetSocketAddress getContactPoint() { return new InetSocketAddress(getHost(), getMappedPort(CQL_PORT)); From e35705bd373bed4c9dd54643e89f71af1ef20e48 Mon Sep 17 00:00:00 2001 From: Ben Date: Wed, 16 Oct 2024 04:28:14 +0200 Subject: [PATCH 0278/1224] Read docker credentials stdout and stderr independently (#8007) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #8006 --------- Co-authored-by: Eddú Meléndez Gonzales --- .../utility/RegistryAuthLocator.java | 142 +++++++++++------- 1 file changed, 85 insertions(+), 57 deletions(-) diff --git a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java index 600a800c0df..00dd8184f51 100644 --- a/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java +++ b/core/src/main/java/org/testcontainers/utility/RegistryAuthLocator.java @@ -12,6 +12,7 @@ import org.testcontainers.DockerClientFactory; import org.zeroturnaround.exec.InvalidResultException; import org.zeroturnaround.exec.ProcessExecutor; +import org.zeroturnaround.exec.stream.LogOutputStream; import java.io.ByteArrayInputStream; import java.io.File; @@ -273,7 +274,7 @@ private AuthConfig runCredentialProvider(String hostName, String helperOrStoreNa } final String credentialProgramName = getCredentialProgramName(helperOrStoreName); - final String data; + final CredentialOutput data; log.debug( "Executing docker credential provider: {} to locate auth config for: {}", @@ -283,37 +284,38 @@ private AuthConfig runCredentialProvider(String hostName, String helperOrStoreNa try { data = runCredentialProgram(hostName, credentialProgramName); - } catch (InvalidResultException e) { - final String responseErrorMsg = extractCredentialProviderErrorMessage(e); - - if (!StringUtils.isBlank(responseErrorMsg)) { - String credentialsNotFoundMsg = getGenericCredentialsNotFoundMsg(credentialProgramName); - if (credentialsNotFoundMsg != null && credentialsNotFoundMsg.equals(responseErrorMsg)) { - log.info( - "Credential helper/store ({}) does not have credentials for {}", + if (data.getStderr() != null && !data.getStderr().isEmpty()) { + final String responseErrorMsg = data.getStderr(); + + if (!StringUtils.isBlank(responseErrorMsg)) { + String credentialsNotFoundMsg = getGenericCredentialsNotFoundMsg(credentialProgramName); + if (credentialsNotFoundMsg != null && credentialsNotFoundMsg.equals(responseErrorMsg)) { + log.info( + "Credential helper/store ({}) does not have credentials for {}", + credentialProgramName, + hostName + ); + + return null; + } + + log.debug( + "Failure running docker credential helper/store ({}) with output '{}'", credentialProgramName, - hostName + responseErrorMsg ); - - return null; + } else { + log.debug("Failure running docker credential helper/store ({})", credentialProgramName); } - log.debug( - "Failure running docker credential helper/store ({}) with output '{}'", - credentialProgramName, - responseErrorMsg - ); - } else { - log.debug("Failure running docker credential helper/store ({})", credentialProgramName); + throw new InvalidResultException(data.getStderr(), null); } - - throw e; } catch (Exception e) { log.debug("Failure running docker credential helper/store ({})", credentialProgramName); throw e; } - final JsonNode helperResponse = OBJECT_MAPPER.readTree(data); + final JsonNode helperResponse = OBJECT_MAPPER.readTree(data.getStdout()); log.debug("Credential helper/store provided auth config for: {}", hostName); final String username = helperResponse.at("/Username").asText(); @@ -363,55 +365,81 @@ private String discoverCredentialsHelperNotFoundMessage(String credentialHelperN String credentialsNotFoundMsg = null; try { - runCredentialProgram(notExistentFakeHostName, credentialHelperName); + CredentialOutput data = runCredentialProgram(notExistentFakeHostName, credentialHelperName); - // should not reach here - log.warn( - "Failure running docker credential helper ({}) with fake call, expected 'credentials not found' response", - credentialHelperName - ); - } catch (Exception e) { - if (e instanceof InvalidResultException) { - credentialsNotFoundMsg = extractCredentialProviderErrorMessage((InvalidResultException) e); - } + if (data.getStderr() != null && !data.getStderr().isEmpty()) { + credentialsNotFoundMsg = data.getStderr(); - if (StringUtils.isBlank(credentialsNotFoundMsg)) { - log.warn( - "Failure running docker credential helper ({}) with fake call, expected 'credentials not found' response. Exception message: {}", - credentialHelperName, - e.getMessage() - ); - } else { log.debug( "Got credentials not found error message from docker credential helper - {}", credentialsNotFoundMsg ); } + } catch (Exception e) { + log.warn( + "Failure running docker credential helper ({}) with fake call, expected 'credentials not found' response. Exception message: {}", + credentialHelperName, + e.getMessage() + ); } return credentialsNotFoundMsg; } - private String extractCredentialProviderErrorMessage(InvalidResultException invalidResultEx) { - if (invalidResultEx.getResult() != null && invalidResultEx.getResult().hasOutput()) { - return invalidResultEx.getResult().outputString().trim(); - } - return null; - } - - private String runCredentialProgram(String hostName, String credentialHelperName) - throws InvalidResultException, InterruptedException, TimeoutException, IOException { + private CredentialOutput runCredentialProgram(String hostName, String credentialHelperName) + throws InterruptedException, TimeoutException, IOException { String[] command = SystemUtils.IS_OS_WINDOWS ? new String[] { "cmd", "/c", credentialHelperName, "get" } : new String[] { credentialHelperName, "get" }; - return new ProcessExecutor() - .command(command) - .redirectInput(new ByteArrayInputStream(hostName.getBytes())) - .readOutput(true) - .exitValueNormal() - .timeout(30, TimeUnit.SECONDS) - .execute() - .outputUTF8() - .trim(); + + StringBuffer stdout = new StringBuffer(); + StringBuffer stderr = new StringBuffer(); + + try { + new ProcessExecutor() + .command(command) + .redirectInput(new ByteArrayInputStream(hostName.getBytes())) + .redirectOutput( + new LogOutputStream() { + @Override + protected void processLine(String line) { + stdout.append(line).append(System.lineSeparator()); + } + } + ) + .redirectError( + new LogOutputStream() { + @Override + protected void processLine(String line) { + stderr.append(line).append(System.lineSeparator()); + } + } + ) + .exitValueNormal() + .timeout(30, TimeUnit.SECONDS) + .execute(); + } catch (InvalidResultException e) {} + + return new CredentialOutput(stdout.toString(), stderr.toString()); + } + + static class CredentialOutput { + + private final String stdout; + + private final String stderr; + + public CredentialOutput(String stdout, String stderr) { + this.stdout = stdout.trim(); + this.stderr = stderr.trim(); + } + + public String getStdout() { + return this.stdout; + } + + public String getStderr() { + return this.stderr; + } } } From fc73325f3790def63084ccb98a9e7708a9dfa7bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 16 Oct 2024 16:10:03 -0500 Subject: [PATCH 0279/1224] Fix execution in windows runner (#9413) Currently, when `/windows-test` command is added the workflow run tests with `main` branch and status is not updated, always listed as skipped. --- .github/workflows/ci-windows.yml | 62 ++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 4f11c59c082..6174a084ef8 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -43,8 +43,8 @@ permissions: contents: read jobs: - core: - if: ${{ (github.event_name == 'push' && github.ref == 'refs/heads/main') || github.event.client_payload.slash_command.command == 'windows-test' }} + main: + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} runs-on: self-hosted permissions: checks: write @@ -53,3 +53,61 @@ jobs: - name: Build with Gradle run: ./gradlew.bat cleanTest testcontainers:test --no-daemon --continue --scan --no-build-cache - uses: ./.github/actions/setup-junit-report + + pr: + if: ${{ github.event.client_payload.slash_command.command == 'windows-test' }} + runs-on: self-hosted + permissions: + checks: write + steps: + - name: Create pending status + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.repos.createStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + sha: context.payload.client_payload.pull_request.head.sha, + state: 'pending', + target_url: `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`, + context: 'CI - Windows', + }) + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} + ref: ${{ github.event.client_payload.pull_request.head.ref }} + - name: Build with Gradle + run: ./gradlew.bat cleanTest testcontainers:test --no-daemon --continue --scan --no-build-cache + - uses: ./.github/actions/setup-junit-report + + - name: Create success status + uses: actions/github-script@v7 + if: success() + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.repos.createStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + sha: context.payload.client_payload.pull_request.head.sha, + state: 'success', + target_url: `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`, + context: 'CI - Windows', + }) + + - name: Create failure status + uses: actions/github-script@v7 + if: failure() + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + github.repos.createStatus({ + owner: context.repo.owner, + repo: context.repo.repo, + sha: context.payload.client_payload.pull_request.head.sha, + state: 'failure', + target_url: `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`, + context: 'CI - Windows', + }) From 593a7d93701b8ec2312a0f4a6fce31a7f9868a03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 16 Oct 2024 15:24:07 -0600 Subject: [PATCH 0280/1224] Fix actions/github-script version to 0.9.0 --- .github/workflows/ci-windows.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 6174a084ef8..0a7e674a050 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -61,7 +61,7 @@ jobs: checks: write steps: - name: Create pending status - uses: actions/github-script@v7 + uses: actions/github-script@0.9.0 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | @@ -83,7 +83,7 @@ jobs: - uses: ./.github/actions/setup-junit-report - name: Create success status - uses: actions/github-script@v7 + uses: actions/github-script@0.9.0 if: success() with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -98,7 +98,7 @@ jobs: }) - name: Create failure status - uses: actions/github-script@v7 + uses: actions/github-script@0.9.0 if: failure() with: github-token: ${{ secrets.GITHUB_TOKEN }} From a8eadcefbeb722b9328c51dbf5c958519f98d979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 16 Oct 2024 15:38:04 -0600 Subject: [PATCH 0281/1224] Update actions/github-script version to v7 --- .github/workflows/ci-windows.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 0a7e674a050..e330d6d9511 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -61,11 +61,11 @@ jobs: checks: write steps: - name: Create pending status - uses: actions/github-script@0.9.0 + uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.repos.createStatus({ + github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha: context.payload.client_payload.pull_request.head.sha, @@ -83,12 +83,12 @@ jobs: - uses: ./.github/actions/setup-junit-report - name: Create success status - uses: actions/github-script@0.9.0 + uses: actions/github-script@v7 if: success() with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.repos.createStatus({ + github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha: context.payload.client_payload.pull_request.head.sha, @@ -98,12 +98,12 @@ jobs: }) - name: Create failure status - uses: actions/github-script@0.9.0 + uses: actions/github-script@v7 if: failure() with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | - github.repos.createStatus({ + github.rest.repos.createCommitStatus({ owner: context.repo.owner, repo: context.repo.repo, sha: context.payload.client_payload.pull_request.head.sha, From 631a4c03efea310cf614e5def442aef56ceca692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 16 Oct 2024 16:03:05 -0600 Subject: [PATCH 0282/1224] Give write permission to statuses in windows workflow --- .github/workflows/ci-windows.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index e330d6d9511..f8b89b4ab0c 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -59,6 +59,7 @@ jobs: runs-on: self-hosted permissions: checks: write + statuses: write steps: - name: Create pending status uses: actions/github-script@v7 From 351516c0c2f398b01cfb014941254ee918fccf79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 16 Oct 2024 18:46:55 -0600 Subject: [PATCH 0283/1224] Fix github action url in slack payload --- .github/workflows/moby-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index 7ef7a1c7ff8..b31294b98d1 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -50,7 +50,7 @@ jobs: { "tc_project": "testcontainers-java", "tc_docker_install_type": "${{ matrix.install-docker-type }}", - "tc_github_action_url": "https://github.com/testcontainers/testcontainers-java/actions/runs/${{ env.GITHUB_RUN_ID }}/job/${{ env.GITHUB_RUN_NUMBER }}", + "tc_github_action_url": "${{ GITHUB_SERVER_URL }}/${{ GITHUB_REPOSITORY }}/actions/runs/${{ GITHUB_RUN_ID }}/job/${{ GITHUB_RUN_NUMBER }}", "tc_github_action_status": "FAILED", "tc_slack_channel_id": "${{ secrets.SLACK_DOCKER_LATEST_CHANNEL_ID }}" } From b78514f9907a73c393468f99ea967d03bac81887 Mon Sep 17 00:00:00 2001 From: livk <50291874+livk-cloud@users.noreply.github.com> Date: Fri, 18 Oct 2024 03:28:18 +0800 Subject: [PATCH 0284/1224] Add r2dbc support for Clickhouse (#8434) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #8427 --------- Co-authored-by: Eddú Meléndez --- docs/modules/databases/r2dbc.md | 4 ++ modules/clickhouse/build.gradle | 7 ++- .../clickhouse/ClickHouseContainer.java | 16 +++++-- .../ClickHouseR2DBCDatabaseContainer.java | 48 +++++++++++++++++++ ...ckHouseR2DBCDatabaseContainerProvider.java | 46 ++++++++++++++++++ ...iners.r2dbc.R2DBCDatabaseContainerProvider | 1 + .../testcontainers/ClickhouseTestImages.java | 1 - .../ClickHouseR2DBCDatabaseContainerTest.java | 22 +++++++++ .../clickhouse/SimpleClickhouseTest.java | 1 - 9 files changed, 138 insertions(+), 8 deletions(-) create mode 100644 modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseR2DBCDatabaseContainer.java create mode 100644 modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseR2DBCDatabaseContainerProvider.java create mode 100644 modules/clickhouse/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseR2DBCDatabaseContainerTest.java diff --git a/docs/modules/databases/r2dbc.md b/docs/modules/databases/r2dbc.md index 22c76e83dd8..055d4ad7b0f 100644 --- a/docs/modules/databases/r2dbc.md +++ b/docs/modules/databases/r2dbc.md @@ -33,6 +33,10 @@ So that the URL becomes: ### R2DBC URL examples +#### Using ClickHouse + +`r2dbc:tc:clickhouse:///databasename?TC_IMAGE_TAG=21.9.2-alpine` + #### Using MySQL `r2dbc:tc:mysql:///databasename?TC_IMAGE_TAG=8.0.36` diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index fadec21f17e..6dec2131bde 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -4,7 +4,12 @@ dependencies { api project(':testcontainers') api project(':jdbc') + compileOnly project(':r2dbc') + compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.0', classifier: 'http') + testImplementation project(':jdbc-test') - testRuntimeOnly 'ru.yandex.clickhouse:clickhouse-jdbc:0.3.2' + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.7.0', classifier: 'http') testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation testFixtures(project(':r2dbc')) + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.0', classifier: 'http') } diff --git a/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java b/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java index f65177ce68a..f8e4826932c 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java @@ -23,11 +23,13 @@ public class ClickHouseContainer extends JdbcDatabaseContainer { + + @Override + protected ConnectionFactoryOptions getOptions(ClickHouseContainer container) { + return ClickHouseR2DBCDatabaseContainer.getOptions(container); + } + + @Override + protected String createR2DBCUrl() { + return "r2dbc:tc:clickhouse:///db?TC_IMAGE_TAG=21.9.2-alpine"; + } + + @Override + protected ClickHouseContainer createContainer() { + return new ClickHouseContainer("clickhouse/clickhouse-server:21.9.2-alpine"); + } +} diff --git a/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java index 8f81c88bfc0..eb33274ce6b 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java @@ -26,7 +26,6 @@ public SimpleClickhouseTest(DockerImageName imageName) { public static Object[][] data() { return new Object[][] { // { ClickhouseTestImages.CLICKHOUSE_IMAGE }, - { ClickhouseTestImages.YANDEX_CLICKHOUSE_IMAGE }, }; } From e219477088df17f1616a60b61cb226318421a1b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 17 Oct 2024 16:20:15 -0500 Subject: [PATCH 0285/1224] Update ryuk version to 0.10.2 (#9372) --- .../src/main/java/org/testcontainers/utility/RyukContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/utility/RyukContainer.java b/core/src/main/java/org/testcontainers/utility/RyukContainer.java index a39b276e56f..8d00ec15189 100644 --- a/core/src/main/java/org/testcontainers/utility/RyukContainer.java +++ b/core/src/main/java/org/testcontainers/utility/RyukContainer.java @@ -9,7 +9,7 @@ class RyukContainer extends GenericContainer { RyukContainer() { - super("testcontainers/ryuk:0.9.0"); + super("testcontainers/ryuk:0.10.2"); withExposedPorts(8080); withCreateContainerCmdModifier(cmd -> { cmd.withName("testcontainers-ryuk-" + DockerClientFactory.SESSION_ID); From 29b0c5fbea772a60ece684433e9e219ec0384740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 18 Oct 2024 00:55:27 -0600 Subject: [PATCH 0286/1224] Remove unused constant --- .../org/testcontainers/containers/GenericContainer.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 4246e620d5b..52dede8792e 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -34,8 +34,6 @@ import org.jetbrains.annotations.Nullable; import org.junit.runner.Description; import org.junit.runners.model.Statement; -import org.rnorth.ducttape.ratelimits.RateLimiter; -import org.rnorth.ducttape.ratelimits.RateLimiterBuilder; import org.rnorth.ducttape.unreliables.Unreliables; import org.slf4j.Logger; import org.testcontainers.DockerClientFactory; @@ -193,12 +191,6 @@ public class GenericContainer> private static final Set AVAILABLE_IMAGE_NAME_CACHE = new HashSet<>(); - private static final RateLimiter DOCKER_CLIENT_RATE_LIMITER = RateLimiterBuilder - .newBuilder() - .withRate(1, TimeUnit.SECONDS) - .withConstantThroughput() - .build(); - @Nullable private Map tmpFsMapping; From cdf44665ec0a2196cbd21932cfc4dd102c979a91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 18 Oct 2024 18:52:42 -0500 Subject: [PATCH 0287/1224] Pin OceanBase image (#9416) Current version 4.2.1-lts is a mutable image and it has been failing in CI. We are pinning to tag 4.2.1.8-108000022024072217. --- .../testcontainers/oceanbase/OceanBaseCEContainerProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainerProvider.java b/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainerProvider.java index 36c260ead37..2a62558b6c4 100644 --- a/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainerProvider.java +++ b/modules/oceanbase/src/main/java/org/testcontainers/oceanbase/OceanBaseCEContainerProvider.java @@ -9,7 +9,7 @@ */ public class OceanBaseCEContainerProvider extends JdbcDatabaseContainerProvider { - private static final String DEFAULT_TAG = "4.2.1-lts"; + private static final String DEFAULT_TAG = "4.2.1.8-108000022024072217"; @Override public boolean supports(String databaseType) { From cd29df97aa06e744ed4d8c17ca33b7983ef7f338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 18 Oct 2024 19:25:11 -0500 Subject: [PATCH 0288/1224] Introduce new property to configure pull.timeout (#9417) Currently, the pull timeout is set to 2 minutes. This commit introduces a new property `pull.timeout` to be configured in seconds. Fixes #9191 --- .../java/org/testcontainers/images/RemoteDockerImage.java | 5 ++++- .../testcontainers/utility/TestcontainersConfiguration.java | 4 ++++ docs/features/configuration.md | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java index e97b4afad23..9d669e46b07 100644 --- a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java +++ b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java @@ -22,6 +22,7 @@ import org.testcontainers.utility.DockerLoggerFactory; import org.testcontainers.utility.ImageNameSubstitutor; import org.testcontainers.utility.LazyFuture; +import org.testcontainers.utility.TestcontainersConfiguration; import java.time.Duration; import java.time.Instant; @@ -35,7 +36,9 @@ @AllArgsConstructor(access = AccessLevel.PACKAGE) public class RemoteDockerImage extends LazyFuture { - private static final Duration PULL_RETRY_TIME_LIMIT = Duration.ofMinutes(2); + private static final Duration PULL_RETRY_TIME_LIMIT = Duration.ofSeconds( + TestcontainersConfiguration.getInstance().getImagePullTimeout() + ); @ToString.Exclude private Future imageNameFuture; diff --git a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java index e67a0b83ee2..5c80b82ba9c 100644 --- a/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java +++ b/core/src/main/java/org/testcontainers/utility/TestcontainersConfiguration.java @@ -208,6 +208,10 @@ public Integer getImagePullPauseTimeout() { return Integer.parseInt(getEnvVarOrProperty("pull.pause.timeout", "30")); } + public Integer getImagePullTimeout() { + return Integer.parseInt(getEnvVarOrProperty("pull.timeout", "120")); + } + public String getImageSubstitutorClassName() { return getEnvVarOrProperty("image.substitutor", null); } diff --git a/docs/features/configuration.md b/docs/features/configuration.md index d874b16ad7b..3350c6018e7 100644 --- a/docs/features/configuration.md +++ b/docs/features/configuration.md @@ -90,6 +90,9 @@ but does not allow starting privileged containers, you can turn off the Ryuk con ## Customizing image pull behaviour +> **pull.timeout = 120** +> By default Testcontainers will timeout if pull takes more than this duration (in seconds) + > **pull.pause.timeout = 30** > By default Testcontainers will abort the pull of an image if the pull appears stalled (no data transferred) for longer than this duration (in seconds). From f52169fa9502fb28aa236f9874ef333c3348dacf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 21 Oct 2024 14:12:19 -0500 Subject: [PATCH 0289/1224] Parse docker compose file correctly when version is not declared (#9420) `version` is optional in compose file. Fixes #8109 --- .../containers/ParsedDockerComposeFile.java | 18 +++++++++--------- .../ParsedDockerComposeFileValidationTest.java | 13 +++++++++++++ ...compose-imagename-parsing-v2-no-version.yml | 9 +++++++++ 3 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 core/src/test/resources/docker-compose-imagename-parsing-v2-no-version.yml diff --git a/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java b/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java index b5b11686491..d797a86bfbf 100644 --- a/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java +++ b/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java @@ -78,16 +78,16 @@ protected Object constructObject(Node node) { private void parseAndValidate() { final Map servicesMap; - if (composeFileContent.containsKey("version")) { - if ("2.0".equals(composeFileContent.get("version"))) { - log.warn( - "Testcontainers may not be able to clean up networks spawned using Docker Compose v2.0 files. " + - "Please see https://github.com/testcontainers/moby-ryuk/issues/2, and specify 'version: \"2.1\"' or " + - "higher in {}", - composeFileName - ); - } + if (composeFileContent.containsKey("version") && "2.0".equals(composeFileContent.get("version"))) { + log.warn( + "Testcontainers may not be able to clean up networks spawned using Docker Compose v2.0 files. " + + "Please see https://github.com/testcontainers/moby-ryuk/issues/2, and specify 'version: \"2.1\"' or " + + "higher in {}", + composeFileName + ); + } + if (composeFileContent.containsKey("services")) { final Object servicesElement = composeFileContent.get("services"); if (servicesElement == null) { log.debug( diff --git a/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java b/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java index 08b2746b386..9067d77d825 100644 --- a/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java +++ b/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java @@ -111,6 +111,19 @@ public void shouldObtainImageNamesV2() { ); } + @Test + public void shouldObtainImageNamesV2WithNoVersionTag() { + File file = new File("src/test/resources/docker-compose-imagename-parsing-v2-no-version.yml"); + ParsedDockerComposeFile parsedFile = new ParsedDockerComposeFile(file); + assertThat(parsedFile.getServiceNameToImageNames()) + .as("all defined images are found") + .contains( + entry("mysql", Sets.newHashSet("mysql")), + entry("redis", Sets.newHashSet("redis")), + entry("custom", Sets.newHashSet("postgres")) + ); + } + @Test public void shouldObtainImageFromDockerfileBuild() { File file = new File("src/test/resources/docker-compose-imagename-parsing-dockerfile.yml"); diff --git a/core/src/test/resources/docker-compose-imagename-parsing-v2-no-version.yml b/core/src/test/resources/docker-compose-imagename-parsing-v2-no-version.yml new file mode 100644 index 00000000000..0b48ad3eb05 --- /dev/null +++ b/core/src/test/resources/docker-compose-imagename-parsing-v2-no-version.yml @@ -0,0 +1,9 @@ +services: + redis: + image: redis + mysql: + image: mysql + custom: + build: . +networks: + custom_network: {} From e7fc11364ba82d817d3761395ccc6e92178e6cdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 21 Oct 2024 18:07:33 -0600 Subject: [PATCH 0290/1224] Switch to github context property --- .github/workflows/moby-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index b31294b98d1..e6030c865a4 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -50,7 +50,7 @@ jobs: { "tc_project": "testcontainers-java", "tc_docker_install_type": "${{ matrix.install-docker-type }}", - "tc_github_action_url": "${{ GITHUB_SERVER_URL }}/${{ GITHUB_REPOSITORY }}/actions/runs/${{ GITHUB_RUN_ID }}/job/${{ GITHUB_RUN_NUMBER }}", + "tc_github_action_url": "${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/job/${{ github.run_number }}", "tc_github_action_status": "FAILED", "tc_slack_channel_id": "${{ secrets.SLACK_DOCKER_LATEST_CHANNEL_ID }}" } From 7c024edb1bf26ce8fb1a884e9ea862b455878774 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 21 Oct 2024 19:55:10 -0500 Subject: [PATCH 0291/1224] Declarative R2DBC SPI implementation (#9447) Avoid usage of `com.google.auto.service:auto-service`. --- modules/mariadb/build.gradle | 3 --- .../containers/MariaDBR2DBCDatabaseContainerProvider.java | 2 -- .../org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider | 1 + modules/mssqlserver/build.gradle | 3 --- .../containers/MSSQLR2DBCDatabaseContainerProvider.java | 2 -- .../org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider | 1 + modules/mysql/build.gradle | 3 --- .../containers/MySQLR2DBCDatabaseContainerProvider.java | 2 -- .../org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider | 1 + modules/oracle-free/build.gradle | 3 --- .../oracle/OracleR2DBCDatabaseContainerProvider.java | 2 -- .../org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider | 1 + modules/oracle-xe/build.gradle | 3 --- .../containers/OracleR2DBCDatabaseContainerProvider.java | 2 -- .../org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider | 1 + modules/postgresql/build.gradle | 3 --- .../containers/PostgreSQLR2DBCDatabaseContainerProvider.java | 2 -- .../org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider | 1 + modules/r2dbc/build.gradle | 3 --- .../r2dbc/src/main/java/org/testcontainers/r2dbc/Hidden.java | 2 -- .../META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider | 1 + 21 files changed, 7 insertions(+), 35 deletions(-) create mode 100644 modules/mariadb/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/mssqlserver/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/mysql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/oracle-free/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/oracle-xe/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/postgresql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider create mode 100644 modules/r2dbc/src/main/resources/META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle index fa47370764e..88734091907 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -1,9 +1,6 @@ description = "Testcontainers :: JDBC :: MariaDB" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':jdbc') compileOnly project(':r2dbc') diff --git a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerProvider.java b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerProvider.java index 6994ab44dff..34635ac239f 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerProvider.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBR2DBCDatabaseContainerProvider.java @@ -1,6 +1,5 @@ package org.testcontainers.containers; -import com.google.auto.service.AutoService; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; import org.mariadb.r2dbc.MariadbConnectionFactoryProvider; @@ -9,7 +8,6 @@ import javax.annotation.Nullable; -@AutoService(R2DBCDatabaseContainerProvider.class) public class MariaDBR2DBCDatabaseContainerProvider implements R2DBCDatabaseContainerProvider { static final String DRIVER = MariadbConnectionFactoryProvider.MARIADB_DRIVER; diff --git a/modules/mariadb/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider b/modules/mariadb/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider new file mode 100644 index 00000000000..0c312685de9 --- /dev/null +++ b/modules/mariadb/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.containers.MariaDBR2DBCDatabaseContainerProvider diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle index 257d8954709..e7541434291 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -1,9 +1,6 @@ description = "Testcontainers :: MS SQL Server" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':jdbc') compileOnly project(':r2dbc') diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerProvider.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerProvider.java index fe7ada669bd..f829ddb8f1f 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerProvider.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLR2DBCDatabaseContainerProvider.java @@ -1,6 +1,5 @@ package org.testcontainers.containers; -import com.google.auto.service.AutoService; import io.r2dbc.mssql.MssqlConnectionFactoryProvider; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; @@ -9,7 +8,6 @@ import javax.annotation.Nullable; -@AutoService(R2DBCDatabaseContainerProvider.class) public class MSSQLR2DBCDatabaseContainerProvider implements R2DBCDatabaseContainerProvider { static final String DRIVER = MssqlConnectionFactoryProvider.MSSQL_DRIVER; diff --git a/modules/mssqlserver/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider b/modules/mssqlserver/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider new file mode 100644 index 00000000000..0ec6b22ddf6 --- /dev/null +++ b/modules/mssqlserver/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.containers.MSSQLR2DBCDatabaseContainerProvider diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index beef298197d..d31fbcce266 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -1,9 +1,6 @@ description = "Testcontainers :: JDBC :: MySQL" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':jdbc') compileOnly project(':r2dbc') diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerProvider.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerProvider.java index bf74e8ec27a..97f7f4a243d 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerProvider.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLR2DBCDatabaseContainerProvider.java @@ -1,6 +1,5 @@ package org.testcontainers.containers; -import com.google.auto.service.AutoService; import io.asyncer.r2dbc.mysql.MySqlConnectionFactoryProvider; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; @@ -9,7 +8,6 @@ import javax.annotation.Nullable; -@AutoService(R2DBCDatabaseContainerProvider.class) public class MySQLR2DBCDatabaseContainerProvider implements R2DBCDatabaseContainerProvider { static final String DRIVER = MySqlConnectionFactoryProvider.MYSQL_DRIVER; diff --git a/modules/mysql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider b/modules/mysql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider new file mode 100644 index 00000000000..88cab78dc2e --- /dev/null +++ b/modules/mysql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.containers.MySQLR2DBCDatabaseContainerProvider diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index 2765c99fd92..9f1cebf0132 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -1,9 +1,6 @@ description = "Testcontainers :: JDBC :: Oracle Database Free" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':jdbc') compileOnly project(':r2dbc') diff --git a/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainerProvider.java b/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainerProvider.java index 6fe809aa214..d8fe1ee7084 100644 --- a/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainerProvider.java +++ b/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainerProvider.java @@ -1,13 +1,11 @@ package org.testcontainers.oracle; -import com.google.auto.service.AutoService; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; import org.jetbrains.annotations.Nullable; import org.testcontainers.r2dbc.R2DBCDatabaseContainer; import org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider; -@AutoService(R2DBCDatabaseContainerProvider.class) public class OracleR2DBCDatabaseContainerProvider implements R2DBCDatabaseContainerProvider { static final String DRIVER = "oracle"; diff --git a/modules/oracle-free/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider b/modules/oracle-free/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider new file mode 100644 index 00000000000..20465a3e57b --- /dev/null +++ b/modules/oracle-free/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.oracle.OracleR2DBCDatabaseContainerProvider diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index d3caec05e86..43506725f82 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -1,9 +1,6 @@ description = "Testcontainers :: JDBC :: Oracle XE" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':jdbc') compileOnly project(':r2dbc') diff --git a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleR2DBCDatabaseContainerProvider.java b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleR2DBCDatabaseContainerProvider.java index 4d6a03530c2..35a98fda77d 100644 --- a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleR2DBCDatabaseContainerProvider.java +++ b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleR2DBCDatabaseContainerProvider.java @@ -1,13 +1,11 @@ package org.testcontainers.containers; -import com.google.auto.service.AutoService; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; import org.jetbrains.annotations.Nullable; import org.testcontainers.r2dbc.R2DBCDatabaseContainer; import org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider; -@AutoService(R2DBCDatabaseContainerProvider.class) public class OracleR2DBCDatabaseContainerProvider implements R2DBCDatabaseContainerProvider { static final String DRIVER = "oracle"; diff --git a/modules/oracle-xe/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider b/modules/oracle-xe/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider new file mode 100644 index 00000000000..cd1df0b4488 --- /dev/null +++ b/modules/oracle-xe/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.containers.OracleR2DBCDatabaseContainerProvider diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle index 834656a3dac..23ad800186b 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -1,9 +1,6 @@ description = "Testcontainers :: JDBC :: PostgreSQL" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':jdbc') compileOnly project(':r2dbc') diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerProvider.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerProvider.java index 6b4a81c5e40..f1bdf67ee5c 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerProvider.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLR2DBCDatabaseContainerProvider.java @@ -1,6 +1,5 @@ package org.testcontainers.containers; -import com.google.auto.service.AutoService; import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; @@ -9,7 +8,6 @@ import javax.annotation.Nullable; -@AutoService(R2DBCDatabaseContainerProvider.class) public final class PostgreSQLR2DBCDatabaseContainerProvider implements R2DBCDatabaseContainerProvider { static final String DRIVER = PostgresqlConnectionFactoryProvider.POSTGRESQL_DRIVER; diff --git a/modules/postgresql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider b/modules/postgresql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider new file mode 100644 index 00000000000..6224c0e6093 --- /dev/null +++ b/modules/postgresql/src/main/resources/META-INF/services/org.testcontainers.r2dbc.R2DBCDatabaseContainerProvider @@ -0,0 +1 @@ +org.testcontainers.containers.PostgreSQLR2DBCDatabaseContainerProvider diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index a440af1dc97..1415df161fa 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -5,9 +5,6 @@ plugins { description = "Testcontainers :: R2DBC" dependencies { - annotationProcessor 'com.google.auto.service:auto-service:1.1.1' - compileOnly 'com.google.auto.service:auto-service:1.1.1' - api project(':testcontainers') api 'io.r2dbc:r2dbc-spi:0.9.0.RELEASE' diff --git a/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/Hidden.java b/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/Hidden.java index 5d9de2025a0..327ad6ab9ca 100644 --- a/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/Hidden.java +++ b/modules/r2dbc/src/main/java/org/testcontainers/r2dbc/Hidden.java @@ -1,6 +1,5 @@ package org.testcontainers.r2dbc; -import com.google.auto.service.AutoService; import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactoryOptions; import io.r2dbc.spi.ConnectionFactoryProvider; @@ -10,7 +9,6 @@ */ class Hidden { - @AutoService(ConnectionFactoryProvider.class) public static final class TestcontainersR2DBCConnectionFactoryProvider implements ConnectionFactoryProvider { public static final String DRIVER = "tc"; diff --git a/modules/r2dbc/src/main/resources/META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider b/modules/r2dbc/src/main/resources/META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider new file mode 100644 index 00000000000..23f1702c57a --- /dev/null +++ b/modules/r2dbc/src/main/resources/META-INF/services/io.r2dbc.spi.ConnectionFactoryProvider @@ -0,0 +1 @@ +org.testcontainers.r2dbc.Hidden$TestcontainersR2DBCConnectionFactoryProvider From 4f9594d5c1df72851ec174f75679726f6b892ef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 21 Oct 2024 20:49:19 -0500 Subject: [PATCH 0292/1224] Add support for apachepulsar/pulsar-all image (#9448) `apachepulsar/pulsar-all` brings connectors in the image. --- .../containers/PulsarContainer.java | 4 +- .../containers/AbstractPulsar.java | 67 +++++++++++++++++++ .../CompatibleApachePulsarImageTest.java | 41 ++++++++++++ .../containers/PulsarContainerTest.java | 62 +---------------- 4 files changed, 113 insertions(+), 61 deletions(-) create mode 100644 modules/pulsar/src/test/java/org/testcontainers/containers/AbstractPulsar.java create mode 100644 modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java 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 0181d7144d9..36485ad76a0 100644 --- a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java +++ b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java @@ -7,7 +7,7 @@ /** * Testcontainers implementation for Apache Pulsar. *

    - * Supported image: {@code apachepulsar/pulsar} + * Supported images: {@code apachepulsar/pulsar}, {@code apachepulsar/pulsar-all} *

    * Exposed ports: *

    */ -public class AzureEventHubsContainer extends GenericContainer { +public class EventHubsEmulatorContainer extends GenericContainer { private static final int DEFAULT_AMQP_PORT = 5672; @@ -32,14 +32,14 @@ public class AzureEventHubsContainer extends GenericContainer * Exposed port: 5672 */ -public class AzureServiceBusContainer extends GenericContainer { +public class ServiceBusEmulatorContainer extends GenericContainer { private static final String CONNECTION_STRING_FORMAT = "Endpoint=sb://%s:%d;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=SAS_KEY_VALUE;UseDevelopmentEmulator=true;"; @@ -30,14 +30,14 @@ public class AzureServiceBusContainer extends GenericContainer msSqlServerContainer) { + public ServiceBusEmulatorContainer withMsSqlServerContainer(final MSSQLServerContainer msSqlServerContainer) { dependsOn(msSqlServerContainer); this.msSqlServerContainer = msSqlServerContainer; return this; @@ -62,7 +62,7 @@ public AzureServiceBusContainer withMsSqlServerContainer(final MSSQLServerContai * @param config The configuration * @return this */ - public AzureServiceBusContainer withConfig(final Transferable config) { + public ServiceBusEmulatorContainer withConfig(final Transferable config) { withCopyToContainer(config, "/ServiceBus_Emulator/ConfigFiles/Config.json"); return this; } @@ -72,7 +72,7 @@ public AzureServiceBusContainer withConfig(final Transferable config) { * * @return this */ - public AzureServiceBusContainer acceptLicense() { + public ServiceBusEmulatorContainer acceptLicense() { withEnv("ACCEPT_EULA", "Y"); return this; } diff --git a/modules/azure/src/test/java/org/testcontainers/azure/AzureEventHubsContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java similarity index 95% rename from modules/azure/src/test/java/org/testcontainers/azure/AzureEventHubsContainerTest.java rename to modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java index c0febc2ed86..58d1d7ad59c 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/AzureEventHubsContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java @@ -19,7 +19,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.waitAtMost; -public class AzureEventHubsContainerTest { +public class EventHubsEmulatorContainerTest { @Rule // network { @@ -36,7 +36,7 @@ public class AzureEventHubsContainerTest { @Rule // emulatorContainer { - public AzureEventHubsContainer emulator = new AzureEventHubsContainer( + public EventHubsEmulatorContainer emulator = new EventHubsEmulatorContainer( "mcr.microsoft.com/azure-messaging/eventhubs-emulator:2.0.1" ) .acceptLicense() diff --git a/modules/azure/src/test/java/org/testcontainers/azure/AzureServiceBusContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java similarity index 96% rename from modules/azure/src/test/java/org/testcontainers/azure/AzureServiceBusContainerTest.java rename to modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java index f581de19ab8..781a2d24566 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/AzureServiceBusContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java @@ -23,7 +23,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -public class AzureServiceBusContainerTest { +public class ServiceBusEmulatorContainerTest { @Rule // network { @@ -47,7 +47,7 @@ public class AzureServiceBusContainerTest { @Rule // emulatorContainer { - public AzureServiceBusContainer emulator = new AzureServiceBusContainer( + public ServiceBusEmulatorContainer emulator = new ServiceBusEmulatorContainer( "mcr.microsoft.com/azure-messaging/servicebus-emulator:1.0.1" ) .acceptLicense() From 13b6365182293bd107f221d9f9358e1a635042a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 19 Feb 2025 14:40:11 -0600 Subject: [PATCH 0417/1224] Rename Picone implementation --- docs/modules/pinecone.md | 8 ++++---- ...PineconeContainer.java => PineconeLocalContainer.java} | 6 +++--- ...ContainerTest.java => PineconeLocalContainerTest.java} | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename modules/pinecone/src/main/java/org/testcontainers/pinecone/{PineconeContainer.java => PineconeLocalContainer.java} (77%) rename modules/pinecone/src/test/java/org/testcontainers/pinecone/{PineconeContainerTest.java => PineconeLocalContainerTest.java} (86%) diff --git a/docs/modules/pinecone.md b/docs/modules/pinecone.md index 77feaadcf4c..b4eac925c51 100644 --- a/docs/modules/pinecone.md +++ b/docs/modules/pinecone.md @@ -1,13 +1,13 @@ # Pinecone -Testcontainers module for [Pinecone](https://github.com/orgs/pinecone-io/packages/container/package/pinecone-local). +Testcontainers module for [Pinecone Local](https://github.com/orgs/pinecone-io/packages/container/package/pinecone-local). -## PineconeContainer's usage examples +## PineconeLocalContainer's usage examples -You can start an Pinecone container instance from any Java application by using: +You can start a Pinecone container instance from any Java application by using: -[Pinecone container](../../modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java) inside_block:container +[Pinecone container](../../modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java) inside_block:container ## Adding this module to your project dependencies diff --git a/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeContainer.java b/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeLocalContainer.java similarity index 77% rename from modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeContainer.java rename to modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeLocalContainer.java index 845b62aa075..56c846872de 100644 --- a/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeContainer.java +++ b/modules/pinecone/src/main/java/org/testcontainers/pinecone/PineconeLocalContainer.java @@ -8,7 +8,7 @@ *

    * Exposed port: 5080 */ -public class PineconeContainer extends GenericContainer { +public class PineconeLocalContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( "ghcr.io/pinecone-io/pinecone-local" @@ -16,11 +16,11 @@ public class PineconeContainer extends GenericContainer { private static final int PORT = 5080; - public PineconeContainer(String dockerImageName) { + public PineconeLocalContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } - public PineconeContainer(DockerImageName dockerImageName) { + public PineconeLocalContainer(DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); diff --git a/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java b/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java similarity index 86% rename from modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java rename to modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java index 0e8f2778605..5843dfef81c 100644 --- a/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeContainerTest.java +++ b/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java @@ -7,12 +7,12 @@ import static org.assertj.core.api.Assertions.assertThat; -public class PineconeContainerTest { +public class PineconeLocalContainerTest { @Test public void testSimple() { try ( // container { - PineconeContainer container = new PineconeContainer("ghcr.io/pinecone-io/pinecone-local:v0.7.0") + PineconeLocalContainer container = new PineconeLocalContainer("ghcr.io/pinecone-io/pinecone-local:v0.7.0") // } ) { container.start(); From 6ed48215dda976ecafc70f1d37332c6b76ee7f51 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:11:27 -0600 Subject: [PATCH 0418/1224] [create-pull-request] automated change (#9995) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 0245c2f1419..03dfdd7f9e3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -139,4 +139,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 1.20.4 + latest_version: 1.20.5 From 5af66d700e942474afabd8e550bf089196fdb5f9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 19 Feb 2025 16:11:45 -0600 Subject: [PATCH 0419/1224] [create-pull-request] automated change (#9996) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index be57d9abd98..37cf8aeb3de 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=1.20.4 +testcontainers.version=1.20.5 From 6e104da1d6e8a4188451f556e9c7cb4ce8eb3164 Mon Sep 17 00:00:00 2001 From: julianladisch Date: Fri, 21 Feb 2025 14:51:07 +0100 Subject: [PATCH 0420/1224] Bump confluentinc/cp-kcat from 7.4.1 to 7.9.0 (#10000) --- .../src/test/java/org/testcontainers/KCatContainer.java | 2 +- .../org/testcontainers/containers/KafkaContainerTest.java | 2 +- .../org/testcontainers/redpanda/RedpandaContainerTest.java | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java b/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java index 84ad97b52b7..79532ae9f22 100644 --- a/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java +++ b/modules/kafka/src/test/java/org/testcontainers/KCatContainer.java @@ -6,7 +6,7 @@ public class KCatContainer extends GenericContainer { public KCatContainer() { - super("confluentinc/cp-kcat:7.4.1"); + super("confluentinc/cp-kcat:7.9.0"); withCreateContainerCmdModifier(cmd -> { cmd.withEntrypoint("sh"); }); diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java index 6d3578f7833..f2a86020701 100644 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java @@ -195,7 +195,7 @@ public void testUsageWithListener() throws Exception { .withNetwork(network); // } // createKCatContainer { - GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") + GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.9.0") .withCreateContainerCmdModifier(cmd -> { cmd.withEntrypoint("sh"); }) diff --git a/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java b/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java index 605ad76510a..d07f33d8b00 100644 --- a/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java +++ b/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java @@ -111,7 +111,7 @@ public void testUsageWithListener() throws Exception { RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") .withListener(() -> "redpanda:19092") .withNetwork(network); - GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") + GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.9.0") .withCreateContainerCmdModifier(cmd -> { cmd.withEntrypoint("sh"); }) @@ -141,7 +141,7 @@ public void testUsageWithListenerInTheSameNetwork() throws Exception { .withNetwork(network); // } // createKCatContainer { - GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") + GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.9.0") .withCreateContainerCmdModifier(cmd -> { cmd.withEntrypoint("sh"); }) @@ -200,7 +200,7 @@ public void testUsageWithListenerAndSasl() throws Exception { .withSuperuser("panda") .withListener("my-panda:29092") .withNetwork(network); - GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.4.1") + GenericContainer kcat = new GenericContainer<>("confluentinc/cp-kcat:7.9.0") .withCreateContainerCmdModifier(cmd -> { cmd.withEntrypoint("sh"); }) From 2ee1ad5595215b6e41a1a5367107567633d737cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:07:26 +0000 Subject: [PATCH 0421/1224] Bump org.awaitility:awaitility from 4.2.0 to 4.3.0 in /modules/solace Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index fb83eede28c..bf118e88b4e 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Solace" dependencies { api project(':testcontainers') - shaded 'org.awaitility:awaitility:4.2.0' + shaded 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.solacesystems:sol-jcsmp:10.24.1' From 82357281478493d74f3ca10fd1fb564e44b80579 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:24:18 +0000 Subject: [PATCH 0422/1224] Bump org.awaitility:awaitility from 4.2.0 to 4.3.0 in /modules/questdb Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 01bc5473247..e369c1464d5 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -8,6 +8,6 @@ dependencies { testImplementation project(':jdbc-test') testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.questdb:questdb:7.3.9' - testImplementation 'org.awaitility:awaitility:4.2.0' + testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } From da27d34006d570380abfe539249354ea447b3a9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Feb 2025 23:28:26 +0000 Subject: [PATCH 0423/1224] Bump org.awaitility:awaitility from 4.2.2 to 4.3.0 in /modules/kafka Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.2 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.2...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 5f0658a51d0..6b39a0574e7 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' - testImplementation 'org.awaitility:awaitility:4.2.2' + testImplementation 'org.awaitility:awaitility:4.3.0' } From 576e65a5d0a2636bfa21fed42be8b1a7df93ec25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 27 Feb 2025 11:37:45 -0600 Subject: [PATCH 0424/1224] Fix spock module to compile using Java 8 Fixes #10036 --- modules/spock/build.gradle | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle index d6af49fecbe..f016e5624d6 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -23,6 +23,11 @@ dependencies { testCompileOnly 'org.jetbrains:annotations:24.1.0' } +tasks.withType(GroovyCompile) { + options.release.set(8) + options.encoding = 'UTF-8' +} + sourceJar { /* allJava is default (see gradle/publishing.gradle:sourceJar) allSource contains both .java and .groovy files */ From 93a2edadcdcc2640d4344f75dfbf0215b15f669a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 4 Mar 2025 11:06:38 -0600 Subject: [PATCH 0425/1224] Update ubuntu version to 22.04 --- .github/workflows/release.yml | 2 +- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-testcontainers-version.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 4586838d0d9..7adfda8a4c8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -13,7 +13,7 @@ permissions: jobs: release: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup-java diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index b6501902995..96a4d6050a9 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -13,7 +13,7 @@ jobs: contents: write # for peter-evans/create-pull-request to create branch pull-requests: write # for peter-evans/create-pull-request to create a PR if: github.repository == 'testcontainers/testcontainers-java' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index 7623b3dff69..d28a966ad1d 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -13,7 +13,7 @@ jobs: contents: write # for peter-evans/create-pull-request to create branch pull-requests: write # for peter-evans/create-pull-request to create a PR if: github.repository == 'testcontainers/testcontainers-java' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 with: From fa4d2706fd6661e7deca97199d2050aef44a8f9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 17:12:41 +0000 Subject: [PATCH 0426/1224] Bump peter-evans/create-pull-request from 7.0.5 to 7.0.8 Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.5 to 7.0.8. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/5e914681df9dc83aa4e4905692ca88beb2f9e91f...271a8d0340265f705b14b6d32b9829c1cb33d45e) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-testcontainers-version.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index 96a4d6050a9..0248fa1d93a 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/latest_version: .*/latest_version: ${GITHUB_REF##*/}/g" mkdocs.yml git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v3.10.1 + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v3.10.1 with: title: Update docs version to ${GITHUB_REF##*/} body: | diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index d28a966ad1d..13837626c06 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/^testcontainers\.version=.*/testcontainers\.version=${GITHUB_REF##*/}/g" gradle.properties git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v3.10.1 + uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v3.10.1 with: title: Update testcontainers version to ${GITHUB_REF##*/} body: | From cc1c13af22dc54988a875b0e3540bee1d6329d93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 4 Mar 2025 13:12:39 -0600 Subject: [PATCH 0427/1224] Replace release by sourceCompatibility and targetCompatibility in spock --- modules/spock/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle index f016e5624d6..6e329b2a78c 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -24,7 +24,8 @@ dependencies { } tasks.withType(GroovyCompile) { - options.release.set(8) + sourceCompatibility = '1.8' + targetCompatibility = '1.8' options.encoding = 'UTF-8' } From 36032e91e0b690d54fd3b3ce41f01ad325069166 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 14:06:09 -0600 Subject: [PATCH 0428/1224] [create-pull-request] automated change (#10062) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 37cf8aeb3de..45f25ec96f2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=1.20.5 +testcontainers.version=1.20.6 From 09a8819b44271225d3d80dded1c491d87f43e01f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 14:06:20 -0600 Subject: [PATCH 0429/1224] [create-pull-request] automated change (#10063) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 03dfdd7f9e3..536f73a0603 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -139,4 +139,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 1.20.5 + latest_version: 1.20.6 From f0d46c860ed21260e9fc26956d589b1f003c49e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 4 Mar 2025 14:24:36 -0600 Subject: [PATCH 0430/1224] Deprecate getUserPass and add getPassword (#10064) --- .../main/java/org/testcontainers/ldap/LLdapContainer.java | 5 +++++ .../java/org/testcontainers/ldap/LLdapContainerTest.java | 8 ++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/ldap/src/main/java/org/testcontainers/ldap/LLdapContainer.java b/modules/ldap/src/main/java/org/testcontainers/ldap/LLdapContainer.java index 6a8193e8106..c811bffa1ec 100644 --- a/modules/ldap/src/main/java/org/testcontainers/ldap/LLdapContainer.java +++ b/modules/ldap/src/main/java/org/testcontainers/ldap/LLdapContainer.java @@ -79,7 +79,12 @@ public String getUser() { return String.format("cn=admin,ou=people,%s", getBaseDn()); } + @Deprecated public String getUserPass() { return getEnvMap().getOrDefault("LLDAP_LDAP_USER_PASS", "password"); } + + public String getPassword() { + return getEnvMap().getOrDefault("LLDAP_LDAP_USER_PASS", "password"); + } } diff --git a/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java b/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java index 399dd83bbf9..d8914c793c2 100644 --- a/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java +++ b/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java @@ -18,7 +18,7 @@ public void test() throws LDAPException { ) { lldap.start(); LDAPConnection connection = new LDAPConnection(lldap.getHost(), lldap.getLdapPort()); - BindResult result = connection.bind(lldap.getUser(), lldap.getUserPass()); + BindResult result = connection.bind(lldap.getUser(), lldap.getPassword()); assertThat(result).isNotNull(); } } @@ -30,7 +30,7 @@ public void testUsingLdapUrl() throws LDAPException { LDAPURL ldapUrl = new LDAPURL(lldap.getLdapUrl()); LDAPConnection connection = new LDAPConnection(ldapUrl.getHost(), ldapUrl.getPort()); - BindResult result = connection.bind(lldap.getUser(), lldap.getUserPass()); + BindResult result = connection.bind(lldap.getUser(), lldap.getPassword()); assertThat(result).isNotNull(); } } @@ -47,7 +47,7 @@ public void testWithCustomBaseDn() throws LDAPException { LDAPURL ldapUrl = new LDAPURL(lldap.getLdapUrl()); LDAPConnection connection = new LDAPConnection(ldapUrl.getHost(), ldapUrl.getPort()); - BindResult result = connection.bind(lldap.getUser(), lldap.getUserPass()); + BindResult result = connection.bind(lldap.getUser(), lldap.getPassword()); assertThat(result).isNotNull(); } } @@ -59,7 +59,7 @@ public void testWithCustomUserPass() throws LDAPException { LDAPURL ldapUrl = new LDAPURL(lldap.getLdapUrl()); LDAPConnection connection = new LDAPConnection(ldapUrl.getHost(), ldapUrl.getPort()); - BindResult result = connection.bind(lldap.getUser(), lldap.getUserPass()); + BindResult result = connection.bind(lldap.getUser(), lldap.getPassword()); assertThat(result).isNotNull(); } } From cf176748ca1a93b588869a5ce2f815568045698f Mon Sep 17 00:00:00 2001 From: Ling Hengqian Date: Wed, 5 Mar 2025 04:30:16 +0800 Subject: [PATCH 0431/1224] Use `clickhouse/clickhouse-server` as Docker Image in ClickHouseProvider (#8738) Fixes #8736 --- modules/clickhouse/build.gradle | 1 + .../containers/ClickHouseProvider.java | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 6dec2131bde..4bec350d6ef 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -9,6 +9,7 @@ dependencies { testImplementation project(':jdbc-test') testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.7.0', classifier: 'http') + testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.0', classifier: 'http') diff --git a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java index 80fb71bd5da..250631c1500 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/containers/ClickHouseProvider.java @@ -1,16 +1,24 @@ package org.testcontainers.containers; +import org.testcontainers.clickhouse.ClickHouseContainer; import org.testcontainers.utility.DockerImageName; public class ClickHouseProvider extends JdbcDatabaseContainerProvider { + private static final String DEFAULT_TAG = "24.12-alpine"; + @Override public boolean supports(String databaseType) { - return databaseType.equals(ClickHouseContainer.NAME); + return databaseType.equals("clickhouse"); + } + + @Override + public JdbcDatabaseContainer newInstance() { + return newInstance(DEFAULT_TAG); } @Override - public JdbcDatabaseContainer newInstance(String tag) { - return new ClickHouseContainer(DockerImageName.parse(ClickHouseContainer.IMAGE).withTag(tag)); + public JdbcDatabaseContainer newInstance(String tag) { + return new ClickHouseContainer(DockerImageName.parse("clickhouse/clickhouse-server").withTag(tag)); } } From b7336e9435b3db6facf925aecf2672cf822e502f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 4 Mar 2025 14:38:21 -0600 Subject: [PATCH 0432/1224] Remove linked-container (#10065) --- docs/examples.md | 1 - examples/linked-container/build.gradle | 17 -------- .../linkedcontainer/RedmineClient.java | 31 --------------- .../LinkedContainerTestImages.java | 9 ----- .../linkedcontainer/RedmineClientTest.java | 39 ------------------- .../linkedcontainer/RedmineContainer.java | 33 ---------------- .../src/test/resources/logback-test.xml | 16 -------- examples/settings.gradle | 1 - 8 files changed, 147 deletions(-) delete mode 100644 examples/linked-container/build.gradle delete mode 100644 examples/linked-container/src/main/java/com/example/linkedcontainer/RedmineClient.java delete mode 100644 examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java delete mode 100644 examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java delete mode 100644 examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineContainer.java delete mode 100644 examples/linked-container/src/test/resources/logback-test.xml diff --git a/docs/examples.md b/docs/examples.md index 05638d00d43..c63fa739817 100644 --- a/docs/examples.md +++ b/docs/examples.md @@ -4,7 +4,6 @@ Examples of different use cases provided by Testcontainers can be found below: - [Hazelcast](https://github.com/testcontainers/testcontainers-java/tree/main/examples/hazelcast) - [Kafka Cluster with multiple brokers](https://github.com/testcontainers/testcontainers-java/tree/main/examples/kafka-cluster) -- [Linked containers](https://github.com/testcontainers/testcontainers-java/tree/main/examples/linked-container) - [Neo4j](https://github.com/testcontainers/testcontainers-java/tree/main/examples/neo4j-container) - [Redis](https://github.com/testcontainers/testcontainers-java/tree/main/examples/redis-backed-cache) - [Selenium](https://github.com/testcontainers/testcontainers-java/tree/main/examples/selenium-container) diff --git a/examples/linked-container/build.gradle b/examples/linked-container/build.gradle deleted file mode 100644 index 028e457fc5d..00000000000 --- a/examples/linked-container/build.gradle +++ /dev/null @@ -1,17 +0,0 @@ -plugins { - id 'java' -} - -repositories { - mavenCentral() -} -dependencies { - compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'com.squareup.okhttp3:okhttp:4.12.0' - implementation 'org.json:json:20240303' - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.testcontainers:postgresql' - testImplementation 'org.assertj:assertj-core:3.26.3' -} - diff --git a/examples/linked-container/src/main/java/com/example/linkedcontainer/RedmineClient.java b/examples/linked-container/src/main/java/com/example/linkedcontainer/RedmineClient.java deleted file mode 100644 index c95ec133e2f..00000000000 --- a/examples/linked-container/src/main/java/com/example/linkedcontainer/RedmineClient.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.linkedcontainer; - -import okhttp3.OkHttpClient; -import okhttp3.Request; -import okhttp3.Response; -import org.json.JSONObject; - -import java.io.IOException; - -/** - * A crude, partially implemented Redmine client. - */ -public class RedmineClient { - - private String url; - - private OkHttpClient client; - - public RedmineClient(String url) { - this.url = url; - client = new OkHttpClient(); - } - - public int getIssueCount() throws IOException { - Request request = new Request.Builder().url(url + "/issues.json").build(); - - Response response = client.newCall(request).execute(); - JSONObject jsonObject = new JSONObject(response.body().string()); - return jsonObject.getInt("total_count"); - } -} diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java deleted file mode 100644 index af8a823c1de..00000000000 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/LinkedContainerTestImages.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.example.linkedcontainer; - -import org.testcontainers.utility.DockerImageName; - -public interface LinkedContainerTestImages { - DockerImageName POSTGRES_TEST_IMAGE = DockerImageName.parse("postgres:9.6.12"); - - DockerImageName REDMINE_TEST_IMAGE = DockerImageName.parse("redmine:3.3.2"); -} diff --git a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java b/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java deleted file mode 100644 index 721c00835c9..00000000000 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineClientTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.example.linkedcontainer; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.RuleChain; -import org.testcontainers.containers.PostgreSQLContainer; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Tests for RedmineClient. - */ -public class RedmineClientTest { - - private static final String POSTGRES_USERNAME = "redmine"; - - private static final String POSTGRES_PASSWORD = "secret"; - - private PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer<>( - LinkedContainerTestImages.POSTGRES_TEST_IMAGE - ) - .withUsername(POSTGRES_USERNAME) - .withPassword(POSTGRES_PASSWORD); - - private RedmineContainer redmineContainer = new RedmineContainer(LinkedContainerTestImages.REDMINE_TEST_IMAGE) - .withLinkToContainer(postgreSQLContainer, "postgres") - .withEnv("POSTGRES_ENV_POSTGRES_USER", POSTGRES_USERNAME) - .withEnv("POSTGRES_ENV_POSTGRES_PASSWORD", POSTGRES_PASSWORD); - - @Rule - public RuleChain chain = RuleChain.outerRule(postgreSQLContainer).around(redmineContainer); - - @Test - public void canGetIssueCount() throws Exception { - RedmineClient redmineClient = new RedmineClient(redmineContainer.getRedmineUrl()); - - assertThat(redmineClient.getIssueCount()).as("The issue count can be retrieved.").isZero(); - } -} 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 deleted file mode 100644 index 0f0bea36c1a..00000000000 --- a/examples/linked-container/src/test/java/com/example/linkedcontainer/RedmineContainer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.example.linkedcontainer; - -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.traits.LinkableContainer; -import org.testcontainers.containers.wait.strategy.Wait; -import org.testcontainers.utility.DockerImageName; - -/** - * A Redmine container. - */ -public class RedmineContainer extends GenericContainer { - - private static final int REDMINE_PORT = 3000; - - public RedmineContainer(DockerImageName dockerImageName) { - super(dockerImageName); - } - - @Override - protected void configure() { - addExposedPort(REDMINE_PORT); - waitingFor(Wait.forHttp("/")); - } - - public RedmineContainer withLinkToContainer(LinkableContainer otherContainer, String alias) { - addLink(otherContainer, alias); - return this; - } - - public String getRedmineUrl() { - return String.format("http://%s:%d", this.getHost(), this.getMappedPort(REDMINE_PORT)); - } -} diff --git a/examples/linked-container/src/test/resources/logback-test.xml b/examples/linked-container/src/test/resources/logback-test.xml deleted file mode 100644 index 83ef7a1a3ef..00000000000 --- a/examples/linked-container/src/test/resources/logback-test.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - %d{HH:mm:ss.SSS} %-5level %logger - %msg%n - - - - - - - - - diff --git a/examples/settings.gradle b/examples/settings.gradle index 8aed2430fb5..8d144867bbd 100644 --- a/examples/settings.gradle +++ b/examples/settings.gradle @@ -20,7 +20,6 @@ includeBuild '..' // explicit include to allow Dependabot to autodiscover subprojects include 'kafka-cluster' -include 'linked-container' include 'neo4j-container' include 'redis-backed-cache' include 'redis-backed-cache-testng' From d1933b75bbacb93509f8e06ecea71aea5820ef23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 4 Mar 2025 19:24:47 -0600 Subject: [PATCH 0433/1224] Support additional flags in FirestoreEmulatorContainer (#10067) Fixes #10060 --- .../containers/FirestoreEmulatorContainer.java | 17 ++++++++++++++++- .../FirestoreEmulatorContainerTest.java | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index 04a7f039be7..db703cda5b4 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -24,6 +24,8 @@ public class FirestoreEmulatorContainer extends GenericContainer e.contains("--database-mode datastore-mode")); + } + } } From 2cc64fcdb5711692f38f0e907ea39bf89f045169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 4 Mar 2025 20:25:36 -0600 Subject: [PATCH 0434/1224] Remove spock-core from spock module (#10069) --- 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 6e329b2a78c..5924c93b3b2 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -6,7 +6,7 @@ description = "Testcontainers :: Spock-Extension" dependencies { api project(':testcontainers') - api 'org.spockframework:spock-core:2.3-groovy-4.0' + implementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(':selenium') testImplementation project(':mysql') From 485ef1d21559e9ee6a167c31bc7ffd26eabf130f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 6 Mar 2025 13:19:17 -0600 Subject: [PATCH 0435/1224] Update docker-java version to 3.4.2 (#10071) --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index a7b600f041f..4dad6c61131 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -88,8 +88,8 @@ dependencies { shaded 'org.awaitility:awaitility:4.2.0' - api platform('com.github.docker-java:docker-java-bom:3.4.1') - shaded platform('com.github.docker-java:docker-java-bom:3.4.1') + api platform('com.github.docker-java:docker-java-bom:3.4.2') + shaded platform('com.github.docker-java:docker-java-bom:3.4.2') api "com.github.docker-java:docker-java-api" From ad2e8b1415b00a4b984e8efecdf2ca787aceb7a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 12 Mar 2025 22:36:52 -0600 Subject: [PATCH 0436/1224] [servicebus] Skip waiting for sql to be ready (#10092) By default, Azure ServiceBus emulator waits 15 seconds for sql to be ready. Testcontainers is in charge of service readiness, so, the emulator should skip waiting for sql. --- .../org/testcontainers/azure/ServiceBusEmulatorContainer.java | 1 + .../testcontainers/azure/ServiceBusEmulatorContainerTest.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java b/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java index 270ec27b2e0..fd055a0d39b 100644 --- a/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java +++ b/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java @@ -41,6 +41,7 @@ public ServiceBusEmulatorContainer(final DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); withExposedPorts(DEFAULT_PORT); + withEnv("SQL_WAIT_INTERVAL", "0"); waitingFor(Wait.forLogMessage(".*Emulator Service is Successfully Up!.*", 1)); } diff --git a/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java index 781a2d24566..4676e41784a 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java @@ -48,7 +48,7 @@ public class ServiceBusEmulatorContainerTest { @Rule // emulatorContainer { public ServiceBusEmulatorContainer emulator = new ServiceBusEmulatorContainer( - "mcr.microsoft.com/azure-messaging/servicebus-emulator:1.0.1" + "mcr.microsoft.com/azure-messaging/servicebus-emulator:1.1.2" ) .acceptLicense() .withConfig(MountableFile.forClasspathResource("/service-bus-config.json")) From 55f23470eb760fd9f22c886dd8ec490e6151dc6e Mon Sep 17 00:00:00 2001 From: julianladisch Date: Mon, 24 Mar 2025 22:50:48 +0100 Subject: [PATCH 0437/1224] Add SFTP host key check example (#10127) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Demonstrates how to upload a private host key into the SFTP server allowing host key checking. It avoids the unsecure ("StrictHostKeyChecking", "no") of SftpContainerTest. --------- Co-authored-by: Eddú Meléndez --- .../java/org/example/SftpContainerTest.java | 53 +++++++++++++++++++ .../sftp/src/test/resources/ssh_host_rsa_key | 38 +++++++++++++ .../src/test/resources/ssh_host_rsa_key.pub | 1 + 3 files changed, 92 insertions(+) create mode 100644 examples/sftp/src/test/resources/ssh_host_rsa_key create mode 100644 examples/sftp/src/test/resources/ssh_host_rsa_key.pub diff --git a/examples/sftp/src/test/java/org/example/SftpContainerTest.java b/examples/sftp/src/test/java/org/example/SftpContainerTest.java index e54b5b72036..3a6593ea736 100644 --- a/examples/sftp/src/test/java/org/example/SftpContainerTest.java +++ b/examples/sftp/src/test/java/org/example/SftpContainerTest.java @@ -1,6 +1,7 @@ package org.example; import com.jcraft.jsch.ChannelSftp; +import com.jcraft.jsch.HostKey; import com.jcraft.jsch.JSch; import com.jcraft.jsch.Session; import org.junit.jupiter.api.Test; @@ -10,6 +11,7 @@ import java.io.BufferedReader; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.util.Base64; import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; @@ -49,4 +51,55 @@ void test() throws Exception { .noneMatch(item -> item.toString().contains("testcontainers/file.txt")); } } + + @Test + void testHostKeyCheck() throws Exception { + try ( + GenericContainer sftp = new GenericContainer<>("atmoz/sftp:alpine-3.7") + .withCopyFileToContainer( + MountableFile.forClasspathResource("testcontainers/", 0777), + "/home/foo/upload/testcontainers" + ) + .withCopyFileToContainer( + MountableFile.forClasspathResource("./ssh_host_rsa_key", 0400), + "/etc/ssh/ssh_host_rsa_key" + ) + .withExposedPorts(22) + .withCommand("foo:pass:::upload") + ) { + sftp.start(); + JSch jsch = new JSch(); + Session jschSession = jsch.getSession("foo", sftp.getHost(), sftp.getMappedPort(22)); + jschSession.setPassword("pass"); + // hostKeyString is string starting with AAAA from file known_hosts or ssh_host_*_key.pub + // generate the files with: + // ssh-keygen -t rsa -b 3072 -f ssh_host_rsa_key < /dev/null + String hostKeyString = + "AAAAB3NzaC1yc2EAAAADAQABAAABgQCXMxVRzmFWxfrRB9XiZ/3HNM+xkYYE+IMGuOZD" + + "04M2ezU25XjT6cPajzpFmzTxR2qEpRCKHeVnSG5nT6UXQp7760brTN7m5sDasbMnHgYh" + + "fC/3of2k6qTR9X/JHRpgwzq5+6FtEe41w1H1dXoNIr4YTKnLijSp8MKqBtPPNUpzEVb9" + + "5YKZGdCDoCbbYOyS/Dc8azUDo0mqM542J3nA2Sq9HCP0BAv43hrTAtCZodkB5wo18exb" + + "fPKsjGtA3de2npybFoSRbavZmT8L/b2iHZX6FRaqLsbYGKtszCWu5OU7WBX5g5QVlLfO" + + "nGQ+LsF6d6pX5LlMwEU14uu4gNPvZFOaZXtHNHZqnBcjd/sMaw5N/atFsPgtQ0vYnrEA" + + "D6oDjj0uXMsnmgUWTZBi3q2GBWWPqhE+0ASb2xBQGa+tWWTVYbuuYlA7hUX0URK8FcLw" + + "4UOYJjscDjnjlvQkghd2esP5NxV1NXkG2XYNHnf1E/tH4+AHJzy+qOQom7ehda96FZ8="; + HostKey hostKey = new HostKey(sftp.getHost(), Base64.getDecoder().decode(hostKeyString)); + jschSession.getHostKeyRepository().add(hostKey, null); + jschSession.connect(); + ChannelSftp channel = (ChannelSftp) jschSession.openChannel("sftp"); + channel.connect(); + assertThat(channel.ls("/upload/testcontainers")).anyMatch(item -> item.toString().contains("file.txt")); + assertThat( + new BufferedReader( + new InputStreamReader(channel.get("/upload/testcontainers/file.txt"), StandardCharsets.UTF_8) + ) + .lines() + .collect(Collectors.joining("\n")) + ) + .contains("Testcontainers"); + channel.rm("/upload/testcontainers/file.txt"); + assertThat(channel.ls("/upload/testcontainers/")) + .noneMatch(item -> item.toString().contains("testcontainers/file.txt")); + } + } } diff --git a/examples/sftp/src/test/resources/ssh_host_rsa_key b/examples/sftp/src/test/resources/ssh_host_rsa_key new file mode 100644 index 00000000000..9987990b63d --- /dev/null +++ b/examples/sftp/src/test/resources/ssh_host_rsa_key @@ -0,0 +1,38 @@ +-----BEGIN OPENSSH PRIVATE KEY----- +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 +-----END OPENSSH PRIVATE KEY----- diff --git a/examples/sftp/src/test/resources/ssh_host_rsa_key.pub b/examples/sftp/src/test/resources/ssh_host_rsa_key.pub new file mode 100644 index 00000000000..57b3aebb050 --- /dev/null +++ b/examples/sftp/src/test/resources/ssh_host_rsa_key.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCXMxVRzmFWxfrRB9XiZ/3HNM+xkYYE+IMGuOZD04M2ezU25XjT6cPajzpFmzTxR2qEpRCKHeVnSG5nT6UXQp7760brTN7m5sDasbMnHgYhfC/3of2k6qTR9X/JHRpgwzq5+6FtEe41w1H1dXoNIr4YTKnLijSp8MKqBtPPNUpzEVb95YKZGdCDoCbbYOyS/Dc8azUDo0mqM542J3nA2Sq9HCP0BAv43hrTAtCZodkB5wo18exbfPKsjGtA3de2npybFoSRbavZmT8L/b2iHZX6FRaqLsbYGKtszCWu5OU7WBX5g5QVlLfOnGQ+LsF6d6pX5LlMwEU14uu4gNPvZFOaZXtHNHZqnBcjd/sMaw5N/atFsPgtQ0vYnrEAD6oDjj0uXMsnmgUWTZBi3q2GBWWPqhE+0ASb2xBQGa+tWWTVYbuuYlA7hUX0URK8FcLw4UOYJjscDjnjlvQkghd2esP5NxV1NXkG2XYNHnf1E/tH4+AHJzy+qOQom7ehda96FZ8= someone@localhost From 0b7f6fc14f990d09113e082b86e7dae13935e5ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:09:39 +0000 Subject: [PATCH 0438/1224] Bump com.zaxxer:HikariCP from 4.0.3 to 6.3.0 in /modules/spock Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 4.0.3 to 6.3.0. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-4.0.3...HikariCP-6.3.0) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 5924c93b3b2..c3cece021eb 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') - testImplementation 'com.zaxxer:HikariCP:4.0.3' + testImplementation 'com.zaxxer:HikariCP:6.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.4' From 05e5eab65be4dbade38c3771aa2a3e349001f5cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 25 Mar 2025 00:40:47 +0000 Subject: [PATCH 0439/1224] Bump org.apache.kafka:kafka-clients from 3.8.0 to 4.0.0 in /examples Bumps org.apache.kafka:kafka-clients from 3.8.0 to 4.0.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 623fcd66175..afe7755f3c1 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -10,7 +10,7 @@ dependencies { testCompileOnly "org.projectlombok:lombok:1.18.34" testAnnotationProcessor "org.projectlombok:lombok:1.18.34" testImplementation 'org.testcontainers:kafka' - testImplementation 'org.apache.kafka:kafka-clients:3.8.0' + testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From e5625684c87c5bc04e18dd4d6e23ea00f8d585b8 Mon Sep 17 00:00:00 2001 From: Wouter Blancquaert Date: Thu, 3 Apr 2025 22:54:37 +0200 Subject: [PATCH 0440/1224] Add default database name to MongoDB Atlas (#10034) Co-authored-by: Wouter Blancquaert --- .../mongodb/MongoDBAtlasLocalContainer.java | 32 ++++++++++++++++++- .../MongoDBAtlasLocalContainerTest.java | 20 ++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java b/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java index 52067c01ff2..79e44d3ffb0 100644 --- a/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java +++ b/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainer.java @@ -17,6 +17,10 @@ public class MongoDBAtlasLocalContainer extends GenericContainerdatabaseName. + * + * @param databaseName a database name. + * @return a database specific connection string. + */ + public String getDatabaseConnectionString(final String databaseName) { + if (!isRunning()) { + throw new IllegalStateException("MongoDBContainer should be started first"); + } + return baseConnectionString() + "/" + databaseName + "?" + DIRECT_CONNECTION; } } diff --git a/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java index 2d7664d51fa..720629d214c 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java @@ -36,6 +36,26 @@ public void getConnectionString() { } } + @Test + public void getDatabaseConnectionString() { + try ( + MongoDBAtlasLocalContainer container = new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9") + ) { + container.start(); + String databaseConnectionString = container.getDatabaseConnectionString(); + assertThat(databaseConnectionString).isNotNull(); + assertThat(databaseConnectionString).startsWith("mongodb://"); + assertThat(databaseConnectionString) + .isEqualTo( + String.format( + "mongodb://%s:%d/test?directConnection=true", + container.getHost(), + container.getFirstMappedPort() + ) + ); + } + } + @Test public void createAtlasIndexAndSearchIt() throws Exception { try ( From 3e5bda696b0877e59e9747099d6a2cc57a7c3b29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 3 Apr 2025 15:06:24 -0600 Subject: [PATCH 0441/1224] Update module dependabot schedule internal to monthly --- .github/dependabot.yml | 130 ++++++++++++++++++++--------------------- 1 file changed, 65 insertions(+), 65 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index bffc5623611..75582a50c91 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -43,12 +43,12 @@ updates: - package-ecosystem: "gradle" directory: "/modules/azure" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/cassandra" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "io.dropwizard.metrics:metrics-core" @@ -56,27 +56,27 @@ updates: - package-ecosystem: "gradle" directory: "/modules/chromadb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/clickhouse" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/cockroachdb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/consul" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/couchbase" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.awaitility:awaitility" @@ -84,51 +84,51 @@ updates: - package-ecosystem: "gradle" directory: "/modules/cratedb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/database-commons" schedule: - interval: "weekly" + interval: "monthly" - package-ecosystem: "gradle" directory: "/modules/databend" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/db2" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/dynalite" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/elasticsearch" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/gcloud" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/grafana" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/hivemq" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/influxdb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "com.influxdb:influxdb-java-client" @@ -136,7 +136,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/jdbc" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.mockito:mockito-core" @@ -144,7 +144,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/jdbc-test" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.apache.tomcat:tomcat-jdbc" @@ -152,7 +152,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/junit-jupiter" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.mockito:mockito-core" @@ -160,7 +160,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/k3s" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" @@ -168,7 +168,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/k6" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" @@ -176,22 +176,22 @@ updates: - package-ecosystem: "gradle" directory: "/modules/kafka" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/ldap" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/localstack" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/mariadb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.mariadb:r2dbc-mariadb" @@ -199,37 +199,37 @@ updates: - package-ecosystem: "gradle" directory: "/modules/milvus" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/minio" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/mockserver" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/mongodb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/mssqlserver" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/mysql" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/neo4j" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.neo4j.driver:neo4j-java-driver" @@ -239,65 +239,65 @@ updates: - package-ecosystem: "gradle" directory: "/modules/nginx" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/oceanbase" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/ollama" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/openfga" schedule: - interval: "weekly" + interval: "monthly" - package-ecosystem: "gradle" directory: "/modules/oracle-free" schedule: - interval: "weekly" + interval: "monthly" - package-ecosystem: "gradle" directory: "/modules/oracle-xe" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/orientdb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/postgresql" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/presto" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/pinecone" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/pulsar" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/qdrant" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/questdb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.awaitility:awaitility" @@ -305,7 +305,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/r2dbc" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "io.r2dbc:r2dbc-spi" @@ -313,22 +313,22 @@ updates: - package-ecosystem: "gradle" directory: "/modules/rabbitmq" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/redpanda" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/scylladb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/selenium" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.seleniumhq.selenium:selenium-bom" @@ -336,7 +336,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/solace" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.apache.qpid:qpid-jms-client" @@ -346,7 +346,7 @@ updates: - package-ecosystem: "gradle" directory: "/modules/solr" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "org.apache.solr:solr-solrj" @@ -354,54 +354,54 @@ updates: - package-ecosystem: "gradle" directory: "/modules/spock" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/tidb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/timeplus" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/toxiproxy" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/trino" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/typesense" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/vault" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/weaviate" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/yugabytedb" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 # Examples - package-ecosystem: "gradle" directory: "/examples" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "ch.qos.logback:logback-classic" @@ -421,11 +421,11 @@ updates: - dependency-name: "com.hazelcast:hazelcast" update-types: [ "version-update:semver-minor" ] - # Smoke test +# Smoke test - package-ecosystem: "gradle" directory: "/smoke-test" schedule: - interval: "weekly" + interval: "monthly" open-pull-requests-limit: 10 ignore: - dependency-name: "ch.qos.logback:logback-classic" From 037eedbd9111f8be4a49ddf949581a67bde21ce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 3 Apr 2025 15:08:37 -0600 Subject: [PATCH 0442/1224] Allow update awaitility --- .github/dependabot.yml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 75582a50c91..fe7a57a8603 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -22,8 +22,6 @@ updates: update-types: [ "version-update:semver-minor", "version-update:semver-patch" ] - dependency-name: "org.apache.commons:commons-compress" update-types: [ "version-update:semver-minor" ] - - dependency-name: "org.awaitility:awaitility" - update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/" allow: @@ -78,9 +76,6 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 - ignore: - - dependency-name: "org.awaitility:awaitility" - update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/cratedb" schedule: @@ -299,9 +294,6 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 - ignore: - - dependency-name: "org.awaitility:awaitility" - update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/r2dbc" schedule: @@ -341,8 +333,6 @@ updates: ignore: - dependency-name: "org.apache.qpid:qpid-jms-client" update-types: [ "version-update:semver-major" ] - - dependency-name: "org.awaitility:awaitility" - update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/solr" schedule: From 1a71125022ec612cefaa9263d880930dd390be13 Mon Sep 17 00:00:00 2001 From: jonghoonpark Date: Sat, 5 Apr 2025 02:30:13 +0900 Subject: [PATCH 0443/1224] Support new chromadb api version (#10170) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../chromadb/ChromaDBContainer.java | 24 ++++++++++++++++++- .../chromadb/ChromaDBContainerTest.java | 18 ++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java b/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java index a1bccf3904f..af6c3df33fc 100644 --- a/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java +++ b/modules/chromadb/src/main/java/org/testcontainers/chromadb/ChromaDBContainer.java @@ -1,7 +1,9 @@ package org.testcontainers.chromadb; +import lombok.extern.slf4j.Slf4j; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.ComparableVersion; import org.testcontainers.utility.DockerImageName; /** @@ -11,6 +13,7 @@ *

    2jq7_TfZ- zY&mWxCbWkG;7Y^>{IQg27WWqs@h${Q!?#pERq`lbORNK86U_MO)YBZI543+_14W$e zA72ObBUNeXz^8mDv>$%J1HAY-q+FG|=fKSI6(ZgpwX{nOcUgO-o6a-%!4hlfg*;El zCJtt$fqeVsP1}Y3BC`ppRjL##Yq=Rg9^00J=EFoSxyRg{X5h z7?mVcE({1?&^q!5mB7`3CbDM98cTv=S1QO?Kh3|}vEdFJL!1|v*SLP$%@&Rk;snAccM6Fv=1j5fZ;O2zk159z5) z^-n^WSW~_$YGlFJfT3#F{YkOlpoZRfFl13ZD&_?U+2+@?GhE!qYFP3m?q5%tq$mgj z9?hlL?FceTvN08+bQSL;16yxOeX`8=<5R6lGOu3B|Ejypg`-~FUC{lyBn5bH*MKwkN`q*NN3j+`_f3MP#gDdsh#3M(z|nC1P6;lr&-)n!ZBC zEhRiwYh#Hw0CobxnFq*~FkyB_3G&|U+Zjcgp3}%IuvKZs?DXobnCgw1>x}9HM_?dy zy&uqe?6Oc2ryGuQ{KBhYU}3;eye$^dR`~e>mnY=_X4;Zg7P|aHwHoBH$M&t4p9(n@e>V~*8!3mwDx{?-{zEHuG<`W zzAnWQK%y%a*^BkU^^*Gg66upc!r|!DuHhLicxK)JA)$<@e0bzt!Ta`LD}S&-w?ef` zarNE32QYMAu6lt9Cq;{{vXpO}s1`YJeKTp^dl2o zJXWiV@p+>kZ8J>k5~~2W{}m}M#lo5QlgaxxfY*C!V@ciA261-$_V3N_BZN%yQ%?{5 z*x5CHj}M4C>PU?iH5y@@bw8)=rQ@d{eQ!>pSY2HLWUqbTCZcnUW;u^&jy|WM$ea>E zzZd5zo2RCAulP&wM9jZKh?q~4uEDoXr_Wq0!f(T^8t}9y2 z&5R?IDP1qxylOlGqpOIIQf#wG3#9}n3c_maP2dfZL|EH1)3qJp9(W&Ea~K!A%+LET zJ`taFXai(>iNlzi6e3_b_I?$Z$cIuNAdCm$-ZhZF24axl%OlnSnlbGfDVA^Ryt>JS z!S-Yi7tWi;G!e=wbJeOUS#A=1fQWUf_3))7e}7K_@!n!kC=IhNZ}Jw?*=H4c2VS6& zQRDZ=qcjBXmVmQSEFs&L%*gDZBZCunck}4)KlyYQWq8NLNP*VVy!l@ELaRi70pPTV z5$M1qb|H{Jgh~i&hB{KRVpX^yj8!i^_5)}> zeOapSGrSVd^thNCmA!b(M6b(cMWFldkL-+)!AlZ(hN-YP>K*ZZvX)el_d4NjTS-UaV;x>((GE zU8b7ajHI!UPo}n(J!CcjN(qE#mWCX9RIg!_rX%R_9n3 zRQ@)w{&JuLq;@(iWOf4Fu?O0YcnprbLWwycuBh1QnD`~IEKpBl-}z<(_ej7z9K!iX|tVkpu)3dvSp@EU@hi+YMp9X^UkyF05kl&A~Vy+&RO>) z_v@Dzta%zdh!b)i1TNdA13UX&a=b?r?OQ(f2|UvlX@70_858P|6&{%RUg~0hWpq!| zBwE6)TSBc%Nz9^>Qo`rox5M(yPM^A7k)E=I=}!o6<#F9n0LBxZ}-4myXM#!#{cw z7HfWjYAx=T0bAm5mn`&+v-ybYlU5B|3Vz=7YMZmArd{dc<E1Rd>ge}3*8;|LA7=pe46V6 zSkbXkCCLr;$@NCVKg5k7Itq@3vWZe)P$ z^SoFpb8m>?D>#uui$bybqBWynq#xdYZq47?FajE6ioV4flf)d?ii%;8}WAM9a_ygm-%=n3nU_#hC!T+a#<{ipl0MP6MebY!{eGWf6C$k?WNPoU7865+;WDX zT%CoJErn8}nl(Ip`qi@D?j3?h2`a+Gw#cb|q%lA~A@AZ}w(wGYgpRGz0;Sw$UoNs&rYv{2*VU|T+&B(FiK*DSP5 zeclPX&$N(EyN>f0#c~=da*%s#T863tKj9Np~Otj z^HJk|@)x%APBw2G<%vj9;k12pAMwGXXfS&|JOXDtY@~giM=qb-RXrgtrVR`TjRnv2 zSRtb(st6i@xYlMOHYHE(Kw9Ljn64ZGK7ZXVjx=m#o!tn=XjGk{Cv)wvD|oCE*NxiL zaR4q=tP(8>v*i4ek9)bAd}0f(lL|7#*ZJY2v^=47Riz^aO{J<&l2LJzkwvHfb$BA$ zU)coW6#c&glf5B2)ce5T}Ez`1EkJ27P`m~*-zp1X>jCaiCXmato`92 zEOTlAVnVA{O&NJ-XG}1%zR78$KA-GKa*j>JGX<+-VvZk~&N&O@37yi7W^Pbo$RQ;T z!6+(d$oWd`9i!51vEb#{03NmkotT1+2bwo_7=oQlR&vI7Md;QGwjOdKihaq)>+d_SSWE2my^&qxlo+t^h zJ+O(hT<+e8&Jd%Jy;l5I2U_cT8CIz_gLmnJ31A%9x!FG5pgN*?p~ODatWhUagYyE5 z#!99otrH^LHNe>(?H%vtXC-KPvqk?dkW>=6I5p4i^RljWnC9~;+-jq;8WOQWdS&E4 z{)D2o)-&gIKCa9U>rYP5L!+{nYUBgtI66x|&UK2QhXm_TGU!*shTt9it{AOplX{x4 zp^Y@%BxQrVc$65k+glb5z>;98XqDvD#rv%{O(if+OA#K?)fjBQZnPLlb%1nQ`X_P{ z?9q~5Ux|T+jaf>z)LOXoNSC!^h-=IC>hm5pul!I>MFO1#1!oaIEGMrv0=p5AmuoW{ zQx(|5yY*Y$P%D>B8!(hjNT1H85w%XHGi3xJBYp&P#Gz*+hNl3M>#0`~HsZDjR7zx5 zSh6k@UsA#@KnQ=UHLW{9_X7pNu_JoH{sFS-SQ$+(P6fPyuPmfRX0`L9-}njbvOeUa zE)$4fG<}-XU8_m82`5zJb`%bHVjpia8HrwO4UX1dzX%`BwA^3d;EN&S-(ZV|b|_0X3;d}wGn2uYVrXM3 zA@hr0oYMl{^%i3Kp|R9Fcdv;a`VB$yAB6A$Z3GM9BdVx}YPg>=hv; z&By`5pluK;^{}rmrAvSLjFh8<`?tPdqaGFAm4~^+kCNt-hk06~4V4v=`JDg80H%_e zr@PJ(3P=XLI=2pE=2+9_@u#Mq!WGx6Z*fL?Ow7p}fGLrCU<@e<(){H=fhNBdI_yf# z<{$!gS&?sG#uTC^VhIn(W%qXuwDaBty2sUZ65^AY`oem_?!|5xI)c@dqN{8`GSMpv zZi0q@r6d3JI8!+VVhPgaw`Hj+s3aIjYfLWN&7FPr1fntAp_lI3O57qbAe4Vv8htey z3i>9x;QNf0AspNp3gQk~5ZcqYad=L49}T-3mMYLcGyH@cktza2`DVuT^vpShXgm=5 zESEv3=DmUR(8YhX=^Nr=+^(*I6BNXQvo(I>;vwa&Xm!{j@r+Ho&?&dsLA$&C+mU&3 z|1)18#QTHa4Enjz2<%W?K>wPG@$PTziO)pRnhv7|1Xv_mnWMi7*5N6Cd`cT_K7vdQ z|8m(Y>%Y8dT{a-^PvT4fC`k*+Yd8FKf7k${MDkipO>tWU^nA zQ(vSHZ+$0!`lBR}&NqP>^fxD!Q6-vG!;Ki zruv&IWyl3~p0E=ZMz&s%F@=~jA^lnqPF|Vp6l^&}XFfQXn0?-Y{5*qnM7v9BUDKlp z$tR80oD<+dX^#-)k$PTIh)DjC_3^r&&OqpwbV!bwaew+yd0mZ61SiGI$J~g7`_w^Txlk%~x6#*O&=$OQ*kS$yDzLmHw62rLogO>6O6FBLe%Av_w3ztFKNlKjHSR@p+_RHMmkeX0&VCiIv4~aXoHnCz|Cr9n8&*zkFMYp_YjO4JE2tm zX6-ubD97o5cEA5G9^kl#4uU^~0|EI)|NoL2-v8qsg??)`YmZuY+x?9RROdm^$9N3H z6+%N35^~I#$(Aq5fE#aO5G5RHbtDdiBkT)9nN<}NML5j9Kj8rg-+kS_K^lTNgT^5u zo=o$!k_X{R3%ifPZ`cpQFL0`8AJfQnal%Kqiewg(Z(m5BL*T>O+j6vA$?I6lz;ghi zx-`vmX?V+Sd)WPfcHH^;{Q=4@zR^19_AM8l*tQ8c{Mek!grLwU8Rv4Oo~ z30=Ro`Jjqfuk%{4P(8!^>ZEHbSAqjy0(u+ZL+X;m7%0u!_m=wv%es& zGD1jCKFUBLRH7#{?-_y@6=4Za3qhEOvC}ho^wkBs+E0A2f|dW{4mAhv(Q)EM-*ZoH z@k-9Ojr9w|S^=AAR zn5mq&3P4Gv`XD22Vv!I;7(2$3PaY#Pr3WwlB4fsgGlo_pB3@l+_7&<_?S6)JY@D+v z-Q2K0-zY`2#BH>V`a^#?0okacy;e1z>U!DXdYQYmV!E}`-Es9P3HLDTl5}zc`;y;2`nz4zEO9xmg$h@yobqSVKYj)%DQrS zn+`dqtCv_`C{zsN%NA7oZcMCurCQ0+kLVql)z`AknEr-XF}1Fd~jpoL+K3ZXIkE@ z?C3lqG1`!-fdlGy!~q+ilE;g*n7ED=g&6SlcFt2NQBA#1Fg)QVl#3OY;jI=Y$F%uVi)M%xyJ+Eb|Z~8$It75Piwk@ zcr{Lg?Yc%Aa?dtRQ3QtC-+UxglAp3RCJvF3=<;AVmj!4^JM4rUXqIn-O>s|AuLwky zC+r66)(p`m68GO4oA^Tsf}I{+y>_)?11{kRQ8bAlzmFBew<$OSdhFPv=WR9#mX=1J zgd2nu+~d(#?0y0klwx9GjyKFVh8FGSX0u2oV^{Ip&)8B6+1>Vf zxEFsXBRYF@C4Rk4G)Gv;z$bULqyBjBhw@I$YO#e!#%q&qXcI5pP2cu7(Jy8+?b16A zCl+D}>>fHImNeR*JHB3v zTzZ}Kw!4sII7{P8jHFe`A$y(g4txEq(Nx>v=E5}0OONPqw z>q^efGtvgVc=*}wR=bO>Trl`hEvYFZFwXlH-?ssnD*r`ijkpTye_D?~W_oSgtX;## zU6RS`>C4Mqna5Hn5^5yI#}_vzPQYd7RfJ!oo@WQ2CC`5rb4K77efoAb9aO{(YE&O@ zK#1>bYx^)#6h7j_Rh3Macw{=Sq%YAJDZPrst_NO6ngJ6+M5|NS0k%A01RGRwFtJ%Q z7@Gr-NcNWRPoX=h?5PuBz}Qmr%^H-i<=HrE(N6J*E4@gJkzQQ%Y+NXEtNIJdJf9m4 zl{cjYJ+Dwu)(M;rf|z8zhwQ*Nkv)V2T9~8HVZ#7~i%x(LXm^R;O2Ib4XM@mL+15~* zWi}tOr(KeHNTUE2Spf-wx&pm7w7_~pK6?O3%XPVyxBYPdb~m(}3%_k_%3Inbj$XnA z5*wYu8MKP2I8Wmy%^|!*1|qlYLh?;7n}|NTOnfcq9}kd=W_%O(nK2O>qAx8g1b&fK zq`6e55n9G6ghU|h!{h_)z*p7SU+1Q6c=pkthx0kCf(Aqga#=UCE zxmix5eQJu^|NVpcGotNDVJ}4+3K9UE1!-NRQeb*9kVJoRe(U()rS6RXWQP!gY1U2m zOYoCIdeb;ve7g{4sIqP`4i7zbAOj;I_)zWXyw3PjrxN#BI$w@2gEY7NfRT0 z_;gk#>V*fLQrO?x!~NznWc1*>NSAFLHMe4Q#ySqcThTla`y;*4)$O1rbwKWj!dS!W zKEV?77y6O!{ia`aSxhF18V}GGoyBgyf5h5a66k|V6nV(lJVe766t8G;+1m~&MeCU| zf~+5d=6@npca@ou3tIUD#eq6)=YpR0IY$ADB*fu_X9&fkhaEI8Lm0ts+Gy3$OPq*# zie3;Rb#>sCB};XY*uI7=pG!EXi=a?#K zvDo5#hZGs9C#Zk;#YEX&M8NG@sJ@$hH@}GYmEL61mB0}ZJsn?=JpacmmdSydo|wHR zd>Z$@OU|QZFoX2$C*rewiZ<1D00wN-^OT1TansKq`|==!)0KTaZ0tN4Y36(5t&VXc z&rXcL(rX{wVpXt2Uf}`v45rf67YOkmI?};ObEMIn(CVH>I4ju#X;ZP`uAR|F-SPJ{ z2Vj3%4nF+0N!{?$U!SACYx0S%#ipy8C_I235UmbqnCz-2T^4a3CIWl!O+)=64@VIkXVF@T@BF1y#=rx9S z<|t-|a)7)XF&5oK7J3r{VgXamFi|u+Q8nm+O@8b6-tXNip|7_h%XEwY$R9z&P2gPj z;Ns`~*HC)s3WR{H;*qK*IzA?;>08<+5~mQ7OAX6qa)>-HZ8;n1td}3Q6<~Vl;h4Y~ zQZa2nKohkzg6y1c1c{w2VwbQhDn}1`uXNU8g;dA;hWw5?;16K>pLlKiVkh|u0j=Vk z*D3;<-wluJ=Q1d!`xZd$<+w|8DOJYFFXc^nI=Bl8 z`hi)s4tY`^GwjPap8#>{x?=2S$DI?&QA!CkqVmo)hH?GMiKudsMe_ka7+t7Hvy$4+ z{MM>ec=;t4pJ!0PZ)`b(9JNF=gGI&+-KTV%*z;br4*5EmA;M2{9Bu4pK)QG!<=_IXn{q2=S|IkFA^IiFo@(JePLQ{h-ve-{3xe>f+&RXTx2;hemlGx(;gY~G zus&N7Xq^1eVBgEgf2!~kas%o-F(^g=|2B>8!3XE*b^TmA>bzc%wWgT9ZQVNAqQLHD zi^Z;Pco(`)|2n8!f7rddX~)dv$#@v5gT3}61^gAlX_0%Uy9%{!+WOX(x4{b)k4G$x zK@rgRyx$Hn_vz}W@6+&8mrceD*MVMQ)L8>4&E1V@jS=-=)xYK1zs2SAfdj^pCv%ND z&g9!D*~=_upxF1i@2O3a_O?a(&ks0-BsP;YfRh8SDNP>ci9I+lvI~UhK%1>E$ZtA; zZ*r>Y$K%FOj044@8D)3uH!8$#bD1{z*lrW(SYp*Y;EWa z^f1;z)i%66e*y~%9kSrQxpLpga~oHqL8H>iqnRuSiFWgtotYmEVRA@>=PU zyb8U6tZ^qm@6_*(;i-qZ-h%dYthvqutpGYt)?w@-%}YKW$`02_%p+=*?W|kC1yb;{jfd6!0~hs65_x72 zTJN{+y`irWBZi_FS8`5yK8%r@Uekj$%3VNq{<A{)61>(@$GBTBi~$ehQA*P;pvxW0yNq-k^w`S3v23KO(GQ@`2!`9}_b1 z0`V4%1DA432~7NF8bs@qqW>+Ly>D|DwT4{|=uhY~jf^4gX_U`rzVs9B z#C4~K_xz$E>&72;QTU!B&cNA@k)uGE8x zH5i{kIGmx|c-=(gTT>PB&}A~fIg@mk9=(1M18IxTurP&UJMBHH)ys)@TOGQHb2P8bU724);3em z7Q6t7G@A-GGtHu+;D5Bai4g1F;WUV;s`y+IjeOdjPS7l{^_-l5P+ScWUphjn$*{jK zK4yl;A>YovC}?VdYFE}F?gf3ODI8mqLscp->U(Ruxz7fQoN5Dn+L)iQuvwuM=n*3~^O23BxZ4pl zoh}IXnniXZLH%FC)ner#QiGcw0gcuoQ9|ds*lK!AoEKXk;Ht{!65G1ieDfj~t3Y^fx{KJBMe~N&IC0l1$b= z{yT?YOdv2xdnIT{DxS_RW_F6d9URSmyI7eyCppGp1OCS@gwSA$pKywiqV6GODa^}ym3ZWTT`#`1NWg{L*Fx#Zc6)ZHw&@n754*k#aDTw z6f@1dW@_s7$@khJZ|D2#NCPBo&T!4=&a}NPq0-Stt!;V9Wumg=j(XCj#WoD8Pf3uT(Yn3QD{QQ~UVC4SL?%%^5`^z=@PZr~y-Nsq#Mca@~D z=ZUS_!Wa{ApMq=-GI0n2^dDSTiJI2oOg{wxhc;cij;;EdmAq)``9|SJO$>oS>OW5w z@A>RDY0C{+GcHYd>T?G0o^j#2*asaykjjNDusWx4i;d}6*9=!_i zgT>bGo5S&EpPb@Ml?R;iOxbJB-Dzo|N!%kTWw(9`jFeenDjp9j5 z-;n2=TZ5tk2agEW13c-<8|V^=;WG<7g7>~%TyYJk85mi~o{A^!IO?;EpAyIc+GmM# zjuv4Bz9o7NoAPQk`+VAUTGV_Qx(?7B6{nK>rZ#EE<2VgZ+GqyfGBVySJ#{7!JBmq5 z`<m*mO8h)F4$nxiA-3n;dYjC@-qQ?coB~RQ>j*e}X7J#T zqjrb}A|0hz==2`t&I*Vm*TXS(w%NEf7@HGDr{nwJ?uQ}qt_nSpAEoutVOJN0{z*UW zri|~0G|Lg{ao_G!=x(jF_s^{}+Wp@baOHr!I`bcYMjrD2=j}0*kkX)%s4DT2c9Spx z1^!1u@sugx!%cw!@$q(@-2}SVnVmLLYE@&Mvu zuCu0sT&of|&F9@OLgXQT&Q_wRCXIhMtJVJ?%=n{#3b&Nu#70+wsD4MaVoDYtVE(M0 zU>)PI7XTCd{B1Uo;WK*K!LdY#ie;ZOkpleKSFTkj-t}eFsFD5qr|F08t@0w{_5^zA zvMi`+T%TkP&F_Rv+cNU`f?C6eV8QFm>WO3SfGf=pNq=IjryxxG19g2<4)-VbSp?_K z^*?D)b#A^)H2#G4k3xvi$fxeofZ=D0m)%;BK=dv~!M-~JXeL9?LJ%Qnr|SX`Bdo)1 zQcy5RR`=Qz2DDCno*rt#2PfaazI+!w2XsR!40qb&{5=YSSXb)$d;3ObBWC+ zz$S@cuj@8jWHhd*$7j5N)5ZyhHkA61_DHN|5R$llYcr;IC_Dmo4zhwRAdb-bXF*Zc zMjV^IKl6bAio!*3*{$t?O%NAv8m0kf579Qt19UH<9PL`mPRox?gf)z;ou)OfCZUI$ z(mi)L39BjTIdRm{(Xz4~BQl?|9|msMRUL8aNOYj4VIac=D@*F z3FemjH?lJ+gOk+?4*Ci<@?Clu9YRS}F)Lb8EDj zI%?x3M?3n&kA_9tZa~}0NJsXI1jy24r?MDnt?h#8aF9d(O03<^9;N&fDU3RjkEYM4 zx|Ce~yLQq#(mbr)KAtht!G2?H2~YlJuaBAoD~Phv?2&Vals20t0Y_nnDE+nD9V+xbckn`PQizg=u<@=qvg7+BZ&;K4&- z)12WVcrg>g@i`WR#y_78%b0cQf=Nbj{%h0hbEu~pUb=VD2 zD1}TX8x~5or_99T#xc=Jr)VR?>D!{SEgRzw>Ix+dzBug{_?d_Qfz+GufpddCwmPS0 zG4C+d)E#M(+;zG@D`=9J$(LY(+FE00{n4;HOh6exY3}8`0@%c_Qb^b_u9_FJ8a$?- zx7~&s?`CMR&P8;7=sfA>~)gFu-WM3_Fnvj_vFKwe3F$zUIA`8MarHQiio zML6%qsEmci4PX&5^X*Kx?2jLde)5R<7a$~;H_@;KOfXdwO+t~2$xBk?xk-1;4Zqff z5Ig!75;qaiMkAumq@$l$CZ#FiVcwt?>rn|gsIyaNZWTG@I%O{3|19`LUq$v&Y5pcw zbbHc~)jJpYDWxa#e!ha`DrcX~0KAb`((_1o(@m{#YWssg!`kHG;c9K<0hptC_fstTegRU zdbSPVDBNJ(dP}M#>DL$SeMWa1`CKT)SZx?_=g4(2#6AN&7^+(q^%7AuhU0!-MHl0$ zqB*CAN=ls5_&x1Xeh7!)G4wwE8|Joq|4mpf;zzUBeK&t?tx)#8z_X!WGOl|sep~SM%br~?8p9i<3O`;B@7?h&*VCVA zlAgfC2#5cZ8Hy8GwKBiGKbDYeAkx!&*u3*r#F}iG?);>ezB>Cmr;5qh^mji@urT}V zzT*Om+_r%F`x$OqeakZ| zEVfr%`L5IZXlLN1Lx$X$+~*?=bbBH!DkWE20Z&T{tCU_B5$>9N<-1b_)B4t9h0o5F zdg(TV#T=ZS;k;e9y5Pt(cf%BKR`r}pq4b=}Y5!VT0!2?uu5S_u400^GsdDb9m9+E0 z!adTPK5T5=_*&)oy9xJVF2%9jIC6B{IhfKk_L`{##PdAGvbj`=i^IWZR_QpWl7Pcg=0J zJdXRWYv_wxuM9&rzRW2JGR-w|x_nY# z<=SNhGv@xPUGak-)aewAOnebMxo7T5*2xJ~5sH(o<|VTno-QCHVnY?OyJ(A_%xV22|PmuFy5Loq4F zbn=14O2GRnAPT`JqXT`o28eY~6n?e@Ds-2HoD|K#Fb8;4J*ux(Su;#_u$P+r-dY)C zr!4&NVqjo7q8KG?4^rt3Rs}x`7pTe(MU{{v!(@9$53u_Y$Fedo=%c9eaGv~Nsp#bX zrKZw|Qzy|aw3&Q=X)G)FaK6co%S4&(0!>{iH(AqD5o|i*h3ecgtD2iT%f}LQn+*k&&g8+CA4~io72&f{q$+MPgNt=I$tt?_-P(o3-eDeL} zb~4BdUr=p(QaSm-a@oliRgmn07(irTP(U$gQ#DYb%;cRbeLJSP@D2g_Aft}^w z4bGV|h+z=)bmG(tRv5ohM+VWmVqgFcl)&>R1H<7ykRoiOCSu@#Ml?*(!|=$Y$pygP knZ_y|X>dsb%+p7C7#K8Aj2D}nzsiA2h?jxk#2k>V0F7~z=l}o! diff --git a/examples/gradle/wrapper/gradle-wrapper.properties b/examples/gradle/wrapper/gradle-wrapper.properties index 68e8816d71c..36e4933e1da 100644 --- a/examples/gradle/wrapper/gradle-wrapper.properties +++ b/examples/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/examples/gradlew b/examples/gradlew index f5feea6d6b1..faf93008b77 100755 --- a/examples/gradlew +++ b/examples/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34884 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 delta 34740 zcmXV%Ra6`cvxO5Z$lx}3aCi6M?oM!bCpZ&qa2?#;f(LgPoZ#+m!6j&boByo)(og-+ zYgN^*s&7}fEx=sO!PF6G*p;ir0B{<{sUU9M>#WqH4lTN!~PgB@D;`rIdQ#hRw z?T|`wO^O=zovKDMVjuZHAeratT0Q-HK<95;BTTtc%A5Bo>Z{jfiz& z$W5u4#(O_eLYQDY_i&xqzVd#y&cR>MOQU@-w1GN((w{b+PM;=Y3ndBGVv|>|_=ZIC zB^E2+XVovHYl%!I#}4)Pma4)hM2Ly6E;&R5LmOnMf-Qz43>#K*j*LSWoYxxIR5Csm zuHXA8{`YgmqApC|BgY0wGwj-im6rmS^jrAbN8^PEIHj1WH#AVVuUA2HXj&Vm*QD^# zWX8+sR14XM!@6HrfzFpcC$ZXlhjA{{oq5cs&VRBUX2VwX$fdjO~`3n~1})#Bxr5Vh%KwFov=k zW;Jy5qsvC$lw>?*BsoPIo}YgJN>u)C^4Abbjx$NW@n5S8aN_T0BeAXWjz#dQ=3v*# zRQrjH1%R&krxBrfITop};aQdE=ZRgLN%n%+^y5BOs|pO6lg|I3prX{gSgQuRK%177 zlE#t+nHbT~VSO995imTaX&SCB&pgp`Izkg}-NV zI%~Z42T+^_9-gw;yOI&!oZf=H(Cot~)w4^gX&q(zg`7ekm4un&?FuaJQKIrLF$<_% zR;ok9K%L!NlTYgW8?uhX&TS?ojtu~oLm(`7iY<5Ci@V)7+gRHbb!o0OipVh)`vKW) zp9OVLDkaP@Sn!ZRa zpfwY36ct~JlEsS7_Dr%e0UL8^zRSsSv3K)+n$b@Xq9*^-p|AFj(*#}L-%5Z}D@Zl%y2gokn7l;Zr z3CK}pP8BDR1$L~R{R^BwKH~@v9m;O_$00a5MMXTe!u0FG^=2=_f-XZR!DQeQ`5S_$ zO>mOUF8Y-Wfl3P|Mk-VDsBp`X&=kMQl<>nt9$C)^A<4v@xtW>qn@`Z)`|gCedb?$A z^S(N0{?3!oy|^tx0p&<-D62OWo$gVhEodpMi;O#DM7P>i6bnTf$_=~8)PdQ+^h30pu>DfM=LQT20!&5)= zGdR6}f=YHb45NFG9?dd44$Dm~B6k3w1%E%atidmZ`Kaw4q&8yb+5=wqe`pXWH0J%);cCo710p3&(EMuAI{aKjT^Z!u)Eq~b?HpnrSE9ftF4Ibs#HFpuPR zyT$g5JIX12nSw?q!}IY^iHMikUh8V)gjx{JN@8Am6<$2Mz^mHY*_n$LNj)%w6Vs2|Kwpq;J=(VFf`y)>|;A@J@8mL zpw=k%oRd`%OdUL*1^Bd27^<|sYM9NqMxOfyc56FSDcG3u;oJKCAOsBvw)JlyBt5jT zQZ;fkKI1}9MJMtnCEG?ZUph^R-lV{%Av1S91fH#pacM-EI@93$Z)d@UUxu6ruJMHVl=>YjT8reRi0SjW8t!4qJkSw2EWvi_K%!>35@JDfw9#W$~G@9?4ubk&}M9<~>f3`r6~|Hun&D&#w^ zZ2xrK!I3O(3uNXz*JhWWdgESs3jPCOS_W_J;0ggAduavgNUuLi`PfS*0$=1$q$C-# z>ca0l=Pm+p9&+rJQNFKvb%8vn0!qW9SGnIO&tjv!kv980`FquGKanhc(YAwQTGx)(9c1fRnojjxST~<*=y|?=9V1w`t~7Ag$5h)P#FwB7FM=E`e^youj?Nh^d}|GOC7mPW z_H&16WtD5M9H)i@@=Vzo^f`%yIQZ-qGuCko?CP8h^B$X|UkaKazJe>9C00F82u$Iz zFOjPU5)>;*KBg9UezT$OL$aW(Ogut^COwjSO2!@-ZbW#lHVfb_k?7DlEGcbl^tn{p z#+go${sx^TPB3R5272wadT(x2lACj6Y4~LktAm z<+#pEqlksdo%9?Q29%rP9C+LM*WZM-N-e*wX85OOu}J7Zrt%9iGjxN358Fy5GGaNA zlr-b*b{4zqiK)A~_jjEnJhRaVOdID52{6I%oS^X6)EYS(>ZE6NKd-S?F}lIJNYkBz zX=;apb)xyAi#nMFCj#Ex($CGiR?oF|gei))16?8E-mB*}o2=$UtMDZxq+&Q?liP(n z&Ni8pBpgnCai7%!7$wG2n4{^JeW)f-h&_$4648~!d7<~p8apf5f~7e0n$lV_qbrLM zH6T|df(D0@=>WA5f5yN)2BIZFqObOK5I*vhD*2~PZSt*83>fM))aLjXIEokDF;KGw zZ_75?2$lhYW)I_!@r8QpYKr4p27lOeG~ESg#8)LE@pH;oozO*hv19;A7iT#2eow_h z8?gZtDstc~s|f{hFXH|~d~zQ~z_94FB&hp$n~Uv_DB!2y<6&VqZs>-fmUU^yuJGdJ zNCHP?2Q+FZr?J{^_M3`92rOWnrL2vymWZ&0dYxz>Kv&GXWgwxTKz)<+J43r&!q}II z1DmfLl8nu-xGa?TgsrX45d}j{QAC!m8iO1JU=|Pb8D@9FE-V0hJEA?F)srec5$GqD z8(`^KQozt$N;6ts8^+R_uiy|d8MO=#Jvd3z_#2aHXjF94XkEdq3myI_UvT|r>1&LP zU*Mm7Fk}T$qbutLyH`@m{L57Mlkq!hAMe>2-o(8*axogLh^b!!{|amH_{Hrdu!4kWol?jSB%l2>w;Jry$!mf_nbz9_B1#8bWJwL@w!No42F zZ!YAr(^WO;wuxHb`%ZD(qKIOW&)L%j)eAUf-WERo1D?D~FV`np( z5x$@RPj8}2Rbm<>mRjfuPFJ`nN>>ltyp;oE9#K9IU>+pE$;Cq!IYr!NXvc_-MDFXBXW=Z9LZM(k9}OKqEKn5 zMk4%l_POO{UM$2M+YvQV#N~$?Ycqe>LbTz9ur0(-Wp!^8a^GDh7h{U~8h980RG|9E z6RPnEU0ccY1fEIdJfnZ?3Nl4X0Ag>*m6>|oajhbexf9~a8(K`2Ys~o)z{jnuOj93V zg4L4K@x2Dewt5Bok=03M@JIhBSWy2hwxcxRv7ukj`8uYPGrMdH0q!`qHJ^xDQ_bLG ze*?ZCvMv^t`JI7rlqLPEo^WJ0b^>d@C~mI!Zv)-ljBg#u;uvw%ZXMqZsz8Mxdtvbh zbK^eGn90ynsgjzKUOl)O`l3#-uY%L?tj;+Edgz+awV132>9Z-?mj*}u ziM4~P{Pc$s;}v&zYF)Te5J7W2!$o`EH|~F3NfA2NjF&~?@K5S*f_mv2@wT};{Sj`b z%#^~iJN17>qQ6aej~{ubsrhkBAD`C(j7{y)+hU@!^SU03F0Vu6vU3+>!lN@MLR}42 zLOtGS+@f@~=id z8&aK=-2+Pz*y)te)kF3xgyS?qgp@L;G(tM1&#!4p&Z$yX2<+lj>VWT1tiO4`_h^}* zQ@WGd`H9t~sH>+NT2d{O5(~BeYjG#5=s&k0J)iACkpC8u;rFz@_E-w@s0bAs_;b>+ zeR6?5n@}4wjy}GSL@%#%!-~chg|$Q=CE38#Hj0u5P4^Y-V?j(=38#%L#%l4={T(Rq z=x*H|^!EG)+e-leqrbec5?(g)@Op(cHsVg4*>F$Xb=BheCE*5LdSmdwZ-MSJs@@i{5t){y; zxAVyon;`>Rns;YH^`c&M3QdxzNaJl(Byct8a9v38fkXaJ_<=8oe=(6%mZ}CJAQ}2r z#oHZ)q;H0pGydy~@02e)oeVW*rQaD_OLr+)29*|p(gAHd<9*JxBnu0W61lNr+cO_= zX$B`VmPwyz9?FV9j3-@v0D7Z1Z}O;#KZ!@Gm7ZeKORcLQsPN8= zAZRd8VWqow?b1Kp8!AiYk8acC$>6xHuUZWkNk~?EqKsUr2$iixV=zYwM9laPwn)(W z7b-$PlwKh6n5^&Rs$#s&98P1ch#7FGNN6yU!Nwzcesp2Ylw~C1F@G^YA!PF|a$MJ+ z{!r?468ju$sWQLL=o~SYP|CBJ7(3`;c^t;TL4ScL$Pvv>N+5iugRLdmL zaD(CzY&3J+N)7MS)Jw`U8u*IevtEAUKN4~AiL82B$4Bl5oK#No3jGEW-o4`>c%G#8 z!h<$iX*efTk1lnM-d*7Db6h_94Y@IcQg@UJ1-g76_d9@vHWB%F55WG&!4DAy{K)Xv zz~7iiiq(J#G*Jdb2F>RKFnc3y>bIwlQ_Jhzoc4h(EOVm|0C}@X1v`lf-*wuaH5_H)kg%$_&tAkc`-Mk_04t+f0A_7=y20O8`7#X)4WDMOUpG*Z~n ziH5Zevf@*c28LS>z60h(QH92FxJHOKTj&>ep>z##ag+Tm*{QU<#Sk`f3)1y<#hgNV zkGRx3`qggo)?FK!Vd`6U+lA@MVk3QlsjDj#M*^!8JsEqK;p+%l%NyiKg#EX^3GBuk zlh2;u`5~mtZgY!005*{*dmF!OsrxVg*Rpvf{ieqF1ZPV6Mm4vb&^x06M8jn4XO#a* zXJhi$qNRT@M;;!sLq`lbqmcnAsSvSakQ{XcfmP-CU5_ini_P>t3m1P+(5I3tq028F zE8xAnu-M!FQ{&(q8oC{RXMCqw5&ri5tvt$=P|_J!+#m6Iz;U2BaX7}7%E%i{`jgjM^OfP1@K6wN+iSJ-2z7%MfLBS2$+zC|(5j4tu zq@N1d5n}UyXF>Bz{_%qT2O=&{@hkb|g++>5oZPMe%j~Ee^;OCr)Y7u{V4m&Qf@%WD zEUKEu%teX>pmF5DMIP1!>pm1D);32{D-N5>U4W*9kTO|z(Tb#n-@+j!vWj-S8aRy<(xvQm zwZ-#hyB%RQf|G(r&oI7iZhf^pG13lCEWA>mk}rI8IFlm%*!~#7;2xQps>NS2$f@g2 z1EoM!1ML(HjM)=bp>Z>u=jEM5{Ir>yFJ{m8hLv-$1jxB4a{4HNUhk+Rj5-H8}G za~r&Uoh}bQzyC)f6#o3mEkwFNhaD8_~{CW03Dv2Tbl4{ zAFamTS$i&ZYWmae1aCxVNIKrj+u4g3%D96}iqw8~HBu+gFA&*oRP5Z`MikjjDgYjq zkf0&#_Xj->@bJ>!}JGl=t1|~ zGIx9!u63fRtm^?=^0z=^H2SZA43p1deVixbphteFyrqycaRq6DLy2$x4nxgB;-Dug zzoN<>vK7~UxLPDR{wE0ps6mN9MKC>dWM{~@#F)ne0*ExL**#VrA^|@km1xCtF`2N( ze{G#meS3J5(rIs2)mwi>518)j5=wQ+Q`|O{br)MyktYd}-u+5QYQmrBU2ckYE7#Z$ z>MgHjknqi-2`)(Z+pJ?ah4UMg*D%PFgHFMnKg?{GSZZ*f3V+g@129FH@79v%&$&v32_So*G$-3SIp6 zYTlLgF2}s>)U;QtdWf5P&xikI0p1eg2{G!w0+xXNuYf%n#X#fou8}EYvAw$zmrjK&OZkS!$REMr$*aG zyPPjsYd_SXp#Vt9NGI*R;-*4~Gz)&7!zq>hh7)i?8PzCAAv(pNcUGlPNf^OXS$=bx(V#ji2eMF6q{U@ z9?ldp%YEsl;)d%}_Qs81OX>!2>kyChh!-n0Xd@2C1cI2qkRk&b4)(?@KY|?%qMoYb zEi7l}n$O`v+T31;YZF(;FEwj`I8Dz*9fbKrE)8#&?joolVY~3YbZuJwfRt4-kCOM; zcm34HXKH>;a?joGLqjIBG|B??@rS`LSU(l!vxSyfKmGa^x5&S$gvrsrlVT0@Yw#bP z-3#zdbm1;n!DpT@>AnxkZ4llVa;h^fj?R3uN5?-F)SLb}a%TBE=HM5_U*{K=ddu;L7kJ## zqyyGh;WY5rpvMm)$*xZHv!CUlc{zU8huQp`KmQT*yq*ugOu_#Kt-kRa+ODx`Va(;{ zLMO*lsSV`U%+u>-R9GmwqgWulP#>jO9|V60TBE z5ONjntHY2V_MmDJHr3CyuL5X%IlQKbDRch~>EBrwAM? zvOJj&z#NzlWa*K*VEZgjP#cAQ-HRG&mC)aqyjY19GP$U zSKm`d_gXzrLE_^a!9R<~vT9n;>{y3F`!rB%M5psN(yv*%*}F{akxIj9`XBf6jg8a| z^a*Bnpt%;w7P)rXQ8ZkhEt)_RlV=QxL5Ub(IPe9H%T>phrx_UNUT(Tx_Ku09G2}!K($6 zk&bmp@^oUdf8qZpAqrEe`R@M|WEk$lzm$X=&;cRF7^D#Nd;~}a8z$(h7q%A88yb=# zVd1n3r|vPZuhe!9QR*ZtnjELX5i*NoXH%d1E1O1wmebT~HX0F~DbFxk=J^<v|BCiebRdAHYXxOo$YS#BHYecz?S6CX@AcF_k;#_IF+JIV*5|%lV=Y;Ql?=b^ zt}1qN)~qaKnz~KZRf9Aa7U5S&Opz~;SF2ojOSD3HP8WYTbvlEyYK~);#wr+UO8_Sl z$-Yx3B~JYU!uChjzf0v1TKYAtsRkH`QZeF8Q$_`7iPJ79{8V(jbX4T=-LF59vw>au zY6LS|t!~Zz>*ops1&9o5w z3lQx+lhgdg^4d0r-%q!s(A$J%XYhUx~)v|ptx_cU#?44pnz*s$G%3=wh_01 z5l7f$uM;P6oqhM8F|$4h0me5--syUE%vI)HuhLv@kL`s1eP@buw&}80Umf5QOXBlP zAY(8r9}paD1p*&Bir^3<@3Cc4Mr>EpoDHghr{U$hcD8$^OZ6bZS{UYhl_*Otp}Be} z-P^9U7tc!@aodKCp{~TV6o}?M9xG$hN$Kr>|7e~E4mJK>_yjrqF@Kk1;fHw1PP`UI z1Aoa$7yGRMrUVO0M9$rM;=Glzi>SO8!lqon9E_1^0b)CsR0%Nv-$st+be?a*qJkqI zUNaqi*6Y^E>qlHH+*M=aj?)y2r>RGkG?X;Rv!7JG6Uz=^g7B`jEKEvgUq)s3Fw|zFMdak((XwlUaSRN4hGMrH zn2xFaLH!t8txnTiQW;qUWd^m#<3zgCp(=5~i~xw9lU{R~o1qSo#Sh1_4W5(^hL%O9 zOauMH!uGL}u?hV!4V~#?F-<;)X<)4B$u1F4 zf=%}>{b#f`$Ixo^Du_42V6Wir?Muh`(!izQSV9Y3d-MCQT|9bs zIlCtJP7*;A%^1-=u(Laj97hG}uP6Hq0+DzAjB^|$CG(?e_adMTiO&^_9WwrW4H!ju zWEYrjLw<{fSyh-yiPOP{O;c|453fxkp`E;k&)d^wYK=ipbD_kG$u*Ro!kQJOppV5* zP4o#ab%r@RITbag_zHMKF5$z8fJd1L+D8G@m^`*H->XyF$E{x;d;A+T`A zR!1#O!ed)ai|TF054f1+K6 zTDH=fps}vL7=Yl3_R)o948I{CP*`f1v{E~-xX#PaLvb?#qQRElOF-pVuL>d8_�{ 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

    2jq7_TfZ- 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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index efe2ff34492..2a6e21b2ba8 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=258e722ec21e955201e31447b0aed14201765a3bfbae296a46cf60b70e66db70 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-all.zip +distributionSha256Sum=fba8464465835e74f7270bbf43d6d8a8d7709ab0a43ce1aa3323f73e9aa0c612 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f5feea6d6b1..faf93008b77 100755 --- a/gradlew +++ b/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. diff --git a/smoke-test/gradle/wrapper/gradle-wrapper.jar b/smoke-test/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34884 zcmXuJV_+R@)3u$(Y~1X)v28cDZQE*`9qyPrXx!Mg8{4+s*nWFo&-eX5|IMtKbslT3 z<{(=aAZzeZfy=9lI!r-0aXh8xKdlGq)X)o#ON+mC6t7t0WtgR!HN%?__cvdWdtQC< zrFQ;?l@%CxY55`8y(t7?1P_O7(6pv~(~l!kHB;z2evtUsGHzEDL+y4*no%g#AsI~i zJ%SFMv{j__Yaxnn2NtDK+!1XZX`CB}DGMIT{#8(iAk*`?VagyHx&|p8npkmz=-n!f z3D+^yIjP`D&Lfz500rpq#dJE`vM|-N7=`uN0z86BpiMcCOCS^;6CUG4o1I)W{q6Gv z1vZB6+|7An``GNoG7D!xJGJd_Qv(M-kdVdsIJ?CrXFEH^@Ts83}QX}1%P6KQFNz^-=) z<|qo#qmR!Nonr$p*Uu1Jo2c~KLTrvc*Yw%L+`IL}y|kd+t{NCrXaP=7C00CO?=pgp z!fyr#XFfFXO6z2TP5P1W{H_`$PKzUiGtJd!U52%yAJf}~tgXF`1#}@y`cZl9y{J-A zyUA&-X)+^N?W=2Fm_ce2w$C6>YWp7MgXa{7=kwwy9guBx26=MnPpuSt zB4}vo3{qxa+*{^oHxe7;JMNMp>F`iNv>0!MsFtnb+5eEZ$WI z0M9}rA&cgQ^Q8t_ojofiHaKuhvIB{B9I}3`Dsy3vW8ibigX}Kc912|UZ1uhH?RuHU=i&ePe2w%65)nBkHr7Bx5WwMZj%1B53sUEj0bxI( zEbS%WOUw)3-B0`-m0!{mk7Q%={B#7C^Si>C04@P|qm7$Oxn3ki)G_oNQBTh6CN6d_kt@UKx1Ezdo5)J0Gdf@TcW|{ zdz1V?a>zldA7_5*Pjn6kDj|sbUqt-7X z5+oajeC}*6oi~vxZ#Ac&85cYcC$5OKUnYPv$Y~>H@)mnTtALo*>>5&=0QMr5{5?S; zCDF=RI@94n(!~sa`4Y{JLxgcvRqMM&T!}rRd~Kl#_X4Z&85;})o4W*g>?TaAVXSWB zeY#!8qz^hmC6FERsjTnC)1Xu1UPd7_LfuNvuVqF8(}Jfar=T-K9iChEuZi-FH(P%u zzLrjpq|?}8?g1Vnw^&{eqw~QY0f*9c71&*<5#9f5JlhJmG~IuV*8~nEBLr`KrvNW! zlLH&oZ58K?u>1{vAU0CtT>Il<I{Q8#A!lO7#73V&iN13;oV?Hl?N5xDK63)Rp3%5reb&3n5OQ|9H zDpYEI%JQXcrs^o*SCFY~iYf-VM<`7Tl@+kQS3tfR-fyH_JDaz5SYEMU-bTCLQ=JVG ze?ZPcj95Tci|bVvSZk3^enqQ?pIcZn24V=YT{cf-L|P&{-%%^ql$)^Vu~)Ida=h$bZAMQEi$MM|&b zY8;D;aEba_`W^=VdKfttW)h_zjRA&0A^T*tF*%+}TZQCOvFqKUu=xf1Bx@T?&~S(J zopXniA?s%}Q4p9~F(Ty{8wt$l4oHeT(#U6sAu4>Q+~a;}I>0>??v*wfke}0TwPaeE zj3gWtfNlD{jRgy7;S9PS?su5pnobi%Zoe0LVpw%`<)V=yT~Ht_UUXIna4YUa;p=-T4df6^;bz%;@|$F zK;s9#K@9hqZCST!66N0uPB+FT*kq22%ow2HirV3rE%hcX^!(Lz;3?kCZ@Ak*MThjTOKU&t+uJdN*6t$;DDmh zFStdHO>r)8L@qO}K@H~7Z);#f6WU{@Icn7Tc^|IZ`;K^ek9eCWdync`kWCt2s%D-k zE$wyPCui$@gJJ9Q`CtixbMF(GiCCbm`ut(~ce-G|Ji|PZ3~DHlG`Asn;skVhnu0r_ zgGbdmfl|er`87x@uYmd8A+!-3V95GE4&_^9N@hp4SC4 zeFU+Z3Ou&G! zlvZy|iHIIX3X2-Yb7YJ#{SYE9lCoixO+}(|u+H@Z6Rz-l1eZ7{I;vk+Y7kP7ev>hG zv|(I<4?N{EXMSvRgUhbQhDoP1&A;SEUGGep8*!@4u)fNbl3%cts<&=m5<5pi7M-HQ zPS#svbXWu2n&m*K6jL#@xm3VSMJxnxve5J6w1qGv`2>5<6F!uzGVHP1A(_xI7CWlX zm6*wpT@dmQ&pAlm`r~T;)>m5HK^H^cM`pCSoh{;-CE43rMkg<;HnZaCHfMq1LoN0S z%%7|$y~&k6wpiY@rsdCY9ZDh%9W6Pf=2^p=;iv-Ah^ACxwK3VmI}SMNneTa9n%biL z#GoojRHxa}R2zOo!G@<8M-B6vNp?)@_>#mYku#pe{O~t?~}1 zE8`)=BstIRk5W*xZw@2=89@ds?eQ~mxzkrA`y<$oR8bmaUw=rE%lFmzHY&aY8?<-N zp1|bb$(XrOMmiYy{pH#)D1GOmv5aj_?waU~*h~s{VZ&H_PhoXYz`C8Pss{ymY_hPG zt{NY&nPMH#FRvwR+T0(Xo2#T6;=oFmRgA9b-HVY72d|~YF+6v$F%sY0 zS#^LF7sTj>Itvyi!~){Hit*~3imOG*Xh51qLz+!W~`vUBVeZZ5&k34SD%Ha%5#aclSzMfoGWjiq9#rl}j zOf*8NY>VN(`W!DxaBgjBzj3oUAVlLY{R}tiZZ0o>K$vwr?+eggZ!q74m2t?lkvm9z zAmL2=W$jQJL>SSrbIOibe734A(K^B8`M@uao!`E$p+9D!rBea8Oxb|p5r3o4##G8K zMr0I9y&`21{@m=Bi+4tTJ-xy(DB_mG$kYv+qw&VBM(A9^wP9;Yo*6{#5tMpfa;m2FC+%l@ zk_cKXg-d&YUIj3(x{)aNwYGYjSHiOQK2K#yWt$vQomhbnF;Qhkxl`+;i{&+t{PrY` zp5r28&|UvmUK|&Jlv>oX4>XE87Zns?fiE6c;VP7BixT*6n}Zsbv$wd{gXyrE&Sd zhRlv!-{%~xv6yNvx@3^@JEa$={&giRpqZG>`{93 zEjM}YI1i6JSx$DJa&NWcl0M;igxX;est*nz=W16zMfJ0#+s{>Eo>bxmCi)m*43hU1 z;FL43I}nWszjSS%*F1UYt^)4?D6&pDEt1(atK(DKY1pAkNMG`a>_ec;KiT z^xMBBZ9i=;!_hNGlYp^uR0FW^lcBrs_c3ZvhcctW4*T^-DD^OU{{hK8yHahyGyCK& zL0>f0XW|wvi4f`bNTfO+P*Ao^L@8~ezagtl%l z{(2uo71sT3rKTQ-L#Y5Rsy#x)Eo+HQranZmk;r_Hf7WWkRq&QmP{?}do0X=;3U_UYspffJl7v*Y&GnW;M7$C-5ZlL*MU|q*6`Lvx$g^ z6>MRgOZ>~=OyR3>WL0pgh2_ znG)RNd_;ufNwgQ9L6U@`!5=xjzpK_UfYftHOJ)|hrycrpgn-sCKdQ{BY&OEV3`roT|=4I#PT@q`6Lx=Lem2M&k4ghOSjXPH5<%cDd>`!rE} z5;hyRQ|6o>*}@SFEzb7b%5iY}9vOMRGpIQqt%%m)iSpQ@iSAU+A{CmB^&-04fQlV9 z14~oE=?j{b{xE*X^1H)eezKTE27;-=UfNvQZ0kZ+m76{6xqAyTrEB&Oe`Mx{4N;}5 zXp%ojp}JYx6PE}Z`IBO3qWsZEfVPa4EEz0vnsFNkQ!kG8tcec&)k$+s&XmPErROoNxeTh9fATBk)w1g|9*~&S!%r0u6+FTn}dK-qa7cfK~tkJlV zMi{BX!>lQsZhSQUWAf(M6+McPrv>)j<*T&hC!*?qq{@ABJWX z@!~2Y1rhy*Z|x`DZUBuyayz}Kv5Pzrh}1wiHT{9|fh`Wl%ao=lRSwEFl*wy6BZ%vo zrt9Ocbicd1q$a{F6`4#ZQ6vJa@`}IGz+xUr*=6TF^GR?`u{1to&gqJpwf$LN0?G&! zsLNiG+}M+c{*j-Q4I zO!=lj&~{29Os}hgEv`iJ1tU)dx}=ob>DHSHKX|FVu2Y#pO|SsigHRgg4?!FX2>b3W z`m}xI<#_02adGka0TuAIg89kS?>*lKyI)T)Pa)|12XfH;k9}#=dzH6TiciCNO->e9m>!W)l&4B zd74@>_LL9OuJ&v5e0)l7ME@xW)9K@*LUd1RY}Vs_${3YC%+LfSR^H+I=(7Szh2nKB z_8bMoty|M+k9A|hGURVePvMf0XY9NYOiC@h^MLs-X@(8PV4zI7A155!RnZrBE9R1> zuI4E`=JTxyJ#d`!(9_s?T2jxEM*E`){wGI`DBFIz%ouW`Y0cKDfXAGN{};aMpLRvZ zu`PZ-3(+Tsh?UKAr)TQQ;2Jz(kv8{R#!c9Tyeev55@5@Ng*c4-ZQ6vC?o#5>6{;?gVfAIr-+^g>3b$}13U^~?gce6s6k-4ulnzWlFpq}*)2 zd0!wP{2>3U+zYiPaNr+-6O`J;M2Cb`H5hjDXw(1oKK!?dN#Y~ygl{H2|9$( zVg7`gf9*O%Db^Bm6_d808Q!r%K;IUSa(r^hW`w)~)m<)kJ(>{IbCs-LkKJ5Qk~Ujv z|5`OBU>lb7(1IAMvx%~sj+&>%6+_-Pj&OOMzMrkXW}gMmCPOw5zddR}{r9blK&1(w z^6?`m=qMI=B*p~LklFLvlX{LflRXecS#lV$LVwi$+9F8zyE29LgL> zW6R-6z&3x-zL({$nMnbhu|plRO8S_EavN?EKrr+c&Tt;Mk)NC0e|cvyXk%VKb5VIc z;|DN^5)t^}tr&-2q)SbwrF>=k$moYK;yA{Q1!I940KmPvg_Ogb81w$_)i3FgFWG+MS?k=BpkVGk-bRhBF;xJ}wnGN{)?gbry^3=P1@$k^#z9*@tmmB+TZ|L@3#3Z+x z8hJE({GEeEWj#+MnUSN^~c!=G+yW^j=cfN_0!}%(J-f1`G}w^}xi!T8BJDOCri{mGBU? zsKXxeN*=L#<-p_aj6cHtYWMJ+;F`HLeW5cpmeVAhFfy+Y=0rIqqyJ-NRIu-aE*Mvr zVnC-RDR`d1nnQu|^S79I>%9=bPNx1JLOJnB**Y`2WCq zctq<)Cq2^Z%=$*&;QxX30;642;y+=mlMLec6{KA208FQ~_S&tiFQW zp2{C3nyrmgkh+HRmG+$_y19m~0z~b`Mo+m6)Qq82p5)Z6ePn&B=!*twk7Rz%zzm-R z>Qj!PE3XMBY)N-xO(=VpO6=Cky5kpl}fQztM7QzvG#a}5$>2$f5w|}b8=3E)cNQw<%e1xAEwaRHu zhHCGB4Uzs6x3A=7uUBC0({&iNH{!7JgQHVa+ zKfQItwD}sd;587x?M_hzpR|TKtTH^4{`G7*87o_wJrFlmrEjk=jvA z6xBPKYjFB9{0Sj0rBL-z9BuBY_3c||UjVgv2kqw2m<@4#>zfx&8Uhq8u+)q68y+P~ zLT;>P#tv|UD62Nvl`H+UVUXPoFG3>Wt-!sX*=4{XxV|GSC+alg10pP~VaA>^}sRr1I4~ zffa2?H+84k=_w8oc8CQ4Ak-bhjCJIsbX{NQ1Xsi*Ad{!x=^8D6kYup?i~Kr;o`d=$ z*xal=(NL$A?w8d;U8P=`Q;4mh?g@>aqpU}kg5rnx7TExzfX4E=ozb0kFcyc?>p6P# z5=t~3MDR*d{BLI~7ZZG&APgBa4B&r^(9lJO!tI|27=ng?Py&aN;erj&h`@1lu;5r` zbfCU2rX-gC5HweRgOr*b{VC@H1|$g#7W$i2v=&YLcVT-m*{}@~?d89N8z?fB22Xcw zQ+tI54})t>I=}Br&)prpXL6=Lm3=JwG@q|d4E|1LdL51PT=Lvr5P!bi;Qc_gL7pNK zNIwRm)Z9J&(94MN802VI;gGw)Z2~5jEw_DdCzI>Z7mhN&C~ByiKHSh5h(R59 znZwSywxLnqSx6%B8^61Ew-qQxIJ>JpqK#9e1qbe~hxqUgiuWvRf>#tGS*)i%4l zJUu^EJTW2pV1^z+Wl{;MGDs`aBzSE#Y1d~ZN9MRa^meG>S%H6Z z_K^Ou^75p~sd0n})tc0uAO5~B+&LMO=7XT3AvQ2r6q5(ET!LEV1xouVCcUm0=Q@QM z%OS<5;FRhsgRwpa8ncwkWvkIemjAiXY@kE$$qLo$aO0ZXe!yaoOw?k%`dFoVo8mV$ zy7b8WSHMyWy?2D1J}zPeh5$MS&WWiWelH{KY#W$os)GU z9jhV;AR5J}*N5(H!SEC`)R}%p>_HdwIDbd z#xE(o3v7qF0|n}9pDx%Ig)Q7)T`0?bD)$~rCu zk2z7YG=iHqe119a zc3S*NEeNXTo91W~I+34oU2~8M)@B8yPE@krO0xWwh$z*jv^o-u| z^q->)=1hy-e#t9~(mtij`tjUcrs$u%Zfh&QugS2-?VG@89thaEDA~avqrz-Ix^zrr z9{u2T2w{oHASaEeEWclmGL{SIm#SR~F)xS54!Lu~_rODV9^mxLHHR@w{0&f(yjYp9 zV~Ci@MXp{Q89{Df269V%=B+JZkE;OgbcZ8e4WP{%E<_PvMW;!j`g+7(A2P{)h0!=; zs}$M97`^kY&ow`ew$b6MdnI4aCTPEG#Iuf;?b{^d?#RjPNN`0&i3oLmH&L+-cxRyr zFtbisl`#Z)yn6*m6pY;cwEj7s12tpjj60*rtwo?cn7gmY4Sa*z$L#evTi#pVGes4{ zPjRAudV-m^@`Z`Oky`9goDQ5+zcR#9g7Qn{Gsr>J<6eCs?2`FOaE=S#)xV?Vgg`9R z*Qmw3S|9RZDfJm%z@Duua!7;MjZkys_~9FB$MQs%v@7-f8@*UqA|1eB@YqrJZ>#>_ zJ^Y6V6Xyz37>OJv(^HC~)bA2}{(}U4ssz%r;SEn7nWM@^rIQrgTshs(?YBNTEODF0 zqc6I6Lf7@E@#d(IpZ{&uT(arc+J95c6#hStY=DLd{?3aIPUoNkuFc|kL#*jQr#DC? z;gy7qj4SY-n^8{6wHdXVJwtQ_bU-w>XxRUuPo`ti>k3Hi3cugt`C(EwuQ&d2lyfO` ze!0fi{eHhU1yN+o%J22|{prPvPOs1S?1eUuGUkR zmzMlCXZtW)ABWasAn53}?BqtPMJ*g>L1i6{$HmoEb@h(kILnMp(2!H!rG?MNH`1V0 zotb`;u#Yz0BZrT1ffVTCV!?{L^z8q11_21ptR0ITbOcaZ!mlWhC_AZb>?2IDV|b_y z9lVt3)0d@W=lNp1ArE;h_;DDQX^_;WtsSIO<;Ly&(#O~Xw$R0~W|xdQk*Y(b2=vLV zt8HX8=;#;$=y}!;Qku2HJbGEzF`2_~&i$&ogHUe5vhx}FLR}K_Mp)J{n*Va2<|pk$ z4tI(7v3A%Z7Z0|ZWw#7%$U#*=XTaPjlh^N(t63xFt_%*WoJ^oq!U0j+Bx`<>q!J&0sWy4&{@#*BOr-s ztZ68f;l0UT3wf@RRC}_ufMr6rQ69Woa@1sZ50Ww|{yfp8!7rMOh_POTE;|zamq+4OObJ-VeTK|D|h?mfR$^lA{E7pk8DRDz*j&r<&fR>GaG*d zYaJ*q5#n251XIpR6F1o-w>LZ)Cb6Ma^6tCfcOItn1o;$#H?^jqOd(PA)B3HaTlJK zw!~?nh-v-_WBi5*B=IuTZOX2sa{1I!#%VMd5eGe1VcL6 zQ!aDft}>TjlwzEJ9Kr6MWh1MoNNWr$5_?z9BJ=>^_M59+CGj=}Ln)NrZ;Fja%!0oU zAg07?Nw&^fIc9udtYSulVBb-USUpElN!VfpJc>kPV`>B3S$7`SO$B21eH8mymldT} zxRNhSd-uFb&1$^B)%$-O(C$#Ug&+KvM;E9xA=CE*?PIa5wDF_ibV2lMo(Zygl8QK5 zPgH1R(6)1XT9GZ6^ol$p>4UH@5-KV66NF$AH-qOb>-b~+*7)DYsUe&Is0yTx=pn8N zs&2Z4fZ1Wk=dz>AXIfd%>ad=rb-Womi{nVVTfd26+mCx`6ukuQ?gjAROtw&Tuo&w$|&=rEzNzwpuy0 zsqq)r5`=Mst4=HCtEV^^8%+Dv2x+_}4v7qEXSjKf%dOhGh~(FDkBW<~+z&*#4T>r@ z>i7SKwW?LDit0b0Q2`eIho4@kQNjE|U%{^VWI%USUDr7YtPf7k1e5W?yaF7DNF6Cs zlTv9JX6csnX%PV|=IOwjx|F55A2=Q!S@FihpC!N_ud6#f%*^&%ula!3e&(G-8;RKq zkICmrkB7|n%lk1P1pV(3=JnM!b>MD;*OgQOq2&rf+hiuDnY2)3YiwOZiW#AB3s&v6 z3^2ZSNS)z0Vmkqkd{q15Mk|7+n0OImvs#=-(#P6bP>Wl+`WT{iU+TbkQ{iqaSP|4aH3OAfinI2%1hWxH{qd@;gy&zJ=|IluB z@s5xreENf!S2g_G{qNS)ZJ|kl!8)b_Kgwc=`)_a{vIbF1FW5& zCw0Vr(EXsP^CmKX0)6wp_}TG8>V&<}fRjZQ+k8~^#7Zvnt>#$1P~7DAU=1JE3uydB zU3fdgXnR1D)yCMEZRFZhovm-%dA3>9 zXiJS2h-RaW;itowzZwn=j6QG`;%ZE?80^~DyA5{UI&Zd^FF0f!#@ak@U>39YPP;>^ za*p|=y{$&A)P|%C5t@}Gw6KgQ>SA;6VE@MnmN=NpzWlrA$o%g*ia|)}AM08Bf##=+ zAt$0DmFpYe69{h_T1E{S5~AcoTed25*Rd&=Npa@hU@Q6kAFCCbW}||JizRp}DKm{K zgL`1k_qv?OSn+ys{e&>W!H4Xws_sUq?iDMeSy65wE^}@nEaT6xCPT_vqaKs&Zy^(% z#ROxXka3W3+?yZvz1Ok>vzz*~@yuPmos5#Ltl^hzpjNo|0pIs#0kCgk5>SjIMXMM* z_No#``}|WTzAd-@mVg*5q7S_wG%MhgZ1FLeliVr3on0Y|05`IcVOZOGmqoR9WFe_? zHx6es$zbXXWLh}V^CoBXIC5+VvRDr^;ax+`U5?0QxaOwq6k zKmG04{Dw6b6YTS%V?#S$_-F9&XjSaUS$?>Gx@QqL%J9z@10;5J^`AA7i>w;cm|Cyh z(ABc_r=wpMq4B7EX_2S*PZoS&lo|T288ihZgIw!@Q3n}1(;{#imM zWcSRIbDvSLxPHYqwh_Y$Kb(*MM%V-}D>&@m2!r}RCQC1@095?nxg=TWKpidoz$NNp zYS2cN5jhG+myw(tGaeqhU#5a%GgN(j#>z?;;F;tDF?_E>ZtsWetw#`l0jC=XfR6c5AWezg%(`Hl_%N~q!n)2}KZrld z1tfA0N0Flfn_%@0=HctOJkVpQGju z)3MgIa!e_3%)?K^X52R+TU2#W+L4OvYf!GnXV^z4DzRqSuRe9q7|Tkm&r&~(ep&U0 z{3A6-k(~=b^e!}g@}s$|WQVh_L0%vE(cvCR z*l%5Spfk}eC%5jrtGO=7+LJnUEKs`{m#D2Q0!NQ`}z<3<#?KY-1G9+`Vi#WyxpgT7aPA9I)sEPt! zHlS?W%!srhu@F`j@!O)};UXehQPO>(xh7!fZwwu@ehq4!?3M7Puw#6TS3;NL4;uEc zg>_qh3wk;?TEqR&;@X3^%HlSQ9HG)OKpy+lNQ*H!@ygaEm6qmm_DqnAY}K$~v_*w! zkbGz`woRGu$w`TxcNC?tsPS!rGo_%07SPtipmDlCh7zN}?1zpkA@)V%)aPPO*5?XK z^w?Uay8#`6LFhRBL>7PYl((d#H`@)0-6!UmOrnt{2@MS*2le0PPs`O_`@dYZVNjv> z#WzLArlP$xda2zVl3)(=<g#7FFzL2Qk4-pX}#)Q27}U z6Dhv`wAX&bcjVgze7nD`hDf>M>GMD(s?fYlvv;sZ*y2o;FE^dc(3n1JCyHDD!*ma+ ztE2}+RJ>A}wnz=5D5tBaWWESJbP4mx{l)dFP&)KVp?P4XNgK5|>(x7YdUl(&d`pe? z)5|&`rPo8x5dP%lt2mqps9*g0w09-cX5<^x?FT#{coW&gI>PoJRJ93o8;#v>q8eRG ze0&v2sfJza!f|@tSD)Fb#pyHvQb0*YGTQ7!RxhWc$L%^5$^u={ zI7NB8+jN!zUF#w@%+cMrb0|da90XKlMBU}T@4a&!zK5Z@Xa1>(Z0`z;GpJJhulg2wd%~ z%L*zTSO-C|h-Ks_z3?e01OqHtZY{&iX_?N!E`Iigyt6)5p%;jKJ+S&QOnU~p!x^;1 z-%c_mMhlp8$tfL05HhXAZxY{sl!AiqI_1gu5tiHIG(@o{oVw+Xg)&vy7QA~*dG4oujd;fvgvLWIb8Ov_vuMII(XxEv$79@GVR zAK8S)s_s8lEL`nTvWlfsxEz@xNI5j<7(QQ?Fxn&U`#Dd_>HDy0y)!LbGT(SkJ;1&% z#9-@!kN*rs9J`B_=uqW9zDDb0!Ke(7;R4fFF_iCG9 zRuo?f?41}CO-8&6_Y@tQqHIBs<2D%Qvc9w1Fn~KEnppq1>Qh-iCFB48@q+S0$O3os z{G4H6%j#@>8RMr6{!BDVr6yaZ-DE?HCGSu2vjXUW!Ww7~7z(!a7yz!ZUF$QjqCCdV zX$-qlhmmmPMz88&oC8on%`On0a6fr|+7NmjGe7xuo3cT9XJ*Ai-n;F&E1SQC57KSVmWrdH8Z}}+H$CgAp6uHY4U7iq$3r* z$r5kf)eJ%%**?QJW5{l2VAKW3fh>PfbrwOdu0l11#VESBjxKnareT+TB!O!)D7SVu zh^uo~r)QO%tAbitru3T@{06-mkSp?#iIo6DQ%hDXgHM-gi7-wZ zwpGi(v_W>(XoiN&^vI_2@BD0qNssU>lkj6p-K=we6-9F6yC(+k5&xM?$8v1V;qQ6K z!c#o3X%X+8weteF5+!j6lIOxKuFVb~%DEhS5#5i~;jzR+NO3irc384Ttx z<(cSjpWE3=UO|FZcL^gUv@%IytAE+i=fOB?p|C(JdX?~s(s2OOyH z;CC(S^k2pKhUh6G6H;lcxy}%u4r0MSbMIsff5ST=lm9REc*Q?CI{cSX%%eN}Du_Cc$-U1VG>VQ>Tc;0X@$BBwY6MP_zUmcITyQXUJ&040VH#kmGQ@gc$= z*WhGC@R%Pv2WMD>+34tDB5Qs#8MdxiAB0PG>mA+Ma9s|Sa?R`lH;6>1jLL(M`0ViK zQqrxC)l?czAY*j%+gR4iDO!AD)ml4Vkf&w0K=MpotEv&QOOu&@g=pIr~b;eo^(8BT(?FunH$AF3j*ZiHB%C({8I)tTa3VRkn) z=9uW|9))}J#GUqRh<&w4yL15QpK%2bM)-YYq2tcqZmh#_)@tYAn7$!Z+6(FhAPs2p z^%a8A6xo5O-hgk)a=r7#iC9Sn=%vgrQsl}WCq)N+4q*=_VT+ac3I+*3lJQ&#epf@`!?G!7S(!aZGWqpGk8(*`ig}*V&iyhzH;xtxA$y_N z>tFo2YU_{OyO&-VeL&NZz`GG|UMNC?ekTaV#~9b%=yg!Ajug>jPa8u5Ln*m_z1#k& z!sFx7Y?AJVFhC9tQDO&L=Bpa*irKIJzUbr2g7m=&Ui;b_(mq1zZ<=m_4mt>B4ZDbX z+$CbV`11;I*ywC5F0ZsLUbjqC@zQj3Y_@wf%qE1;F6PtHVAo!dBPs+@NLuNR1+LPH8mI^6AA9-ln(yD1W@_tp1%vmN@3VWoRR)}c*_Q^C-% zj$ea)YC2{IKN)~Bx8xKL(#3rqF1(xvI}0!c=V??7hFv{ym{=pQl8`hn$bxi}?vXpY ztw&{<%0B6t1NH@6d_+=D1fnz9-%yFhT)rh<_TbQvmT~5x&NbGw{s3L@O#OT`=f4<8 zy}}-S@7g5nkw7qXXDm!{mK_f}2z_fS9tfklc2D@&GKvQdfNH0;Skdv68nvu4OlTH8 zBb#~Iin))Ptwv?hs}Hz;i!WfA>h*fuWNcM@+wbuxg;Bme%Vpg!O3orGrK=XK=2I%T zeY|eK+3G_DI1Ia6DKo$zjwMN|+gb(os>^H7F|5cHtGLzAQAjp8d&>+j-Fc|&yi;=_ zty1o9s0aazM8%TD*yXE<8Sy3;xupv~OpE*B@A~c z3YwmXFCuRZ*;0bUWUYVVvs7lu6UF%WZh`XpD<9)SOfi51<3sLIGI>SGd~`wGqW;|w z{7AD?ounMxmY`O_gRB1i6Ul6ToZyw~O`m*F$SU@mLt+0nM=b9Q_d+n#`Z4w+|KcqF zVJ=ukl^iHbb`EZ#4o+5WiO$V;K;%I7FlO_E##P88!8pn6sfWL3I=s5X?os5wxWh^9W5c+6f);gal&rcpAAxt>KI zt#>36b%#`+E4{ zxAQ;Z8j(J}eo|4g>`+a~OOVPleyYL7JqhW*pAoj>mo1urPwsr0A#ssSaZ zr=HX8%}@bGR9)^_T`Z7c(ABBdBrkcVcsU;B%GmSVtX1DE!|8L%^}-QnnaNcv?2ms| zA1}JvM6SF4!wEZud%_k75D>H&|K*Y&UN~TU4IUs0KsvY|y6}%E zN>L%XAjjOs+WGAJ=wAmEmK)JGoI&Uq$`1%&(sh$n^lmT{o9pDd>t(CQ;o9Sr;gFtdZ>-qZg7jbc*P~uh_&U$wOO;{P3h!F3|a}dH-WoGGsXGBvB2c7p<>_ zCnJAYP}_#gD0t)$$Is_In%83bCJkJDij^-Lbnh)JKexs8f3E|dDy=BUEES;}7{*+o zxV&iNODhNv#y<$}=-mY})V@*#j#N6^A*3qP8zE{!-_YomKdfYc%7HC5S^WslJbIYa zyh$BuB#+=sczSh4UhP(?WG6x{#9ux1I7BF9H89bivmbZkG!DCq!^iv{HX2isn%ei7d!X4M&l&Ix#C z`sIC(K6h|K_5T2hKy|;&o#A%*E-z=$Kj6W8U@Xh09 zJ)>xHkZoQg!{E*R zBSy?JCKOX7n%2$6-dzz8T10-8&ZG00yi<2%x`4@L8oj$ZXP|WgZ7E%-(h>@kqIJqt z!{ou4J@Anf#HcEwPSv)TmeUHAmeK2Am3|mkp+~W z?)6eVg;c7e2H48xBw;iPnvFX(a}Y+nn8^W#;6K4qA&N3hg$HYE=n|Dy)1^$6Gxud` z0!yZ0d*p;(03ud^y^hvb&{_%?^-|c8>2fAn_!5YCX`?Ov6`*x_BAqZdP7`m!E4|c0 zttvHBo2}NJT1HQse_rYk1e$5HO|)A}>0a7uufbmK{SDV?ndJ&?hXXVWWefy|nb5Ne zb%C#pK9tl%P-U{v%DOV=mf@tF5qHo|q4_JBR-PLXOPn6TUrQ#9e83Sw*iIvU^kn1C|EKWK_mS%Ah;Pks|+@@ zOxM8{T4o@Zf(mvI55b=nM5d)6kW5m_Lx%`#@%0J~At8s1=`iJf)}P0 zCE6_pa-@`H5WIHbP7t4>QJLNX9vAkd8^)UWbAP6$@LZXWxAVbOYkgCYh!Pi4lzTy z1%B>Pf9ZYnAH}3-*{;*nGg_ZWZvV-oB*dF(WQ0^x71UW+hk8Cp_g2sc=tD&+CHpen zk8FnaqFX;|TH%e*9ifj@(1+=xs1s>xxwM`XyvIu)rw0VwCz$GAQ(yL@$J9)4{viA{ zr49G#c+Z$S3LaiI8H1fq(Zeb|M4x7oLLr4te=>z$^SG9N2w2ERGL4D=I9HuNqS6>W z3ax}f`>ts|P^Zvm@RHI@6xXbm9v9ry(J7RMY_2a`aPR71XW4B1S$a}He-4?~NS8>v z_Z&;WYl>KnqBJ7-hpw*<(4p-DB;Erm4B z)LPDS{#kCnL(dCtzl#E4aVwa$czprcYdPwIDCcme_C!|1U))PSuuI$zk*W(Ap#uWp z$Ho58;-{sE*^$YJfcvRRKNF?1B4(sbe>9@m?fS5nel8lSJLrFy&YLbuYc7$Di~9RZ z6dwe@uT*+bv?gxRf2UDHLuJLEg$yM9E&WcA_+R7?)37(a^as(%yhwk9vCtzREf&@5 zr9ab0gl1l{v<@{6C3O?M!(VOl{tcWYFhcWyW`&qG3pOe@HR0(&Pf@bG-DEH=)i05VspTrF}nH!FPJEICoc z3S)q%V+;_aFop)lP;Po#SxD2ff0q4{T+T}wqs1MJ(W0uHR%OPB;l?2?$s`KN)Cwvp zIWi|N=M^e1V@wxwhcbE=o-@%8PA~qV;Cea8wH_!IqWp_Sb&NfdNz}9rhH)r2Br^t)MeQA%TY4kA4{q7j(jMtJ*xS>w>)_TMT^(L-L2JjGxOJj&ZV-)g zgVi{5yFFtT>@y74Jf{=@f2D8cEh09yg6#A&72XCLgRGuD?B$3Jh}mU9;ruBh4ewxD z7AzgZW*I&BN(>mhiz!$}F_R7^NNhzIC6VZOw|xa*NB`8Izi`@_wbT62%UAIpm3#SW zG=pW%ix>j~;()!P=|~#*s~lrgJ~te{KY{96l8>ex)n>uuGMb%`c#snwpktC*Tn4EfgILng z;xZ@8J7YPjGNU7ziy8fhkvX(Gk4luczopwj%<+s`80do~2D`Ae3vs%C2n@KP&f1Tw*W`gvc{0^aDj8k(= zqot>B`xmPR?nWM z%F_Tp@8f$^zMC-xxq5eR4y{vI3_c*+I&2E>TUd_fzE&@Pkna^rKrwaahT_Qipb*^G zDr(jJ{9!?Jf23IL(A^If6~w*;?}1Z(f$4(T18(_hnK5l-&KgXmo>nd-3e?K(mCc5>6~3tQ)BGjd zE37LV)Q^&pwQ#S)&+u1NlKHDJYC|%1Na3%+nyEu^jPYK6&d&RoKPnRF@-yfpj11b3 zZ`tb@e>%>eq_``WHjyW%v=QIIjMQf2l5wjwh-GwmTwut$YYW7S)B^oRCLq)v5C#Y+ zjB#TgxNhmo8p)ig+m?O7x>V%vtNgs^JCwARHbhpo8tiRe{t^FJ)aIYKNc@@Cy2(NO z%_oXe2h_a_mDEVtmb7j{8H0tCIim0{RsMyjf5xg%)u5J6>nIZ!1*crg#_ZLsWwQbZ zRQGHCjX?b^(~`4-%8a=}HZ#K!NGa0IY^23L=>CEKsPgamPfQ#BAATw`rjrHMokCmE z$m&;$>$>FdWOl&m)`l3}takOU{5O^V!Y`N18@mT#Hk8i4BUNORx;`YLf13b*mCvaB ze-8<>i!%lf^-2;U9Xu^Lie6DxK3T%#A{V~ncqJJ#j^vgU*fE*tQzR9Izl^818it9a zpbd#{E7lZ_VRf}Ec~xnS$S$5Fa)vkpeqLJ|acM0jlw*p5vTxcoxin9j54VyQ6lcuB zR|hLNBB)YOqvR9U!GXe8h=^BOD85uIf0M*0GA*2n7=9$tiDqrej<}AS5rg&?cv&o6 zpi1XUOT5%!|GH4fvaj?*$t>7b&`TGoQk8_MWDe?v2r}Dt(=V&+RUEinS|JRG@uWH{ zKKj7Hj+!Oxo*$h3JSiyE3UmxBOJT8wLQ9;~a_QJ0+H$+Y7xq%5dSM}87BbO_f7fWu z3%N;ZkQ#*^Fy;8l+=R>08U>@C^*y3XHwO(!x~UB1eKROeJu9R4i#yRqn*t8KOlnf8 zLRwpLV^InvOY4y&6Y0aoAta#nWk$@|ua--OGHHW!xhjPv3`wq-h()h-g$Rf$X%kb& zWa>o&%jl;Juf;h@ zYL`0DJV={S3<~|QxVKlNt>PnLnaimuw=2>%bOF+Krp5q#4}8Z1N3?_qAS?S%)arm{ zWw3y0Sj8X=>X^3NqTq|)7_lk>iEJQee_T8ouuaPZ`ZGo<5HsR>A7m?9YOlD%ISXt11#1V2EoPx>=owC%+R@3XD;+F; z=(T8c8;0RJTsm&wf4E6n@v_B&nSvZcHW#06QG>Wc4M@NZjXq_R6tyGE%uPgmQ2BjdC;x_^K7e<&Sro+Qon7}Z6i zj>=e%vr_NLQ=+o&BpJok>#>>@t9yzoIjkHJE78hf09L;KB)w^jj*Zi;(XexzZjXje z(A)F$&QZE+l#Y+n`=Vi2$nPAb_di1SF@@cJ_apQ%rsI6t?-IX1$@BzBhvht-IL`O` z<;uJelNOBA7;pvZfB49mXR!WQo}M^PexS)v&gcE|!8|>kr>}-xBWE7K{@1Mi2C+ZC zIZxkg5`fhJ{k9ES?Q&jg{rY^Kz9*250O|V{Qa~U%CqezPdlGEt!}O!OX%T>bVgb8H zsA8Oc79FMkJ{1BQAj1lz_A7b%#c`?Pf$=T5(=0B&}8~ zQNxNwRw*HCGxKs7Abuqb0wZTm!A@E!voDKNVzcs90B98$d1mpu$?pVH>>OjYdz|h7 z=c8OvnalIse-rG>^TJ7MQ)h{-eY_~oi=$1-J+wg3^YM~AU$kfB%yWKA6u<1KR)jRN z^V))`t?f_yozajua%E*q=!xg(Q{=;$gM(CgBtI%caf_ z(Rsq{@aD+#S}=pC86ka~*GGN4VU#aFW&hkLem=}?e|vn~F~*%Z>oir1(1J)V;P~B; zpF%#~KE~a%?9Q`RT%aOCGZYoCbw1uX$~|Kog$!cB?q~! zdDf0Qo*L&^G+IB-%c7$kALW4)e5h-jQveUupWrMkF~&y@j`9uT{Dx>3B5#~;1W8xj zD8D&0f6BK2KH7bPZxi%s6BzdKTl4((Xp?-8aO}B$ceSl^VLKn+QQT7@lRQFm{BB3J zY*{801(`8^XP)m0D?Wbj7{5On_W1Gh19`qL&mS4*kHL?eO-i0WS*?JlPt9MR=TBSi zCFAu3oJ*WezdvZZSy&eKQ%>+G2tl=09#H+Rf3Rl+Zi1CZ#ESIpy09nYSNtA9DI^G; z;Ll9Z5|JT@L8pS6=LDaMhSef9kKYv$QmRE_E9?E9x+#R7EG1O<>7Jl@f=`e0)6s|@ zlKP$XQ0bTR{H&FQqg^6St}cX+CEqrS#MdXVu^sKs^EdCN)gfU|nuEu;t&|cN=jWpW zf4BaikH05EkAG0a`{60><}kwSr&av3l#hRYOk3;XuMV} zFV=&DU*-9CmLvT++WizQMWlnqEBL#Bo<24v@d&Bg{c`sRFGPy!hJDXGw0(p%#G{63F z=LblwcdY3eAs2VmpQhd8QdM++1Q6AEX;GK+F4-R9ZGBt;ETo9?DCr zv0D+1IDFD2JwEADtgpk0jFnYAjJJ(@@>0vEgx;*>?T$KtwXGVHwg{EYV4k~Ae-(8M zq(-WYZ0p$a#PooH1&29;1t$_t9$S2(58GNS8Rj zOP4xdqRX7GP!mS(wXWr~Th0}t^{$I4?CPWqt{rr_D@Dz&!?e*gOjo$xOPgE|Qj5Ea zTHR}@&3zZOyYHqB_w%$_-a=dCx6@YnYt$*fK-=U$L01^rp)ZLX{|8V@2MEVi07E4e z007D}b)$q0 z%WLwQzAecs$;-NdASxmv2qLK4kS~#nq5^hlp^Wh%1BQZAKtXf}4pBfw6cmwp&P}qW zT{hR>FFo(vkMniU{hxF9eEi_U02Ygt0^2UTZ1s{$s=JNge?~JFs`gh0d#dZJgLbsf ziWrV%$9z#cWYT!tjF?8kq{&_*;S2Vf!HtPzG*RvEF(L`GzPc~$iyD1Ci)C~-H!lh< zZlbmECE5Kw$w-6-61|3R5wT`0Y{g77ZpFehy2*?uNEeMSX*jN7i7#Yss=ic(5YRg8 zWISlDv?8X!e+)YwZVbnbP{eHPj~jh`X1uXAmT-(nWZohL1p<>d7@Lg7h!G1np548{ z3_1!t0yE`k(y=0qK|2;q#^YwpX>6fwMt8(ipwh-oMr2;Z4jPg3t-iFjiEVP5Wj8W^ zl0Y%930Vneg%uYl%W`q6JIRq+8;=~^6f>R1wX0ice^UuBBdtAFI2o4_6~UJ^kg?F#!|#Yr2j}n9N@@1>7~fuMD#_D5w%BpwLtNrqnEG8-Ir6ou2E2f_VZH z!ltvzf8c{mpVs8;#;m70j=`}S=A%Yn>Zr&LhjZ?R7!(;@XXOpGy-LRkte_4{1m@;F z!7*B7==^LD=cSdPjHE!>@hvj2=j%8b%Xsz_e=^rfuoNB3(?h2TOd@BOcPH#f(lJ*V zPOpv?Y41)Ks62d1DEI_jNFx|D6O@q)DJR1``t~a28pcUU-Hbr2w4G3E7TSV_>3VOTsau3RY9(%sAca@`GltA}bxT)ik1H!5XYB ze?kY&r90kZSdnDhJd5IBgehf8^CirA2(Y&E2`TajRIr|su8#*Igb3yNQi%@vQ|Qug z0WPFt3=sf32k5POw*CcHVT&e?km<5rfT#*GFEMn@M&;M?CEXnO;5$&MkH% zLTOA|6AF?7MP{_m+0sTkD8^Y27Oe4f``K{+ti76n(*d037~VYDfUe=5dU z+nO0CJFdc)it$BUO%5G8uizR=3aYQ|=4MC7SFo%Y*Wx+?$Cw=WD(3RQ4HU_UDH>}?$Qz?#n3%XpD7%RuqWbW)B70MGJctpNfASD{o7H++ zvZu$4o1xXFA?ww{bWYj1)>vOM11H((N3yjpV{pzA1&`%9C|O8;qTz8oAyBw>%}U=A z6;BG(jxNlRaoAGyw1!8qhjHlOwzNr^`JZaog`d$CAt|9Y>il#($06H=pOe~P#7@x2 zFSr@lgzs*2f8e^n2IOcmXU-YNne%Gnnv>GNc2HZc_ZisGIydd#(P!m?R4 zivLigs3CR?D@I^FJ=eFEUL)RNUX(Or!8C~c7a#Nf0~EDxE0#HP zRnWs=+UPC{6t^VVf1XabIi-5(-Jyy?!mSgUnpB~XV_Ytcm>sjoUU_Xrk!*W}#(=%< zFu5&sO%#X;B$IlJxWmOE*VT;jlXNjjOy-p(bjuEzRzw+xz_6T^Tpp-LYt==$sL;d| zF_o$bnU-_S=o062v$^+A7hX}xo2HK`WF$0dI1W2MQxmgfe?L7xF+ZjX`ttP1S%IZ_ z(rDdbbAGH~(p)X(l58=L6)YK(CzRiGtrc-B0eI$hl^z=3O{Ygm)&fzhi5gKyWrR8) z>bsJCjxKxz05sY_@G}Yk3Dc=EH=Dtv!#Ajku0+&I@M|%_fIyc`EM&DL*fHD9e%b4a z#j?E+)M{6be`;Tyj5$`+JbiP}?32xoXwpP8m%f=<^e{tJxy7oghoq4Pa<`(&N{~HO z^qjLoRa7tJT!Sk7SsgN9G|@;e$Q&I@$3Q{O#Il^uu=VVmiBk!-Mt8Jk<70+$)=(E; z&_XY3YUUYE+mq35Groo+M7UH)O&>)Tg_BG8Jq8ffe>0TcVv^EJOj3He0dUd!GEAWt z_X^@_X}^c)tlGf(_1=OVsHoe4Y4tl$>Dz%B-ohQ2HH10$f&WTSjk)Q4h1*FdNq1jY zJA(Ovw%S2VOJTtX>H@W0L#UVR!W51#ZKi)IoH&G~gQ!g5)U9Z$OQB^e8fZ@i{VD?~ ztQIWX*I2w);@?C{sP+OFC4_IfZtP} zLT~3FqJG8Qta_S@d{Vkvu5N`^@ADRYnG%9GerFINTpiWH}CfKwRa=su8@xYMtWNUdJgtNAiV;Y+Vv zf0(n9&Vd3lf?a|2yyMZp2p%U3hp@Z!sUbWwglALO>sM2F-mChR0km_#io86qt3HtR zNa-qlkvtm4D=F+N{ry3=vh!+J>Fd(tHxEt;zf#bwmKV7$3^W(rBK+m*wvRirDL}s& zQrJB?i6Atd4)_cBfJ^^8jKAEEf28nXf9Xdl4z_0iFG!aQePzN$eu?%GQ4sL##QTAO zx3DYVE)$-Pf-<3Y6gGQOqPX1C)iER{rbH=aO-fALiUh}@oulAayfieU^rNVS(J)mTl^2~@tAe^!b)l2(foB|TZJmNY8*#H->Iagn%6(yPU_l3p*i zOM0^ymh>U9SJJ)Wd9fc5FN&8WzhAt?)OC&PM)w4HMnSamq zf#jJo|Dn53@=S?$m$)mKmy~z{%+m=xH=vS$SKv$n;7+))4h8h&FQj*-2UijZ-vAYN z5vYCyO)N(-fvhgVm>{B<=vszJt~HqKx&S4vAWB_fl({a&6!&VByDvb6JBX?7UQBau zgx76LJ#Go~?*9Q$O9u!}1dt)a<&)icU4Pq312GVW|5&xPuGV_G@op77bzQ0`Ma3II z6cj;0@G{*_x6$l@WLq!9K8SDOg$Q2w06vsBTNM!*$jtot=1)l8KVIJeY+_#EvERRF z+`CN~+)~_fcio`v*4!Y8Ql(|4lGuxq7O`$fleEN}9cjIwL&2@>M%LYJOKqvn8>I&WVJ`e@>#4mHnuhzUW>Zd z%6?zt$4SI~lcxhlC4TO|$3j~w-G4Q7M%K!ZiRsf{m&+`_EmNcWDpuKnz~ahZga7dA zl|W%-^~!;R$uf$lI4EIk3?ryIC}TXYW(0;0`IS)TrpP}tglbN4Rm~aBg2TZCuXEfj zpuhoC)~>H#Ftz@S>Dn`9pMU{c7+4fO0Z>Z^2t=Mc0&4*P0OtV!08mQ<1d~V*7L&|- zFMkPm8^?8iLjVN0f)0|RWazNhlxTrCNF5O=L$(|qvP}`96jDcE$(EPEf?NsMWp)>m zXxB>G$Z3wYX%eT2l*V%1)^uAZjamt$qeSWzyLHo~Y15=<+Qx3$rdOKYhok&&0FWRF z%4wrdA7*Ff&CHwk{`bE(eC0czzD`8jMSo7v#dGI|cRk)Zs-;iqW~MdKn$EVyTGLj3 z!pLc^VVUu~mC-S7>p5L>bWDzGPCPxXr%ySBywjSH8!T(g4QQ%tWV0x-GTxc>x`MRw2YvQwFLXi(-2*!pH1fqj&WM*)ss%^jy-O~~=Jod&rs3`p^lQh*xx>$V^%w2Z&j z!JV31wR!8-t%AmCUa;)Y-AU<8!|LS2%021Y5tmW3yZsi6H<#N!hAI1YOn-O#a+>1^ zY7Vzo?Ij0y2kCaYgRP(n3RWNMr&c&bKWjLyBMtUYkTz4BLYwF=K`m0W;2OEkJ}Z|4 z-hg4pPhmj~dVa#4Ok$m&rpk#@lE-jhgrW+yQw*XxjPPMNp)uTkZ2rB2)Iptm9_-aT zw@Z(0YjS%(ZC7XqyKkA{^nV*Rl(6i{Anhz^*#)h&3?SVSPA&|N-F%x}bT_Y02wE{; zM?c*o$Zt4%`65BuLv73GUb;`vqYp@vs~HH{#%O^rt!`;^wx}6PcU04I)wE^0nqjJ% zISH|nPKNGusC&;&prdD0*HW{FnNjt#TH4J`s@rDeCOZPuGcS}&{(tsUA6${O?7Rk> z-W^^Hh+{QwxL7Jkd+C0K`so2dTfRpG`DsAVrtljgQiju@Li;Ew$mLtxrwweRuSZebVg~sWWptaT74S$#u1s7ZBTHa52W{3I8 zm+)pOWYR>19WXa<84{8gUtj=V_*gGP(WQby4xL6c6(%y83!VL#8W`a1&e9}n@)*R^ zIm^+5^aGq99C`xc8L2Ne1WWY>>Fx9mmi@ts)>Sv|Ef~2BXN7kvbe@6II43cH)FLy+ zyI?xkdQd-GT7R<$v9kgDZhDVGKTPlCRF1mA9S_ov&;gF&AH@(u#l-zKg!>k+E-Qjf z-cLWyx_m%Td}$9YvGPN_@+qVd*Q)5cI$TrLpP-Mh>_<6kysd!BC`cEXVf*Q0Y(Ugd zE^PYo5;;FDXeF@IGwN8mf~#|e4$?Ec!zTJEQCEM2VSjC;Wf`Vg*;)ahW;Gxob7z~` zW~NXn)s)F=lj^v3T31JP-BevIkI)8>oH5+-jyAK;GP8!ASKV>V#gDFTsa`xXt|1Uc z3i&PSgl%D=JEwj zW^F5vD1UeDg2OE5$hxnCFVvbUDpIEl_O19mVOmP_8bVz-kCsYEtX_1Ovbj+KS444hDHKJfNHwq&hQ z29#QGU>;3PSjf!&)Yr_T8HS#)YF@1v9`RQjD zr1yF0XiA~y=y{YGCGep{s6iwTA*ge*SZSH9K;{Gc1^NWT@{>XOdHMwf#oVVr5e4%x z1I%+r&CEE*Qu8V$tmu5mm?%|OR}{L++~wCzm$RIp(7a-4uUW|Jw)8G^n5G$)e{tS^ zRevIWx`v3t^JKqe>w9y09=jp{Kg*@dXXrZU#?;Tc<%xwMJewbXg?^RAe+_wMk=A>m z=A@r~0~#Z6hmh`q^b!Z`=jde+%aR2&hxQ>`<7bXmDk+!%e+$*7qh)2_^In4P`ktr> zO8z!|UZGd$clcz~c=h>Hr~z=--z_oAmw!Nq6({r-vRRJz0|mD#FZ{ls+p66(fA$X) z`U?9cH0RlBfikrIP@yl=AE9!T32=5+P-i$<+jN!7%+FG|&!5nrvTOegUa57UpZ*+h zJA>p2ga0MxsK21E^Uo8!3b{#gdjViLwDj?{%qL2b=fc}>G8GrHM z04YZSz|%^HpkOH)4w1W41*h(bOQ8mmEBsPEo@ObLg93$OR0O5mpOMj_muJWzi zcd5+~DdKi<2U`M<%O>D6UC5#6I_&6n&lq+LidLWk)0^OY9*xW4fM}}_(4tNKVhgr% zbaxmv1}d_H<;08!&5{N0g2W)&MMM!{5rt{6{~60ZbqGntDu5ToKv2X*M+0=~M6SR& z<)ddMykRaD#Wt~>_t=3wq<=D6rYsQ@J4;ibrnTWEV_xiHnY-c4F?oiIdnZc;p4g27 z50m%IdkG@6bOz!c03W3^!@e}MkjzV?@Z_6Ck0S09y;xv4TzT4dVFJ}bQ1pW-F|*f4 z{BIQzPD0Kdvk|QP{?*Mzf6Q4J5u5wBBE`9VlR!DpSj`QxGz*C1KwY`uOsHURS@Wb04YUIC8;j5AVHYM92El2AI3|7!eaOO$$wm{yCc6}sue43iB(dyLTG_^#o z(%R@%3dOF{`pXhN4YYwamKKQzu%sUCvS_48cOEU$mW!m!P=9=IitdXRX zsou|$KQ-uyjWqQ}X6V7eYqT$w6p?A#KSdvb6cFIOR4q2LNNghFd6ACRq1M@i@lB~z zGSZZqriY;H1%C=h<@t9;uhDT<@L}{HO(kEVmC@_oXQ(0S**-;H@pAPMql=DME;|u{ zPV`eSkr1cw8-cy+VdH~Tho_^5PQzI5hn1hk=oGB~D*W}B#^ZpzM3Zs;1Bsf0H=O>b*lMV|>Id?7De>`bbw{(os|iidojmii(+J_T#jhg$0E zF0t9a77uxgbgoE0g!SjKewv>2bop9*@$1i0N4&+iqmgc&o1yom5?K6WxbL!%ch%M+ zeefu@$Iyq5p7+5aUyAWQ7g9q-`pFAWDVi$MB{=)pq@RtFI-c-)A|u}Dh%Yu$A0KJ@ znUJ?+p?~L6u+PukkXqb;1zKnw?ZnMCAU$*2j^CZL_F4f6AMEu3*y|O1H*on~MrSW( zJZQTj(qC~jzsPRd?74SC6t~&Ho{dB|Y=>iK=<-GKd0seQ2i;$T8Bdj+^cwz8-F(Mj z1Sh?ABUYrpy39W}5TOdE+*bM#6<z)Ddox>o z2N5DqtOG!qxx|%NBqc+6Fj^Fz(uu%!QGdXaA8r=)rLCl^E*&i&6g$x@0yt?#tSE}c ziVo|C*xX<);bC`*gjXbdQe-WHg1wsXvs(d>ud+wQMn*g0ivOoLF2tQhvAJ2?b)qO@ zSH#w$c$56?E{a6L*BFNL_ZP*zUEYT7Kts0@^2Hfeo@y3{rp4hK(U3pni(e5(n#Egj{R-^BgMlcUDgtvJJ9-)H zy>pP4vE5+TX7MmA3PKQ#&Ef<;Z3EAhC`=6xCvd=B|IeNLz zE%#rd&&xiy-2Xa#L-x7l{_7|Jxz8>7!Xp~FFI(=%M7Qj7%l))?O6pmPiz6nW|1H4k zBUC4nix*$<2{av@xW8pXsPUVs;6JVT3+(1xAt z?9Q3@Iqyu)%%8u%egjy8DR6vr^rrerZ%S*Q{Fc6`FJH6}@8{p6nQo%F$e3uUKnOSQ}Q)_}#>HIS{p_QQ;x^ zw&N3pj&F1Hkiv+)I9^?SyjnF{bf|wGg%C(Lf+V!)h2xUId=T2E9mcN1L$QF^5g2*u_)h#x zV5qoL+7?I^OWPS_a6JtT*$mPcAHy(mJmUtoz)Z1zp0^RJebf|pVGWIsQB0nO8D@fn zeP+6d6PT}AA2UVLt7UKlb7PprygKtn-5>!^V1XRwIrG!}4+mn=`WBk<_rS~lA< zY|ueMzJEovQoY~iYXas~$fZRtL07(a1=a?#TU!GSD_28(EFUP#hg|sL=D^Hz|L6K7 zD60g^T-8lJg#y_+AG()`*QD^R!cpOxY7iLXH>Zls_hOj;GnnAs;L$9uaRbuj_dhXN z_<^afP)`ndO!qW}o+exVj;Uj$zv1Tc32vVWmrHP`CoJ`Zxvp@$E4=rv{Dp%8tK5(9 z7c5fP{T{ZAA#Omvi%lqOVetgT%V6phEDiQ6oM7cL#+QIm<(v8kP)i30>q=X}6rk(Ww~N);x^iv)>V z)F>R%WhPu8Gn7lW${nB1g?2dLWg6t73{<@%o=iq^d`ejx{msu;S`%=Y2!BRo(WJ^C zT4hqAYqXBuA|4G-hEb5yvQw2Bx7zVRpD;RR2ccOu@PhR3faoczJIZ5StRhv zJT*c`VV6u>2x;0SlCBHsQ7n>YhA$6iQU$Rd`#A*0pf5UAX^2~Qi`Ky%f6RGsoueIc_WKEcM!=sZzkijF|}LFs~GM=v-1aFc3dl?tifzSiqvXmL+l| z5-?ahO zL%3?PG<>&D{-(~{sG3$mZG!I^`lqCHWOSn}?5JWosiW?}R7Hz45Z6M;|I3ZkC#9f+ zgJwObwvJ7+lKPKs9)HS$N-3eNAWZc~d`TP=sY$X_md=Li)LwW?#|kR6y$#RzQ>|l?27Kf`O2bZM(f5T<@B@DC9-<3~{+a6@$%*btze+^?#(y za}=}LbSblhT0Q6Rm4>3=gi)o*G!B_6$tq*ItV%e0&U6FU!uj0%!h9}SX6NEZ9}oim zg4WPW?76Hk0#QwuQj$)~3QJw+v|eX=>YZgbHMJs34ZXEzFL($9Pw6>LDO8nGd&N^$ zGQH4GKq$+GsmsL%*AWQpwp1!JQ-AyUofV|o;~RKj0^!|%nF=P~ai{JLHLCol`|FQ7a$D7+PR6Mx&`hnhg>;JWrBjTd0T_>aUBJK||PoA}xwjpy>>3&$74 zTY?_p_n~D4+YZ_`VA~C};yEAv@pMP)u1z-biGn_klvcL6sU`UFOa5WKV z3&fLwP#~_QGqNI?vZjX9e_Ddmyv`La8Jre}B_kXk=J63Dn>GS%Nl7tyD3D2o(^4iZ z3mZc%E$ibOHj%F0n#U)zib4~{uoPZTL$0P|m2+KIQ#3oub%T7-d~5T@=GJh6j|NV- z!5BPIEvv`*E?MCW0ZmUuQo58-cw|hMG8wK%_B(RtIFDydO?RP^e__!PX;g|RlA4P2 z4jtif(}ij>mC-fQG-YluEa|d!vZky=`ljZ$Ff1r&IZhWinz9xVW74ROYid$XF*J6~ z9#4m@lhthw1!$|R%I2dC^$n%=%E!^TkD;QWai13pu*d@!Y6y9c-dw2lpbj-&crkx2 zs<6ZhH|C13WnOqNe@}d^VDJ{l;le5kl8?)VY1pm@y|@qed$1aQ;y}@)L?Jvc0$AuF zD-SZv*SVC~K`>q0t1Aq34UJs|`lF_(@D?xDV66bu6ClOSK1t`Q>F~QK56Cm(MI(a3 zaT7ypQO-6;vTAZ&m6Uwuwr6=LD-tLFL&h0PIO1GPDmNp0 z`#UM72-bPfjP(o)4PIiAp{Ai!ThwhM9u`&DL*e7r45@}qS>??T@1^nnVwqpqQ|k{%dq*LC>flElRbiy zesX2Z>T19VbuXQiV{#@+&4oMF+fTiOA{>-6PSIjcOoKFS6iq+l;13qz9r6xO;T=vS z2R}50ccv2#o=Q|h+CAJH)AW%6InA}KX&=!}FH#s5e>yTlWkaW!*oqO68SU{JVB)Hl0vvZTX1MRnmt z>R(Ase@{zh`Mq(VYx=EF{=B@5S3GzLuQCMxe}@eW>)Mz!MD4@r)31AQ0&md9FQ^oy zd7G7(S$O_sh;iiPo+8b+hoW2MCgpqfo!xG0(OkY_^|alpF%|tM#Ck5;=^g0SxgBPA zpj~cHfB&b6Q&;Wy!08+sbMeTuzdkW$^B?J$?sUlvt-t$YPGauPu)u#cwTdxyCpYYM z|J?88HSPEDl;Ruqhx%`Yevy`xn?Bjd|3~W9oV}gRHGB7q`Q(Vdsq+q>2waJF_ebBs z)an<$U1`@M%@%a;Q0e-`{4plt?ULOps_VMsCGSXjny=7!ro#&yKNJ1)=Ai$NRxZn^ zy4Sl4Ll2z(KBwF8hi}V=YEO>0v)s;W-I6n3;eA8#Nm?3bGv7lNHQNmz*r)Dmo);Ff zO0UZEYszKk7@x=M+t~l3}nRw>VNAHNMwcP4SQ@7VY?D`sF z;##ZUqW&=|gK7D@n8jC^GLEP2>E!!zYZE_vZY78Ewvd7|(~cLOnzsC9yoW$&qm3qq zpsJ|K^t*>sV&Xw`rHeF8*lJuD$<$-jSyd5*cS5Ss(6Yb9VFg zmdBdWY}LIRu7AEU`|`%nmbKe9Ru|paYqCyhr|*UfE-FWEX}w=mRr&Plh1ihRb?fZf zwan)B=Es{q5~L;-`z1@i@D;g`V!FL5wNQ6(VEFnOV}(&W5(+OmjC zt{E6?P*hzNg{ZnQ&x93nPpII0QRXs9h^Y5`Q(5r+jzD)z2ikzD_m~1i)&BV=vWRQ) z7#M6(Y-m#ksd5Lq7I7sT1A_&Ms!M7hRT`7mEYOmU0bSDtw9y&pb5uV)p8RovzbyDF zC}8LG98irBiYd|B5Es=i)RINMw8tJrRiQ3K)r*DZvWN>X&_g-e0HjJ0c*PGt$nC6< z^X(fKi85!JGE5e*Qk=YNk-RMYOm?7qbWm(zvI40x1N$3(C^beb?XYH;Y+x@1JjLBu z8gV!>aE=hgEak}u7stwi&)5apvl!@aI}~{(M~2DzjvipU5XZhUFzBPGigad}%vdEd zxzbq`tP*~*CD2u<_W8O(R6@>+)dQxjt#%cLitU#2DN2U^a=&A{*< zxXD2YMbW`rkaaSXALI&vos7Kx2GzR%l^~VoU`HXw92poCP|Q0w`QmaLS@`e~Fqq^~ z`SO8EH vsyBKjGfaLs3G5A4NEtF=r6}|LX&_PQ$$rzsC*NAh!zI8AJhX8xsQ3T?W}x<& delta 34740 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�{ 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

    2jq7_TfZ- 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 diff --git a/smoke-test/gradle/wrapper/gradle-wrapper.properties b/smoke-test/gradle/wrapper/gradle-wrapper.properties index 68e8816d71c..36e4933e1da 100644 --- a/smoke-test/gradle/wrapper/gradle-wrapper.properties +++ b/smoke-test/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab -distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip +distributionSha256Sum=20f1b1176237254a6fc204d8434196fa11a4cfb387567519c61556e8710aed78 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/smoke-test/gradlew b/smoke-test/gradlew index f5feea6d6b1..faf93008b77 100755 --- a/smoke-test/gradlew +++ b/smoke-test/gradlew @@ -86,8 +86,7 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. From 73e063746ac3b958eced6988005a8e8997dadbe6 Mon Sep 17 00:00:00 2001 From: Sebastian Steiner Date: Tue, 22 Apr 2025 06:58:16 +0200 Subject: [PATCH 0452/1224] Allow configuring the AlwaysPullPolicy (#10188) --- .../org/testcontainers/images/PullPolicy.java | 2 +- .../images/OverrideImagePullPolicyTest.java | 16 ++++++++++++++++ docs/features/advanced_options.md | 8 ++++++++ 3 files changed, 25 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/images/PullPolicy.java b/core/src/main/java/org/testcontainers/images/PullPolicy.java index 12d05b6fe5a..8c3a067cc15 100644 --- a/core/src/main/java/org/testcontainers/images/PullPolicy.java +++ b/core/src/main/java/org/testcontainers/images/PullPolicy.java @@ -40,7 +40,7 @@ public static synchronized ImagePullPolicy defaultPolicy() { .currentThread() .getContextClassLoader() .loadClass(imagePullPolicyClassName) - .getConstructor() + .getDeclaredConstructor() .newInstance(); } catch (Exception e) { throw new IllegalArgumentException( diff --git a/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java index 3b410fd5ab9..43c026ea294 100644 --- a/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java @@ -51,4 +51,20 @@ public void simpleConfigurationTest() { container.stop(); } } + + @Test + public void alwaysPullConfigurationTest() { + Mockito + .doReturn(AlwaysPullPolicy.class.getCanonicalName()) + .when(TestcontainersConfiguration.getInstance()) + .getImagePullPolicy(); + + try (DockerRegistryContainer registry = new DockerRegistryContainer()) { + registry.start(); + GenericContainer container = new GenericContainer<>(registry.createImage()).withExposedPorts(8080); + container.start(); + assertThat(container.getImage().imagePullPolicy).isInstanceOf(AlwaysPullPolicy.class); + container.stop(); + } + } } diff --git a/docs/features/advanced_options.md b/docs/features/advanced_options.md index 9dd86edccd5..e979da9ecdf 100644 --- a/docs/features/advanced_options.md +++ b/docs/features/advanced_options.md @@ -38,6 +38,14 @@ You can also configure Testcontainers to use your custom implementation by using pull.policy=com.mycompany.testcontainers.ExampleImagePullPolicy ``` +You can also use the provided implementation to always pull images + +=== "`src/test/resources/testcontainers.properties`" + ```text + pull.policy=org.testcontainers.images.AlwaysPullPolicy + ``` + + Please see [the documentation on configuration mechanisms](./configuration.md) for more information. ## Customizing the container From 4e8c421fa3e270598a425be4a8f999923bb5b7ac Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Tue, 22 Apr 2025 20:51:54 +0200 Subject: [PATCH 0453/1224] Add DockerModelRunnerContainer to core (#10183) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../DockerModelRunnerContainer.java | 35 ++++++++++++++++ .../DockerModelRunnerContainerTest.java | 41 +++++++++++++++++++ docs/modules/docker_model_runner.md | 41 +++++++++++++++++++ mkdocs.yml | 1 + 4 files changed, 118 insertions(+) create mode 100644 core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java create mode 100644 core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java create mode 100644 docs/modules/docker_model_runner.md diff --git a/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java b/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java new file mode 100644 index 00000000000..8ce2adbc319 --- /dev/null +++ b/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java @@ -0,0 +1,35 @@ +package org.testcontainers.containers; + +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers proxy container for the Docker Model Runner service + * provided by Docker Desktop. + *

    + * Supported images: {@code alpine/socat} + *

    + * Exposed ports: 80 + */ +public class DockerModelRunnerContainer extends SocatContainer { + + private static final String MODEL_RUNNER_ENDPOINT = "model-runner.docker.internal"; + + public DockerModelRunnerContainer(String image) { + this(DockerImageName.parse(image)); + } + + public DockerModelRunnerContainer(DockerImageName image) { + super(image); + withTarget(80, MODEL_RUNNER_ENDPOINT); + waitingFor(Wait.forHttp("/").forResponsePredicate(res -> res.contains("The service is running"))); + } + + public String getBaseEndpoint() { + return "http://" + getHost() + ":" + getMappedPort(80); + } + + public String getOpenAIEndpoint() { + return getBaseEndpoint() + "/engines"; + } +} diff --git a/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java b/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java new file mode 100644 index 00000000000..dfe9df9e905 --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java @@ -0,0 +1,41 @@ +package org.testcontainers.containers; + +import io.restassured.RestAssured; +import io.restassured.response.Response; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assumptions.assumeThat; + +public class DockerModelRunnerContainerTest { + + @Test + public void pullsModelAndExposesInference() { + assumeThat(System.getenv("CI")).isNull(); + + String modelName = "ai/smollm2:360M-Q4_K_M"; + + try ( + // container { + DockerModelRunnerContainer dmr = new DockerModelRunnerContainer("alpine/socat:1.7.4.3-r0") + // } + ) { + dmr.start(); + + // pullModel { + RestAssured + .given() + .body(String.format("{\"from\":\"%s\"}", modelName)) + .post(dmr.getBaseEndpoint() + "/models/create") + .then() + .statusCode(200); + // } + + Response modelResponse = RestAssured.get(dmr.getBaseEndpoint() + "/models").thenReturn(); + assertThat(modelResponse.body().jsonPath().getList("tags.flatten()")).contains(modelName); + + Response openAiResponse = RestAssured.get(dmr.getOpenAIEndpoint() + "/v1/models").prettyPeek().thenReturn(); + assertThat(openAiResponse.body().jsonPath().getList("data.id")).contains(modelName); + } + } +} diff --git a/docs/modules/docker_model_runner.md b/docs/modules/docker_model_runner.md new file mode 100644 index 00000000000..b610279e93b --- /dev/null +++ b/docs/modules/docker_model_runner.md @@ -0,0 +1,41 @@ +# Docker Model Runner + +This module helps connect to [Docker Model Runner](https://docs.docker.com/desktop/features/model-runner/) +provided by Docker Desktop 4.40.0. + +## DockerModelRunner's usage examples + +You can start a Docker Model Runner proxy container instance from any Java application by using: + + +[Create a DockerModelRunnerContainer](../../core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java) inside_block:container + + +### Pulling the model + +Pulling the model is as simple as: + + +[Pull model](../../core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java) inside_block:pullModel + + +## Adding this module to your project dependencies + +*Docker Model Runner support is part of the core Testcontainers library.* + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +=== "Gradle" + ```groovy + testImplementation "org.testcontainers:testcontainers:{{latest_version}}" + ``` +=== "Maven" + ```xml + + org.testcontainers + testcontainers + {{latest_version}} + test + + ``` + diff --git a/mkdocs.yml b/mkdocs.yml index 536f73a0603..88aa92efbe8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -82,6 +82,7 @@ nav: - modules/chromadb.md - modules/consul.md - modules/docker_compose.md + - modules/docker_model_runner.md - modules/elasticsearch.md - modules/gcloud.md - modules/grafana.md From 3d5e7ff5ffe498408d7c1ee11a807e9d8d048276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 22 Apr 2025 14:04:47 -0500 Subject: [PATCH 0454/1224] Polish DockerModelRunnerContainer --- .../containers/DockerModelRunnerContainer.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java b/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java index 8ce2adbc319..43b0239eee7 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerModelRunnerContainer.java @@ -15,18 +15,20 @@ public class DockerModelRunnerContainer extends SocatContainer { private static final String MODEL_RUNNER_ENDPOINT = "model-runner.docker.internal"; + private static final int PORT = 80; + public DockerModelRunnerContainer(String image) { this(DockerImageName.parse(image)); } public DockerModelRunnerContainer(DockerImageName image) { super(image); - withTarget(80, MODEL_RUNNER_ENDPOINT); + withTarget(PORT, MODEL_RUNNER_ENDPOINT); waitingFor(Wait.forHttp("/").forResponsePredicate(res -> res.contains("The service is running"))); } public String getBaseEndpoint() { - return "http://" + getHost() + ":" + getMappedPort(80); + return "http://" + getHost() + ":" + getMappedPort(PORT); } public String getOpenAIEndpoint() { From 705d59b7042c2a7a8e69a2c1584c513d1dd0eba4 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Wed, 23 Apr 2025 08:13:05 -0400 Subject: [PATCH 0455/1224] Expose Tempo in LgtmContainer (#10192) --- modules/grafana/build.gradle | 5 ++ .../grafana/LgtmStackContainer.java | 9 ++- .../grafana/LgtmStackContainerTest.java | 61 ++++++++++++++++++- 3 files changed, 71 insertions(+), 4 deletions(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 34a45cc404b..dbbcb7e1ded 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -7,6 +7,11 @@ dependencies { testImplementation 'io.rest-assured:rest-assured:5.5.0' testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' + + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.49.0') + testImplementation 'io.opentelemetry:opentelemetry-api' + testImplementation 'io.opentelemetry:opentelemetry-sdk' + testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' } tasks.japicmp { diff --git a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java index 595d016772a..00299ac27f2 100644 --- a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java +++ b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java @@ -14,6 +14,7 @@ * Exposed ports: *

    */ -public class Neo4jContainer> extends GenericContainer { +public class Neo4jContainer extends GenericContainer { /** * The image defaults to the official Neo4j image: Neo4j. @@ -205,7 +205,7 @@ public String getHttpsUrl() { * * @return This container. */ - public S withEnterpriseEdition() { + public Neo4jContainer withEnterpriseEdition() { if (!standardImage) { throw new IllegalStateException( String.format("Cannot use enterprise version with alternative image %s.", getDockerImageName()) @@ -227,7 +227,7 @@ public S withEnterpriseEdition() { * @param adminPassword The admin password for the default database account. * @return This container. */ - public S withAdminPassword(final String adminPassword) { + public Neo4jContainer withAdminPassword(final String adminPassword) { if (adminPassword != null && adminPassword.length() < 8) { logger().warn("Your provided admin password is too short and will not work with Neo4j 5.3+."); } @@ -240,7 +240,7 @@ public S withAdminPassword(final String adminPassword) { * * @return This container. */ - public S withoutAuthentication() { + public Neo4jContainer withoutAuthentication() { return withAdminPassword(null); } @@ -264,7 +264,7 @@ public S withoutAuthentication() { * @throws IllegalArgumentException If the database version is not 3.5. * @return This container. */ - public S withDatabase(MountableFile graphDb) { + public Neo4jContainer withDatabase(MountableFile graphDb) { if (!isNeo4jDatabaseVersionSupportingDbCopy()) { throw new IllegalArgumentException( "Copying database folder is not supported for Neo4j instances with version 4.0 or higher." @@ -283,7 +283,7 @@ public S withDatabase(MountableFile graphDb) { * @param plugins * @return This container. */ - public S withPlugins(MountableFile plugins) { + public Neo4jContainer withPlugins(MountableFile plugins) { return withCopyFileToContainer(plugins, "/var/lib/neo4j/plugins/"); } @@ -295,7 +295,7 @@ public S withPlugins(MountableFile plugins) { * @param value The value to set * @return This container. */ - public S withNeo4jConfig(String key, String value) { + public Neo4jContainer withNeo4jConfig(String key, String value) { addEnv(formatConfigurationKey(key), value); return self(); } @@ -307,31 +307,6 @@ public String getAdminPassword() { return adminPassword; } - /** - * Registers one or more {@link Neo4jLabsPlugin} for download and server startup. - * - * @param neo4jLabsPlugins The Neo4j plugins that should get started with the server. - * @return This container. - * @deprecated {@link Neo4jLabsPlugin} were deprecated due to naming changes that cannot be solved by this enumeration. - * Please use the {@link Neo4jContainer#withPlugins(String...)} method. - */ - public S withLabsPlugins(Neo4jLabsPlugin... neo4jLabsPlugins) { - List pluginNames = Arrays - .stream(neo4jLabsPlugins) - .map(plugin -> plugin.pluginName) - .collect(Collectors.toList()); - - this.labsPlugins.addAll(pluginNames); - return self(); - } - - /** - * @deprecated Please use {@link Neo4jContainer#withPlugins(String...)} for named plugins. - */ - public S withLabsPlugins(String... neo4jLabsPlugins) { - return this.withPlugins(neo4jLabsPlugins); - } - /** * Registers one or more Neo4j plugins for server startup. * The plugins are listed here @@ -343,7 +318,7 @@ public S withLabsPlugins(String... neo4jLabsPlugins) { * @param plugins The Neo4j plugins that should get started with the server. * @return This container. */ - public S withPlugins(String... plugins) { + public Neo4jContainer withPlugins(String... plugins) { this.labsPlugins.addAll(Arrays.asList(plugins)); return self(); } @@ -376,7 +351,7 @@ private boolean isNeo4jDatabaseVersionSupportingDbCopy() { return false; } - public S withRandomPassword() { + public Neo4jContainer withRandomPassword() { return withAdminPassword(UUID.randomUUID().toString()); } } diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jLabsPlugin.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jLabsPlugin.java deleted file mode 100644 index 0e3bf634140..00000000000 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jLabsPlugin.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.testcontainers.containers; - -/** - * Reflects a plugin from the official Neo4j 4.4. - * Neo4j Labs Plugin list. - * There might be plugins not supported by your selected version of Neo4j. - * - * @deprecated Please use {@link Neo4jContainer#withLabsPlugins(String...)} with the matching plugin name for your Neo4j version. - * Due to some renaming of the (Docker image) plugin names, there is no naming consistency across versions. - * The plugins are listed here - * - */ -public enum Neo4jLabsPlugin { - APOC("apoc"), - APOC_CORE("apoc-core"), - BLOOM("bloom"), - STREAMS("streams"), - GRAPH_DATA_SCIENCE("graph-data-science"), - NEO_SEMANTICS("n10s"); - - final String pluginName; - - Neo4jLabsPlugin(String pluginName) { - this.pluginName = pluginName; - } -} diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java index b5f9c2ad867..868d7e29f2d 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java @@ -18,7 +18,7 @@ public class Neo4jContainerJUnitIntegrationTest { @ClassRule - public static Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4"); + public static Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4"); @Test public void shouldStart() { diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java index 334aa155eac..9827eb09900 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java @@ -39,7 +39,7 @@ public void shouldDisableAuthentication() { try ( // spotless:off // withoutAuthentication { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withoutAuthentication() // } // spotless:on @@ -58,7 +58,7 @@ public void shouldCopyDatabase() { assumeThat(DockerClientFactory.instance().getInfo().getArchitecture()).isNotEqualTo("aarch64"); try ( // copyDatabase { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:3.5.30") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:3.5.30") .withDatabase(MountableFile.forClasspathResource("/test-graph.db")) // } ) { @@ -75,7 +75,7 @@ public void shouldCopyDatabase() { public void shouldFailOnCopyDatabaseForDefaultNeo4j4Image() { assertThatIllegalArgumentException() .isThrownBy(() -> { - new Neo4jContainer<>("neo4j:4.4.1").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); + new Neo4jContainer("neo4j:4.4.1").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); }) .withMessage("Copying database folder is not supported for Neo4j instances with version 4.0 or higher."); } @@ -84,7 +84,7 @@ public void shouldFailOnCopyDatabaseForDefaultNeo4j4Image() { public void shouldFailOnCopyDatabaseForCustomNeo4j4Image() { assertThatIllegalArgumentException() .isThrownBy(() -> { - new Neo4jContainer<>("neo4j:4.4.1").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); + new Neo4jContainer("neo4j:4.4.1").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); }) .withMessage("Copying database folder is not supported for Neo4j instances with version 4.0 or higher."); } @@ -93,7 +93,7 @@ public void shouldFailOnCopyDatabaseForCustomNeo4j4Image() { public void shouldFailOnCopyDatabaseForCustomNonSemverNeo4j4Image() { assertThatIllegalArgumentException() .isThrownBy(() -> { - new Neo4jContainer<>("neo4j:latest").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); + new Neo4jContainer("neo4j:latest").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); }) .withMessage("Copying database folder is not supported for Neo4j instances with version 4.0 or higher."); } @@ -102,7 +102,7 @@ public void shouldFailOnCopyDatabaseForCustomNonSemverNeo4j4Image() { public void shouldCopyPlugins() { try ( // registerPluginsPath { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withPlugins(MountableFile.forClasspathResource("/custom-plugins")) // } ) { @@ -117,7 +117,7 @@ public void shouldCopyPlugins() { public void shouldCopyPlugin() { try ( // registerPluginsJar { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withPlugins(MountableFile.forClasspathResource("/custom-plugins/hello-world.jar")) // } ) { @@ -142,7 +142,7 @@ public void shouldCheckEnterpriseLicense() { String expectedImageName = "neo4j:4.4-enterprise"; assertThatExceptionOfType(IllegalStateException.class) - .isThrownBy(() -> new Neo4jContainer<>("neo4j:4.4").withEnterpriseEdition()) + .isThrownBy(() -> new Neo4jContainer("neo4j:4.4").withEnterpriseEdition()) .withMessageContaining("The image " + expectedImageName + " requires you to accept a license agreement."); } @@ -152,7 +152,7 @@ public void shouldRunEnterprise() { try ( // enterpriseEdition { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withEnterpriseEdition() // } .withAdminPassword("Picard123") @@ -172,7 +172,7 @@ public void shouldRunEnterprise() { @Test public void shouldAddConfigToEnvironment() { // neo4jConfiguration { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withNeo4jConfig("dbms.security.procedures.unrestricted", "apoc.*,algo.*") .withNeo4jConfig("dbms.tx_log.rotation.size", "42M"); // } @@ -184,7 +184,7 @@ public void shouldAddConfigToEnvironment() { @Test public void shouldRespectEnvironmentAuth() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withEnv("NEO4J_AUTH", "neo4j/secret"); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withEnv("NEO4J_AUTH", "neo4j/secret"); neo4jContainer.configure(); @@ -194,7 +194,7 @@ public void shouldRespectEnvironmentAuth() { @Test public void shouldSetCustomPasswordCorrectly() { // withAdminPassword { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withAdminPassword("verySecret"); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withAdminPassword("verySecret"); // } neo4jContainer.configure(); @@ -204,7 +204,7 @@ public void shouldSetCustomPasswordCorrectly() { @Test public void containerAdminPasswordOverrulesEnvironmentAuth() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withEnv("NEO4J_AUTH", "neo4j/secret") .withAdminPassword("anotherSecret"); @@ -215,7 +215,7 @@ public void containerAdminPasswordOverrulesEnvironmentAuth() { @Test public void containerWithoutAuthenticationOverrulesEnvironmentAuth() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withEnv("NEO4J_AUTH", "neo4j/secret") .withoutAuthentication(); @@ -226,7 +226,7 @@ public void containerWithoutAuthenticationOverrulesEnvironmentAuth() { @Test public void shouldRespectAlreadyDefinedPortMappingsBolt() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withExposedPorts(7687); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687); neo4jContainer.configure(); @@ -235,7 +235,7 @@ public void shouldRespectAlreadyDefinedPortMappingsBolt() { @Test public void shouldRespectAlreadyDefinedPortMappingsHttp() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withExposedPorts(7474); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7474); neo4jContainer.configure(); @@ -244,7 +244,7 @@ public void shouldRespectAlreadyDefinedPortMappingsHttp() { @Test public void shouldRespectAlreadyDefinedPortMappingsWithoutHttps() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withExposedPorts(7687, 7474); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687, 7474); neo4jContainer.configure(); @@ -253,7 +253,7 @@ public void shouldRespectAlreadyDefinedPortMappingsWithoutHttps() { @Test public void shouldDefaultExportBoltHttpAndHttps() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4"); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4"); neo4jContainer.configure(); @@ -262,67 +262,16 @@ public void shouldDefaultExportBoltHttpAndHttps() { @Test public void shouldRespectCustomWaitStrategy() { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").waitingFor(new CustomDummyWaitStrategy()); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").waitingFor(new CustomDummyWaitStrategy()); neo4jContainer.configure(); assertThat(neo4jContainer.getWaitStrategy()).isInstanceOf(CustomDummyWaitStrategy.class); } - // Test for deprecated functionality to be still alive, if `Neo4jLabsPlugin` gets removed, remove this test. - @Test - public void shouldConfigureSingleLabsPluginByType() { - try ( - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withLabsPlugins(Neo4jLabsPlugin.APOC) - ) { - // needs to get called explicitly for setup - neo4jContainer.configure(); - - assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4JLABS_PLUGINS", "[\"apoc\"]"); - } - } - - // Test for deprecated functionality to be still alive, if `Neo4jLabsPlugin` gets removed, remove this test. - @Test - public void shouldConfigureMultipleLabsPluginsByType() { - try ( - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") - .withLabsPlugins(Neo4jLabsPlugin.APOC, Neo4jLabsPlugin.BLOOM); - ) { - // needs to get called explicitly for setup - neo4jContainer.configure(); - - assertThat(neo4jContainer.getEnvMap().get("NEO4JLABS_PLUGINS")) - .containsAnyOf("[\"apoc\",\"bloom\"]", "[\"bloom\",\"apoc\"]"); - } - } - - // Test for deprecated functionality to be still alive, if `Neo4jContainer#withLabsPlugins` gets removed, remove this test. - @Test - public void shouldConfigureSingleLabsPlugin() { - try (Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withLabsPlugins("apoc")) { - // needs to get called explicitly for setup - neo4jContainer.configure(); - - assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4JLABS_PLUGINS", "[\"apoc\"]"); - } - } - - // Test for deprecated functionality to be still alive, if `Neo4jContainer#withLabsPlugins` gets removed, remove this test. - @Test - public void shouldConfigureMultipleLabsPlugins() { - try (Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withLabsPlugins("apoc", "bloom");) { - // needs to get called explicitly for setup - neo4jContainer.configure(); - - assertThat(neo4jContainer.getEnvMap().get("NEO4JLABS_PLUGINS")) - .containsAnyOf("[\"apoc\",\"bloom\"]", "[\"bloom\",\"apoc\"]"); - } - } - @Test public void shouldConfigureSinglePluginByName() { - try (Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withPlugins("apoc")) { + try (Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withPlugins("apoc")) { // needs to get called explicitly for setup neo4jContainer.configure(); @@ -334,7 +283,7 @@ public void shouldConfigureSinglePluginByName() { public void shouldConfigureMultiplePluginsByName() { try ( // configureLabsPlugins { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4") // + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") // .withPlugins("apoc", "bloom"); // } ) { @@ -350,7 +299,7 @@ public void shouldConfigureMultiplePluginsByName() { public void shouldCreateRandomUuidBasedPasswords() { try ( // withRandomPassword { - Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4").withRandomPassword(); + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withRandomPassword(); // } ) { // It will throw an exception if it's not UUID parsable. @@ -363,7 +312,7 @@ public void shouldCreateRandomUuidBasedPasswords() { @Test public void shouldWarnOnPasswordTooShort() { - try (Neo4jContainer neo4jContainer = new Neo4jContainer<>("neo4j:4.4");) { + try (Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4");) { Logger logger = (Logger) DockerLoggerFactory.getLogger("neo4j:4.4"); TestLogAppender testLogAppender = new TestLogAppender(); logger.addAppender(testLogAppender); @@ -403,7 +352,7 @@ protected void append(ILoggingEvent eventObject) { } } - private static Driver getDriver(Neo4jContainer container) { + private static Driver getDriver(Neo4jContainer container) { AuthToken authToken = AuthTokens.none(); if (container.getAdminPassword() != null) { authToken = AuthTokens.basic("neo4j", container.getAdminPassword()); From b64d3bbf5c2db8c7c87484f6a1f92aba6202d692 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Jul 2025 19:58:05 -0600 Subject: [PATCH 0491/1224] Update Gradle Wrapper from undefined to 8.14.3 (#10452) * Update Gradle Wrapper from 8.14.2 to 8.14.3 Signed-off-by: gradle-update-robot * Update Gradle Wrapper from 8.14.2 to 8.14.3 Signed-off-by: gradle-update-robot * Update Gradle Wrapper from 8.14.2 to 8.14.3 Signed-off-by: gradle-update-robot --------- Signed-off-by: gradle-update-robot Co-authored-by: gradle-update-robot --- examples/gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- smoke-test/gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/gradle/wrapper/gradle-wrapper.properties b/examples/gradle/wrapper/gradle-wrapper.properties index 3735f265b95..78cb6e16a49 100644 --- a/examples/gradle/wrapper/gradle-wrapper.properties +++ b/examples/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c4a852da571..dbc089ed3d7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=443c9c8ee2ac1ee0e11881a40f2376d79c66386264a44b24a9f8ca67e633375f -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-all.zip +distributionSha256Sum=ed1a8d686605fd7c23bdf62c7fc7add1c5b23b2bbc3721e661934ef4a4911d7c +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/smoke-test/gradle/wrapper/gradle-wrapper.properties b/smoke-test/gradle/wrapper/gradle-wrapper.properties index 3735f265b95..78cb6e16a49 100644 --- a/smoke-test/gradle/wrapper/gradle-wrapper.properties +++ b/smoke-test/gradle/wrapper/gradle-wrapper.properties @@ -1,7 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionSha256Sum=7197a12f450794931532469d4ff21a59ea2c1cd59a3ec3f89c035c3c420a6999 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.2-bin.zip +distributionSha256Sum=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 283899f96026bf4c7de1b904a74cf32c56d13b80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 7 Jul 2025 12:14:33 -0600 Subject: [PATCH 0492/1224] Set version during jreleaserDeploy task --- .github/workflows/release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 32847a43bb5..77128657b0e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -33,7 +33,7 @@ jobs: - name: Run Gradle Deploy run: | - ./gradlew jreleaserDeploy --scan --no-daemon -i + ./gradlew jreleaserDeploy -Pversion="${{github.event.release.tag_name}}" --scan --no-daemon -i env: JRELEASER_GPG_PUBLIC_KEY: ${{ vars.GPG_PUBLIC_KEY }} JRELEASER_GPG_SECRET_KEY: ${{ secrets.GPG_SIGNING_KEY }} From 19f11d6f95c1c57d43c41948c8508a74914a38b7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:13 +0000 Subject: [PATCH 0493/1224] Bump org.postgresql:postgresql in /modules/cockroachdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cockroachdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 33da6f67a72..6340d918e7e 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' + testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation 'org.assertj:assertj-core:3.27.3' } From e2f17ab455ac6e08dab1518d8d4403dabc1d78d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:14 +0000 Subject: [PATCH 0494/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.28.6 to 2.31.75. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.31.75 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index c2cd82ebf0f..f69b6e8f36d 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.scylladb:java-driver-core:4.15.0.0' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'software.amazon.awssdk:dynamodb:2.28.6' + testImplementation 'software.amazon.awssdk:dynamodb:2.31.77' } From 057141c2b98e5f9739acbb6673473fc6325de6bc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:16 +0000 Subject: [PATCH 0495/1224] Bump io.milvus:milvus-sdk-java from 2.4.4 to 2.6.0 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.4.4 to 2.6.0. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.4.4...v2.6.0) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-version: 2.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 6ca4ffda5ed..bb7167babfa 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.milvus:milvus-sdk-java:2.4.4' + testImplementation 'io.milvus:milvus-sdk-java:2.6.0' } From 26e6f3fab9ef31839f891e5c0c3781a376b42939 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:19 +0000 Subject: [PATCH 0496/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.33 to 3.2.41. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/develop/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.33...3.2.41) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-version: 3.2.41 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 58d6b80210b..5ed2e137a3d 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,11 +3,11 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.33" + api "com.orientechnologies:orientdb-client:3.2.42" testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.33" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.42" } tasks.japicmp { From 794d4f53d900f7d8fb323ff3777cecd2b60aa3ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:20 +0000 Subject: [PATCH 0497/1224] Bump io.weaviate:client from 4.8.3 to 5.3.0 in /modules/weaviate Bumps [io.weaviate:client](https://github.com/weaviate/java-client) from 4.8.3 to 5.3.0. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/4.8.3...5.3.0) --- updated-dependencies: - dependency-name: io.weaviate:client dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index d4808e93a2b..0a2be01a079 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.weaviate:client:4.8.3' + testImplementation 'io.weaviate:client:5.3.0' } From 61aedaaec3b72f3e5a376a33094cf85e3e977c59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:27 +0000 Subject: [PATCH 0498/1224] Bump com.orientechnologies:orientdb-gremlin in /modules/orientdb Bumps [com.orientechnologies:orientdb-gremlin](https://github.com/orientechnologies/orientdb-gremlin) from 3.2.33 to 3.2.41. - [Commits](https://github.com/orientechnologies/orientdb-gremlin/compare/3.2.33...3.2.41) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-gremlin dependency-version: 3.2.41 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 58d6b80210b..5ed2e137a3d 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,11 +3,11 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.33" + api "com.orientechnologies:orientdb-client:3.2.42" testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.33" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.42" } tasks.japicmp { From c69abe835d60f3a89fafdf32abb7c901ab6d7387 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 8 Jul 2025 23:56:32 +0000 Subject: [PATCH 0499/1224] Bump software.amazon.awssdk:s3 in /modules/localstack Bumps software.amazon.awssdk:s3 from 2.28.6 to 2.31.75. --- updated-dependencies: - dependency-name: software.amazon.awssdk:s3 dependency-version: 2.31.75 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 c56221cb97f..f104d08e63c 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-logs' testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.28.6' + testImplementation 'software.amazon.awssdk:s3:2.31.77' testImplementation 'org.assertj:assertj-core:3.27.3' } From 399f6b709f6afc8451a683a0abd64be86d6ba481 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:05:15 +0000 Subject: [PATCH 0500/1224] Bump com.ibm.db2:jcc from 11.5.9.0 to 12.1.2.0 in /modules/db2 Bumps com.ibm.db2:jcc from 11.5.9.0 to 12.1.2.0. --- updated-dependencies: - dependency-name: com.ibm.db2:jcc dependency-version: 12.1.2.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/db2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 9542ab75f65..0163eb17bd6 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.ibm.db2:jcc:11.5.9.0' + testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' testImplementation 'org.assertj:assertj-core:3.27.3' } From e71a6c85191e98066844fbf36f61582480612ce4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:06:34 +0000 Subject: [PATCH 0501/1224] Bump io.qdrant:client from 1.10.0 to 1.14.1 in /modules/qdrant Bumps [io.qdrant:client](https://github.com/qdrant/java-client) from 1.10.0 to 1.14.1. - [Release notes](https://github.com/qdrant/java-client/releases) - [Commits](https://github.com/qdrant/java-client/compare/v1.10.0...v1.14.1) --- updated-dependencies: - dependency-name: io.qdrant:client dependency-version: 1.14.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 6c222885579..dad2c38d3a1 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.qdrant:client:1.10.0' + testImplementation 'io.qdrant:client:1.14.1' testImplementation platform('io.grpc:grpc-bom:1.68.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' From 2fce94723eebe735be0d69243a6742fc2832c6c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:10:47 +0000 Subject: [PATCH 0502/1224] Bump org.elasticsearch.client:transport in /modules/elasticsearch Bumps [org.elasticsearch.client:transport](https://github.com/elastic/elasticsearch) from 7.17.24 to 7.17.29. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v7.17.24...v7.17.29) --- updated-dependencies: - dependency-name: org.elasticsearch.client:transport dependency-version: 7.17.29 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 91b344091bc..f0f260c5fb0 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.15.1" - testImplementation "org.elasticsearch.client:transport:7.17.24" + testImplementation "org.elasticsearch.client:transport:7.17.29" testImplementation 'org.assertj:assertj-core:3.27.3' } From 21d98783622309835de091db4f395f86e2faedc7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 00:13:43 +0000 Subject: [PATCH 0503/1224] Bump com.unboundid:unboundid-ldapsdk in /modules/ldap Bumps [com.unboundid:unboundid-ldapsdk](https://github.com/pingidentity/ldapsdk) from 7.0.2 to 7.0.3. - [Release notes](https://github.com/pingidentity/ldapsdk/releases) - [Changelog](https://github.com/pingidentity/ldapsdk/blob/master/docs/release-notes.html) - [Commits](https://github.com/pingidentity/ldapsdk/compare/7.0.2...7.0.3) --- updated-dependencies: - dependency-name: com.unboundid:unboundid-ldapsdk dependency-version: 7.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ldap/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ldap/build.gradle b/modules/ldap/build.gradle index 327b81491e9..5045bf79266 100644 --- a/modules/ldap/build.gradle +++ b/modules/ldap/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.2' + testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.3' } From 6718285b0961ee415c5b466d9f1ce6acc3ee443e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:12:21 +0000 Subject: [PATCH 0504/1224] Bump org.awaitility:awaitility from 4.2.0 to 4.3.0 in /modules/couchbase Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 7ea3f816e0e..1d73edc3396 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -6,7 +6,7 @@ dependencies { shaded 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'com.couchbase.client:java-client:3.7.3' - testImplementation 'org.awaitility:awaitility:4.2.0' + testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.27.3' } From 3447a2270060ecc616136066b8e93dd57ba637e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:12:27 +0000 Subject: [PATCH 0505/1224] Bump org.awaitility:awaitility from 4.2.2 to 4.3.0 in /modules/redpanda Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.2 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.2...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index c8d01c68ed2..95971f9f561 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' - testImplementation 'org.awaitility:awaitility:4.2.2' + testImplementation 'org.awaitility:awaitility:4.3.0' } From ac7d3a83296ed95e50c381b6155fdaa8388e7d76 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:12:45 +0000 Subject: [PATCH 0506/1224] Bump org.assertj:assertj-core from 3.26.3 to 3.27.3 in /modules/openfga Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.3...assertj-build-3.27.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 6cbbaa91e68..82341045efb 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'dev.openfga:openfga-sdk:0.7.0' } From f9c0e20871563345d87e5945c1cc50966502bfb2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 13:12:58 +0000 Subject: [PATCH 0507/1224] Bump org.assertj:assertj-core in /modules/clickhouse Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.3...assertj-build-3.27.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/clickhouse/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 97b8d00d92c..d366825e261 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -12,7 +12,7 @@ dependencies { testRuntimeOnly(group: 'com.clickhouse', name: 'jdbc-v2', version: '0.7.2', classifier: 'http') testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.2', classifier: 'http') } From c46aec2ac64b7c52e8c4a4eda34bd268879b14ee Mon Sep 17 00:00:00 2001 From: InfoShare Devs Date: Wed, 9 Jul 2025 15:59:01 +0200 Subject: [PATCH 0508/1224] Add support for queue in solace (#10450) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #10370 --------- Co-authored-by: Tomasz Forys Co-authored-by: Eddú Meléndez Gonzales --- .../org/testcontainers/solace/Service.java | 15 +++ .../solace/SolaceContainer.java | 21 +++- .../solace/SolaceContainerAMQPTest.java | 2 +- .../solace/SolaceContainerMQTTTest.java | 2 +- .../solace/SolaceContainerRESTTest.java | 2 +- .../solace/SolaceContainerSMFTest.java | 118 +++++++++++++----- 6 files changed, 122 insertions(+), 38 deletions(-) diff --git a/modules/solace/src/main/java/org/testcontainers/solace/Service.java b/modules/solace/src/main/java/org/testcontainers/solace/Service.java index 6ec7de44d08..9c9342ef789 100644 --- a/modules/solace/src/main/java/org/testcontainers/solace/Service.java +++ b/modules/solace/src/main/java/org/testcontainers/solace/Service.java @@ -4,10 +4,25 @@ * Services that are supported by Testcontainers implementation */ public enum Service { + /** + * Advanced Message Queuing Protocol + */ AMQP("amqp", 5672, "amqp", false), + /** + * Message Queuing Telemetry Transport + */ MQTT("mqtt", 1883, "tcp", false), + /** + * Representational State Transfer + */ REST("rest", 9000, "http", false), + /** + * Solace Message Format + */ SMF("smf", 55555, "tcp", true), + /** + * Solace Message Format with SSL + */ SMF_SSL("smf", 55443, "tcps", true); private final String name; diff --git a/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java b/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java index b2a00b32f31..00db0606536 100644 --- a/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java +++ b/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java @@ -65,11 +65,19 @@ public SolaceContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } + /** + * Create a new solace container with the specified docker image. + * + * @param dockerImageName the image name that should be used. + */ public SolaceContainer(DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); withCreateContainerCmdModifier(cmd -> { - cmd.getHostConfig().withShmSize(SHM_SIZE).withUlimits(new Ulimit[] { new Ulimit("nofile", 2448L, 6592L) }); + cmd + .getHostConfig() + .withShmSize(SHM_SIZE) + .withUlimits(new Ulimit[] { new Ulimit("nofile", 2448L, 1048576L) }); }); this.waitStrategy = Wait.forLogMessage(SOLACE_READY_MESSAGE, 1).withStartupTimeout(Duration.ofSeconds(60)); withExposedPorts(8080); @@ -103,6 +111,17 @@ private Transferable createConfigurationScript() { updateConfigScript(scriptBuilder, "create message-vpn " + vpn); updateConfigScript(scriptBuilder, "no shutdown"); updateConfigScript(scriptBuilder, "exit"); + updateConfigScript(scriptBuilder, "client-profile default message-vpn " + vpn); + updateConfigScript(scriptBuilder, "message-spool"); + updateConfigScript(scriptBuilder, "allow-guaranteed-message-send"); + updateConfigScript(scriptBuilder, "allow-guaranteed-message-receive"); + updateConfigScript(scriptBuilder, "allow-guaranteed-endpoint-create"); + updateConfigScript(scriptBuilder, "allow-guaranteed-endpoint-create-durability all"); + updateConfigScript(scriptBuilder, "exit"); + updateConfigScript(scriptBuilder, "exit"); + updateConfigScript(scriptBuilder, "message-spool message-vpn " + vpn); + updateConfigScript(scriptBuilder, "max-spool-usage 60000"); + updateConfigScript(scriptBuilder, "exit"); } // Configure username and password diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java index 6c68d27d358..f7266fe8212 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java @@ -31,7 +31,7 @@ public class SolaceContainerAMQPTest { @Test public void testSolaceContainer() throws JMSException { try ( - SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.2") + SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withTopic(TOPIC_NAME, Service.AMQP) .withVpn("amqp-vpn") ) { diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java index ab7d5ed56bb..07c08d32416 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java @@ -27,7 +27,7 @@ public class SolaceContainerMQTTTest { @Test public void testSolaceContainer() { try ( - SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.2") + SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withTopic(TOPIC_NAME, Service.MQTT) .withVpn("mqtt-vpn") ) { diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java index f2722b986ca..7f54cec3f74 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java @@ -28,7 +28,7 @@ public class SolaceContainerRESTTest { @Test public void testSolaceContainer() throws IOException { try ( - SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.2") + SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withTopic(TOPIC_NAME, Service.REST) .withVpn("rest-vpn") ) { diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java index d7ccd94998e..d7e0e8ea981 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java @@ -1,11 +1,14 @@ package org.testcontainers.solace; import com.solacesystems.jcsmp.BytesXMLMessage; +import com.solacesystems.jcsmp.ConsumerFlowProperties; +import com.solacesystems.jcsmp.EndpointProperties; import com.solacesystems.jcsmp.JCSMPException; import com.solacesystems.jcsmp.JCSMPFactory; import com.solacesystems.jcsmp.JCSMPProperties; import com.solacesystems.jcsmp.JCSMPSession; import com.solacesystems.jcsmp.JCSMPStreamingPublishCorrelatingEventHandler; +import com.solacesystems.jcsmp.Queue; import com.solacesystems.jcsmp.TextMessage; import com.solacesystems.jcsmp.Topic; import com.solacesystems.jcsmp.XMLMessageConsumer; @@ -30,40 +33,75 @@ public class SolaceContainerSMFTest { private static final Topic TOPIC = JCSMPFactory.onlyInstance().createTopic("Topic/ActualTopic"); + private static final Queue QUEUE = JCSMPFactory.onlyInstance().createQueue("Queue"); + @Test public void testSolaceContainerWithSimpleAuthentication() { try ( // solaceContainerSetup { - SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.2") + SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withCredentials("user", "pass") - .withTopic("Topic/ActualTopic", Service.SMF) + .withTopic(TOPIC.getName(), Service.SMF) .withVpn("test_vpn") // } ) { solaceContainer.start(); JCSMPSession session = createSessionWithBasicAuth(solaceContainer); assertThat(session).isNotNull(); - assertThat(consumeMessageFromSolace(session)).isEqualTo(MESSAGE); + consumeMessageFromTopics(session); session.closeSession(); } } + @Test + public void testSolaceContainerWithCreateFlow() { + try ( + SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") + .withCredentials("user", "pass") + .withTopic(TOPIC.getName(), Service.SMF) + .withVpn("test_vpn") + ) { + solaceContainer.start(); + JCSMPSession session = createSessionWithBasicAuth(solaceContainer); + assertThat(session).isNotNull(); + testCreateFlow(session); + session.closeSession(); + } + } + + private static void testCreateFlow(JCSMPSession session) { + try { + EndpointProperties endpointProperties = new EndpointProperties(); + endpointProperties.setAccessType(EndpointProperties.ACCESSTYPE_NONEXCLUSIVE); + endpointProperties.setQuota(1000); + session.provision(QUEUE, endpointProperties, JCSMPSession.FLAG_IGNORE_ALREADY_EXISTS); + session.addSubscription(QUEUE, TOPIC, JCSMPSession.WAIT_FOR_CONFIRM); + ConsumerFlowProperties flowProperties = new ConsumerFlowProperties().setEndpoint(QUEUE); + TestConsumer listener = new TestConsumer(); + session.createFlow(listener, flowProperties).start(); + publishMessageToSolaceTopic(session); + listener.waitForMessage(); + } catch (Exception e) { + throw new RuntimeException("Cannot process message using solace topic/queue: " + e.getMessage(), e); + } + } + @Test public void testSolaceContainerWithCertificates() { try ( // solaceContainerUsageSSL { - SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.6") + SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withClientCert( MountableFile.forClasspathResource("solace.pem"), MountableFile.forClasspathResource("rootCA.crt") ) - .withTopic("Topic/ActualTopic", Service.SMF_SSL) + .withTopic(TOPIC.getName(), Service.SMF_SSL) // } ) { solaceContainer.start(); JCSMPSession session = createSessionWithCertificates(solaceContainer); assertThat(session).isNotNull(); - assertThat(consumeMessageFromSolace(session)).isEqualTo(MESSAGE); + consumeMessageFromTopics(session); session.closeSession(); } } @@ -112,7 +150,7 @@ private static JCSMPSession createSession(JCSMPProperties properties) { } } - private void publishMessageToSolace(JCSMPSession session) throws JCSMPException { + private static void publishMessageToSolaceTopic(JCSMPSession session) throws JCSMPException { XMLMessageProducer producer = session.getMessageProducer( new JCSMPStreamingPublishCorrelatingEventHandler() { @Override @@ -131,37 +169,49 @@ public void handleErrorEx(Object o, JCSMPException e, long l) { producer.send(msg, TOPIC); } - private String consumeMessageFromSolace(JCSMPSession session) { - CountDownLatch latch = new CountDownLatch(1); + private static void consumeMessageFromTopics(JCSMPSession session) { try { - String[] result = new String[1]; - XMLMessageConsumer cons = session.getMessageConsumer( - new XMLMessageListener() { - @Override - public void onReceive(BytesXMLMessage msg) { - if (msg instanceof TextMessage) { - TextMessage textMessage = (TextMessage) msg; - String message = textMessage.getText(); - result[0] = message; - LOGGER.info("TextMessage received: " + message); - } - latch.countDown(); - } - - @Override - public void onException(JCSMPException e) { - LOGGER.error("Exception received: " + e.getMessage()); - latch.countDown(); - } - } - ); + TestConsumer listener = new TestConsumer(); + XMLMessageConsumer cons = session.getMessageConsumer(listener); session.addSubscription(TOPIC); cons.start(); - publishMessageToSolace(session); - assertThat(latch.await(10L, TimeUnit.SECONDS)).isTrue(); - return result[0]; + publishMessageToSolaceTopic(session); + listener.waitForMessage(); } catch (Exception e) { - throw new RuntimeException("Cannot receive message from solace", e); + throw new RuntimeException("Cannot process message using solace: " + e.getMessage(), e); + } + } + + static class TestConsumer implements XMLMessageListener { + + private final CountDownLatch latch = new CountDownLatch(1); + + private String result; + + @Override + public void onReceive(BytesXMLMessage msg) { + if (msg instanceof TextMessage) { + TextMessage textMessage = (TextMessage) msg; + String message = textMessage.getText(); + result = message; + LOGGER.info("Message received: " + message); + } + latch.countDown(); + } + + @Override + public void onException(JCSMPException e) { + LOGGER.error("Exception received: " + e.getMessage()); + latch.countDown(); + } + + private void waitForMessage() { + try { + assertThat(latch.await(10L, TimeUnit.SECONDS)).isTrue(); + assertThat(result).isEqualTo(MESSAGE); + } catch (Exception e) { + throw new RuntimeException("Cannot receive message from solace: " + e.getMessage(), e); + } } } } From c9026d4ffe44e2f75a35791641a88171e04735ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:13:16 +0000 Subject: [PATCH 0509/1224] Bump org.postgresql:postgresql from 42.7.4 to 42.7.7 in /modules/questdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 28a5a097189..05d6b3bc873 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' + testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation project(':jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.questdb:questdb:7.3.9' From f39073d50e53c48ecc33afe59c6ad15750f0a081 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 15:13:19 +0000 Subject: [PATCH 0510/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps com.solacesystems:sol-jcsmp from 10.24.1 to 10.27.2. --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-version: 10.27.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 3b8747d41f2..aae6c28eefd 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -6,7 +6,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'com.solacesystems:sol-jcsmp:10.24.1' + testImplementation 'com.solacesystems:sol-jcsmp:10.27.2' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From 793c78409b0aae4dc700802d267b8fdda2925ac3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:10:07 +0000 Subject: [PATCH 0511/1224] Bump org.jetbrains:annotations in /modules/rabbitmq Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 24.1.0 to 26.0.2. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/24.1.0...26.0.2) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 4993360a01e..751baaf15f8 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(":testcontainers") testImplementation 'com.rabbitmq:amqp-client:5.22.0' testImplementation 'org.assertj:assertj-core:3.27.3' - compileOnly 'org.jetbrains:annotations:24.1.0' + compileOnly 'org.jetbrains:annotations:26.0.2' } tasks.japicmp { From 934c7791afc1188fa3780bcfca667369b15393ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:11:05 +0000 Subject: [PATCH 0512/1224] Bump org.jetbrains:annotations from 24.1.0 to 26.0.2 in /modules/nginx Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 24.1.0 to 26.0.2. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/24.1.0...26.0.2) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/nginx/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index f83aa158c9d..c05010c45e9 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') - compileOnly 'org.jetbrains:annotations:24.1.0' + compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'org.assertj:assertj-core:3.27.3' } From a32aad4cbb56a065a0aa231ce5e0d25abb692e5e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:11:15 +0000 Subject: [PATCH 0513/1224] Bump org.jetbrains:annotations from 24.1.0 to 26.0.2 in /modules/tidb Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 24.1.0 to 26.0.2. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/24.1.0...26.0.2) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/tidb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 43ef0603e3b..37a528a41ff 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation project(':jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - compileOnly 'org.jetbrains:annotations:24.1.0' + compileOnly 'org.jetbrains:annotations:26.0.2' } From f0d8664a07274d57951d0d4ff61ad68edefaa188 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 17:11:17 +0000 Subject: [PATCH 0514/1224] Bump org.jetbrains:annotations in /modules/postgresql Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 24.1.0 to 26.0.2. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/24.1.0...26.0.2) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 5dc899ba2b8..885cbafabf5 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' - compileOnly 'org.jetbrains:annotations:24.1.0' + compileOnly 'org.jetbrains:annotations:26.0.2' } tasks.japicmp { From 84a7fb3f9f0ef9fa603c050e1b642b9661dd9e7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:14:50 +0000 Subject: [PATCH 0515/1224] Bump org.postgresql:postgresql from 42.7.4 to 42.7.7 in /modules/cratedb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index 3c4b19e2dea..79ca4864f46 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' + testRuntimeOnly 'org.postgresql:postgresql:42.7.7' compileOnly 'org.jetbrains:annotations:26.0.2' } From 9f58cec3cdf22120e7cede77d5c79087e6c6e613 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:15:15 +0000 Subject: [PATCH 0516/1224] Bump org.postgresql:postgresql in /modules/postgresql Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 885cbafabf5..bbe8e596b95 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' + testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' From 510da7d24001a308ce743d56ba318f7ecf9a83de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 18:15:46 +0000 Subject: [PATCH 0517/1224] Bump org.junit.platform:junit-platform-testkit in /modules/spock Bumps [org.junit.platform:junit-platform-testkit](https://github.com/junit-team/junit-framework) from 1.11.0 to 1.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-testkit dependency-version: 1.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 04a26fa4bef..13be69af580 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -18,7 +18,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' - testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.13.3' testCompileOnly 'org.jetbrains:annotations:26.0.2' } From 3c8e85518fd247b9729306d22d335789824389f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:24:15 +0000 Subject: [PATCH 0518/1224] Bump io.rest-assured:rest-assured in /modules/grafana Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index eb56136aa5c..5bc95949f2c 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' From 2d94d62d061f69cb642eac4a35bfbbaeba80f008 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:24:19 +0000 Subject: [PATCH 0519/1224] Bump io.rest-assured:rest-assured from 5.5.0 to 5.5.5 in /modules/consul Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/consul/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index daa61b1766a..f62c74e96aa 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') testImplementation 'com.ecwid.consul:consul-api:1.4.5' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'org.assertj:assertj-core:3.27.3' } From 1782fe8ecde25406746ad6c7264b57c8184f9310 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:24:26 +0000 Subject: [PATCH 0520/1224] Bump io.rest-assured:rest-assured in /modules/chromadb Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/chromadb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index b6821a87e3e..5017c481ee2 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' } From 583c333f9e83529cdc1a45c4185a39abab2a7788 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:24:42 +0000 Subject: [PATCH 0521/1224] Bump io.rest-assured:rest-assured from 5.5.0 to 5.5.5 in /modules/ollama Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ollama/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index 4785420ee0e..eda3bf5bb7a 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' } From f4996b3d730900b40da3991ada8205f0304fe92a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:24:52 +0000 Subject: [PATCH 0522/1224] Bump io.rest-assured:rest-assured from 5.5.0 to 5.5.5 in /core Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 7f50ab1d4a5..219934586cd 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -121,7 +121,7 @@ dependencies { testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" From cb3474c052f718e882c439b8788e619a955b7528 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:25:16 +0000 Subject: [PATCH 0523/1224] Bump io.rest-assured:rest-assured in /modules/redpanda Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 95971f9f561..11e674f5665 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -6,6 +6,6 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'org.awaitility:awaitility:4.3.0' } From 97f82b6aca929eefc9b1fba07190444f2807ca17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 19:25:53 +0000 Subject: [PATCH 0524/1224] Bump io.rest-assured:rest-assured from 5.5.0 to 5.5.5 in /modules/vault Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 1fe9eec0e6f..af9f27c505f 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'com.bettercloud:vault-java-driver:5.1.0' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'org.assertj:assertj-core:3.27.3' } From 8034c9fd987054b967c101fa79c7bcc952b3dffe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:29:24 +0000 Subject: [PATCH 0525/1224] Bump gradle-update/update-gradle-wrapper-action from 2.0.0 to 2.1.0 Bumps [gradle-update/update-gradle-wrapper-action](https://github.com/gradle-update/update-gradle-wrapper-action) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/gradle-update/update-gradle-wrapper-action/releases) - [Changelog](https://github.com/gradle-update/update-gradle-wrapper-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/gradle-update/update-gradle-wrapper-action/compare/9268373d69bd0974b6318eb3b512b8e025060bbe...512b1875f3b6270828abfe77b247d5895a2da1e5) --- updated-dependencies: - dependency-name: gradle-update/update-gradle-wrapper-action dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/update-gradle-wrapper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index b69353a6ab5..659ceea134d 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -19,7 +19,7 @@ jobs: - uses: actions/checkout@v4 - name: Update Gradle Wrapper - uses: gradle-update/update-gradle-wrapper-action@9268373d69bd0974b6318eb3b512b8e025060bbe # v1.0.13 + uses: gradle-update/update-gradle-wrapper-action@512b1875f3b6270828abfe77b247d5895a2da1e5 # v1.0.13 with: repo-token: ${{ secrets.GITHUB_TOKEN }} labels: dependencies From aa02da9fa7428490d1135b1415fb1500514d386f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:31:09 +0000 Subject: [PATCH 0526/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.13.4 to 1.15.1. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.13.4...v1.15.1) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.15.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 5bc95949f2c..11f9e4de6ce 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.rest-assured:rest-assured:5.5.5' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.1' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.49.0') From af4f5c2be4b7183e781d390855b04beb01537336 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 20:32:53 +0000 Subject: [PATCH 0527/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.49.0 to 1.51.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.49.0...v1.51.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.51.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 5bc95949f2c..8d3942fd147 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.49.0') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.51.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From 49894a171a11c89c45e9e786f2b087e45f5f9a10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 22:05:48 +0000 Subject: [PATCH 0528/1224] Bump gradle/actions from 3 to 4 Bumps [gradle/actions](https://github.com/gradle/actions) from 3 to 4. - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/v3...v4) --- updated-dependencies: - dependency-name: gradle/actions dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/update-gradle-wrapper.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index b69353a6ab5..85a42ad4da4 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -24,4 +24,4 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} labels: dependencies - - uses: gradle/actions/wrapper-validation@v3 + - uses: gradle/actions/wrapper-validation@v4 From ecd354bce359bcbbe67a04519e9b7efbc7337cdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:09:16 +0000 Subject: [PATCH 0529/1224] Bump com.gradle:common-custom-user-data-gradle-plugin from 2.0.2 to 2.3 Bumps [com.gradle:common-custom-user-data-gradle-plugin](https://github.com/gradle/common-custom-user-data-gradle-plugin) from 2.0.2 to 2.3. - [Release notes](https://github.com/gradle/common-custom-user-data-gradle-plugin/releases) - [Commits](https://github.com/gradle/common-custom-user-data-gradle-plugin/compare/v2.0.2...v2.3) --- updated-dependencies: - dependency-name: com.gradle:common-custom-user-data-gradle-plugin dependency-version: '2.3' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 401cb2be959..5f5bb6c46a8 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.18.2" - classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.2" + classpath "com.gradle:common-custom-user-data-gradle-plugin:2.3" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } } From 88e51c7505e9852d012582346e697ff71a574021 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 9 Jul 2025 23:09:18 +0000 Subject: [PATCH 0530/1224] Bump com.gradle.enterprise:com.gradle.enterprise.gradle.plugin Bumps com.gradle.enterprise:com.gradle.enterprise.gradle.plugin from 3.18.2 to 3.19.2. --- updated-dependencies: - dependency-name: com.gradle.enterprise:com.gradle.enterprise.gradle.plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 401cb2be959..f4f04e95558 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,7 +5,7 @@ buildscript { } } dependencies { - classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.18.2" + classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.19.2" classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.2" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } From 55163faa8ccb4477446066e3fc8708460549fe82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 10 Jul 2025 13:49:20 -0600 Subject: [PATCH 0531/1224] Add org.junit.platform:junit-platform-launcher --- docs/examples/junit5/redis/build.gradle | 7 ++++--- modules/hivemq/build.gradle | 3 ++- modules/junit-jupiter/build.gradle | 1 + 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index a5c9fb19810..b155797a7ad 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,9 +3,10 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.4.0.RELEASE" - testImplementation "org.junit.jupiter:junit-jupiter-api:5.11.0" - testImplementation "org.junit.jupiter:junit-jupiter-params:5.10.3" - testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.11.0" + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.3' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") testImplementation 'org.assertj:assertj-core:3.27.3' diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index e006e84ca3b..46fb3e757a7 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -11,7 +11,8 @@ dependencies { shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") shaded("net.lingala.zip4j:zip4j:2.11.5") - testImplementation("org.junit.jupiter:junit-jupiter:5.10.3") + testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.32.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle index a08951228b8..8fdfb973427 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -16,6 +16,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testRuntimeOnly 'org.postgresql:postgresql:42.7.4' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } From c99eed60449595c1bbfd0b3c7439b76f816c6414 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:51:37 +0000 Subject: [PATCH 0532/1224] Bump org.junit.jupiter:junit-jupiter in /modules/hivemq Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.10.3 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.10.3...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 46fb3e757a7..55919cb4fa5 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -11,7 +11,7 @@ dependencies { shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") shaded("net.lingala.zip4j:zip4j:2.11.5") - testImplementation 'org.junit.jupiter:junit-jupiter:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.32.0") From 61959bea6da9bd282f902d775e45113f5fdf4a94 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 10 Jul 2025 19:51:55 +0000 Subject: [PATCH 0533/1224] Bump org.junit.jupiter:junit-jupiter in /smoke-test Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.11.0 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.11.0...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- smoke-test/turbo-mode/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index 552f568be91..0c456b18880 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.27.3' } From 8fbb4be56dd78bb9c0b09c9088e1a768d4372d57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 10 Jul 2025 21:06:17 -0600 Subject: [PATCH 0534/1224] Add org.junit.platform:junit-platform-launcher to examples --- examples/cucumber/build.gradle | 1 + examples/hazelcast/build.gradle | 1 + examples/immudb/build.gradle | 2 ++ examples/kafka-cluster/build.gradle | 1 + examples/nats/build.gradle | 1 + examples/neo4j-container/build.gradle | 1 + examples/ollama-hugging-face/build.gradle | 1 + examples/redis-backed-cache/build.gradle | 1 + examples/selenium-container/build.gradle | 2 +- examples/sftp/build.gradle | 1 + examples/singleton-container/build.gradle | 1 + examples/solr-container/build.gradle | 1 + examples/spring-boot-kotlin-redis/build.gradle.kts | 6 ++---- examples/spring-boot/build.gradle | 2 +- examples/zookeeper/build.gradle | 1 + 15 files changed, 17 insertions(+), 6 deletions(-) diff --git a/examples/cucumber/build.gradle b/examples/cucumber/build.gradle index 176fb35ee8d..257a2d3d897 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -19,6 +19,7 @@ dependencies { testImplementation 'io.cucumber:cucumber-junit-platform-engine' testImplementation 'org.testcontainers:selenium' testImplementation 'org.assertj:assertj-core:3.26.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' } test { diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 5b3789480ad..2a5404bf5c9 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -12,6 +12,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index c99dceac836..f64d56c28c9 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -14,6 +14,8 @@ dependencies { testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 623fcd66175..e7ba6e83cad 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -16,6 +16,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'org.awaitility:awaitility:4.2.2' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 5814d592c20..0932e961df9 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -13,6 +13,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 186a910be2f..af05a7cad82 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -12,4 +12,5 @@ dependencies { testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 77fe23ea1c2..87331d7a1ed 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -12,6 +12,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'io.rest-assured:rest-assured:5.5.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 782416a239b..17aa2d9e06f 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -16,6 +16,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index b7528880ca3..823a7ccfc41 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation 'org.testcontainers:selenium' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } test { diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index d8ed52d255f..639136e2afe 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -12,6 +12,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 4b73e1125c6..02f17969fa9 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -17,6 +17,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 3b61202818e..2ab9db8f33e 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -16,6 +16,7 @@ dependencies { testImplementation 'org.testcontainers:solr' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { diff --git a/examples/spring-boot-kotlin-redis/build.gradle.kts b/examples/spring-boot-kotlin-redis/build.gradle.kts index 7a4aa917f35..2d5d6bf9640 100644 --- a/examples/spring-boot-kotlin-redis/build.gradle.kts +++ b/examples/spring-boot-kotlin-redis/build.gradle.kts @@ -1,7 +1,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - id("org.springframework.boot") version "2.7.10" + id("org.springframework.boot") version "2.7.18" kotlin("jvm") version "1.8.22" kotlin("plugin.spring") version "1.8.22" } @@ -21,9 +21,7 @@ dependencies { testImplementation("org.springframework.boot:spring-boot-starter-test") testImplementation("org.testcontainers:testcontainers") - testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") - - + testRuntimeOnly("org.junit.platform:junit-platform-launcher:1.8.2") } tasks.withType { diff --git a/examples/spring-boot/build.gradle b/examples/spring-boot/build.gradle index 657b544e119..2001c393afa 100644 --- a/examples/spring-boot/build.gradle +++ b/examples/spring-boot/build.gradle @@ -17,7 +17,7 @@ dependencies { runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.testcontainers:postgresql' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } test { diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index 50555fe8f85..f58ce18e423 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -12,6 +12,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { From f05f9461a8e53616edcf14923797065a80ea7f6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 03:08:51 +0000 Subject: [PATCH 0535/1224] Bump org.junit.jupiter:junit-jupiter-engine in /examples Bumps [org.junit.jupiter:junit-jupiter-engine](https://github.com/junit-team/junit-framework) from 5.11.0 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.11.0...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index b155797a7ad..4419bc3216b 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,9 +3,9 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.4.0.RELEASE" - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.3' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.3' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") From bcbe50b961097cb4f4a7b3ef064ac96a68bb4248 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 03:08:54 +0000 Subject: [PATCH 0536/1224] Bump org.junit.jupiter:junit-jupiter-params in /examples Bumps [org.junit.jupiter:junit-jupiter-params](https://github.com/junit-team/junit-framework) from 5.10.3 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.10.3...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index b155797a7ad..4419bc3216b 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,9 +3,9 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.4.0.RELEASE" - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.3' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.3' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") From 226b1351e1cca73f39b9b45a0aff1a6e217e61c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 03:08:54 +0000 Subject: [PATCH 0537/1224] Bump org.junit.jupiter:junit-jupiter-api in /examples Bumps [org.junit.jupiter:junit-jupiter-api](https://github.com/junit-team/junit-framework) from 5.11.0 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.11.0...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-api dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index b155797a7ad..4419bc3216b 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,9 +3,9 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.4.0.RELEASE" - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.10.3' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.10.3' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.10.3' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.3' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") From c64c3c1128de73dac98e9004b7cea08e7bf474e3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 03:08:57 +0000 Subject: [PATCH 0538/1224] Bump org.junit.jupiter:junit-jupiter from 5.11.0 to 5.13.2 in /examples Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.11.0 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.11.0...r5.13.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 2a5404bf5c9..0a33949201e 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index f64d56c28c9..ee39cf51865 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index e7ba6e83cad..88d7539a732 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'org.awaitility:awaitility:4.2.2' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 0932e961df9..21b0baa3a3a 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation 'io.nats:jnats:2.20.2' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index af05a7cad82..7f85f5162a1 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -11,6 +11,6 @@ dependencies { testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 87331d7a1ed..4bfe199e62b 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:ollama' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 17aa2d9e06f..512045ef3e3 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.26.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 639136e2afe..fbb5f6cbe40 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 02f17969fa9..12449babc4a 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 2ab9db8f33e..8e479b04ee2 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index f58ce18e423..cd062e2b459 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.11.0' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } From fcd9215cde8656a91e035075516dba7d8061c4db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 03:38:51 +0000 Subject: [PATCH 0539/1224] Bump org.junit:junit-bom from 5.10.3 to 5.13.2 in /modules/junit-jupiter Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.10.3 to 5.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.10.3...r5.13.2) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 8fdfb973427..4c93a4e6b59 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: JUnit Jupiter Extension" dependencies { api project(':testcontainers') - implementation platform('org.junit:junit-bom:5.10.3') + implementation platform('org.junit:junit-bom:5.13.3') implementation 'org.junit.jupiter:junit-jupiter-api' testImplementation project(':mysql') From 30e7a10c7e2f1abdad226229178b35d44fd8f7b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:32:35 +0000 Subject: [PATCH 0540/1224] Bump com.hivemq:hivemq-mqtt-client in /modules/hivemq Bumps [com.hivemq:hivemq-mqtt-client](https://github.com/hivemq/hivemq-mqtt-client) from 1.3.3 to 1.3.7. - [Release notes](https://github.com/hivemq/hivemq-mqtt-client/releases) - [Changelog](https://github.com/hivemq/hivemq-mqtt-client/blob/master/RELEASE.md) - [Commits](https://github.com/hivemq/hivemq-mqtt-client/compare/v1.3.3...v1.3.7) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-mqtt-client dependency-version: 1.3.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 55919cb4fa5..2c25ae44855 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -15,7 +15,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.32.0") - testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") + testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.8") testImplementation 'org.assertj:assertj-core:3.27.3' From 5205e52c79d0caea4ba1119a7268d7155ca22064 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:33:05 +0000 Subject: [PATCH 0541/1224] Bump org.postgresql:postgresql in /modules/junit-jupiter Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 4c93a4e6b59..1338385c863 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' + testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } From 94d21499582f352fbe047b6098eeefa2f8c58d3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:33:20 +0000 Subject: [PATCH 0542/1224] Bump org.postgresql:postgresql from 42.7.4 to 42.7.7 in /modules/spock Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.4 to 42.7.7. - [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.7.4...REL42.7.7) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 13be69af580..7d50cdf02f0 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'com.zaxxer:HikariCP:4.0.3' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testRuntimeOnly 'org.postgresql:postgresql:42.7.4' + testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.13.3' From 8e1da05b9cd629494675c3ed9cab5846fd428cba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 17:33:26 +0000 Subject: [PATCH 0543/1224] Bump com.gradleup.shadow from 8.3.0 to 8.3.8 Bumps com.gradleup.shadow from 8.3.0 to 8.3.8. --- updated-dependencies: - dependency-name: com.gradleup.shadow dependency-version: 8.3.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1d2a749c166..488f005147d 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { plugins { id 'io.franzbecker.gradle-lombok' version '5.0.0' - id 'com.gradleup.shadow' version '8.3.0' + id 'com.gradleup.shadow' version '8.3.8' id 'me.champeau.gradle.japicmp' version '0.4.3' apply false id 'com.diffplug.spotless' version '6.22.0' apply false id 'org.jreleaser' version '1.18.0' apply false From b8e7a28f59746bd884d3f874dea9d5533bcf2fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 11 Jul 2025 12:43:49 -0600 Subject: [PATCH 0544/1224] Add org.junit.platform:junit-platform-launcher to smoke-test --- smoke-test/turbo-mode/build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index 0c456b18880..1408842ee00 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -7,6 +7,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.assertj:assertj-core:3.27.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' } test { From 83423de681a05d2040e589c155d66b897f7cfcb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 18:46:22 +0000 Subject: [PATCH 0545/1224] Bump org.seleniumhq.selenium:selenium-api in /smoke-test Bumps [org.seleniumhq.selenium:selenium-api](https://github.com/SeleniumHQ/selenium) from 4.25.0 to 4.34.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.25.0...selenium-4.34.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-api dependency-version: 4.34.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index 5b955531fb9..50b7d9caf32 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -7,6 +7,6 @@ dependencies { testImplementation project(":mysql") testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation "org.seleniumhq.selenium:selenium-api:4.25.0" + testImplementation "org.seleniumhq.selenium:selenium-api:4.34.0" testImplementation 'org.assertj:assertj-core:3.27.3' } From 24411063432278643553140a17e89c44f8752c63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:01:22 +0000 Subject: [PATCH 0546/1224] Bump redis.clients:jedis from 5.1.5 to 6.0.0 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.5 to 6.0.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.5...v6.0.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 665587a50c4..fecefb33421 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' - testImplementation 'redis.clients:jedis:5.1.5' + testImplementation 'redis.clients:jedis:6.0.0' testImplementation 'org.assertj:assertj-core:3.27.3' } From 26cb26c51b0b7168036480cf037692ecef004ca2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Jul 2025 20:02:03 +0000 Subject: [PATCH 0547/1224] Bump redis.clients:jedis from 5.1.5 to 6.0.0 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 5.1.5 to 6.0.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v5.1.5...v6.0.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 1338385c863..121e949dbe2 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') testImplementation 'com.zaxxer:HikariCP:4.0.3' - testImplementation 'redis.clients:jedis:5.1.5' + testImplementation 'redis.clients:jedis:6.0.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From 527c75023ee39ce8f0d918b149028a789a9841ae Mon Sep 17 00:00:00 2001 From: Marcin Antas Date: Sat, 12 Jul 2025 04:46:35 +0200 Subject: [PATCH 0548/1224] Update Weaviate to v1.29.0 (#10066) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../testcontainers/weaviate/WeaviateContainerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java index 53096182839..535b81126fd 100644 --- a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java +++ b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java @@ -19,7 +19,7 @@ public class WeaviateContainerTest { @Test public void testWeaviate() { try ( // container { - WeaviateContainer weaviate = new WeaviateContainer("cr.weaviate.io/semitechnologies/weaviate:1.25.5") + WeaviateContainer weaviate = new WeaviateContainer("cr.weaviate.io/semitechnologies/weaviate:1.29.0") // } ) { weaviate.start(); @@ -27,7 +27,7 @@ public void testWeaviate() { config.setGRPCHost(weaviate.getGrpcHostAddress()); WeaviateClient client = new WeaviateClient(config); Result meta = client.misc().metaGetter().run(); - assertThat(meta.getResult().getVersion()).isEqualTo("1.25.5"); + assertThat(meta.getResult().getVersion()).isEqualTo("1.29.0"); } } @@ -43,13 +43,13 @@ public void testWeaviateWithModules() { Map env = new HashMap<>(); env.put("ENABLE_MODULES", String.join(",", enableModules)); env.put("BACKUP_FILESYSTEM_PATH", "/tmp/backups"); - try (WeaviateContainer weaviate = new WeaviateContainer("semitechnologies/weaviate:1.25.5").withEnv(env)) { + try (WeaviateContainer weaviate = new WeaviateContainer("semitechnologies/weaviate:1.29.0").withEnv(env)) { weaviate.start(); Config config = new Config("http", weaviate.getHttpHostAddress()); config.setGRPCHost(weaviate.getGrpcHostAddress()); WeaviateClient client = new WeaviateClient(config); Result meta = client.misc().metaGetter().run(); - assertThat(meta.getResult().getVersion()).isEqualTo("1.25.5"); + assertThat(meta.getResult().getVersion()).isEqualTo("1.29.0"); Object modules = meta.getResult().getModules(); assertThat(modules) .isNotNull() From 3d1c1b34887832fa76587d1029e6499802c70e73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 14 Jul 2025 08:36:18 -0600 Subject: [PATCH 0549/1224] Remove support for docker/agents_gateway (#10473) --- .../containers/DockerMcpGatewayContainer.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/DockerMcpGatewayContainer.java b/core/src/main/java/org/testcontainers/containers/DockerMcpGatewayContainer.java index 8a91f9e651e..40e80ae2061 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerMcpGatewayContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerMcpGatewayContainer.java @@ -14,7 +14,7 @@ /** * Testcontainers implementation of the Docker MCP Gateway container. *

    - * Supported images: {@code docker/agents_gateway} + * Supported images: {@code docker/mcp-gateway} *

    * Exposed ports: 8811 */ @@ -22,12 +22,8 @@ public class DockerMcpGatewayContainer extends GenericContainer Date: Mon, 14 Jul 2025 08:47:29 -0600 Subject: [PATCH 0550/1224] Fix docs for Docker MCP Gateway --- docs/modules/docker_mcp_gateway.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/docker_mcp_gateway.md b/docs/modules/docker_mcp_gateway.md index da0b2e55c09..af526bab3fe 100644 --- a/docs/modules/docker_mcp_gateway.md +++ b/docs/modules/docker_mcp_gateway.md @@ -1,6 +1,6 @@ # Docker MCP Gateway -Testcontainers module for [Docker MCP Gateway](https://hub.docker.com/r/docker/agents_gateway). +Testcontainers module for [Docker MCP Gateway](https://hub.docker.com/r/docker/mcp-gateway). ## DockerMcpGatewayContainer's usage examples From e4c072de45063e3f229ced484d1e6863af4ba499 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 16:39:02 +0000 Subject: [PATCH 0551/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 10.0.27 to 11.0.8. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.8 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 52467ad8582..6712d720a47 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -10,7 +10,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.3' - api 'org.apache.tomcat:tomcat-jdbc:10.0.27' + api 'org.apache.tomcat:tomcat-jdbc:11.0.9' api 'org.vibur:vibur-dbcp:25.0' api 'mysql:mysql-connector-java:8.0.33' } From 29ddb31dcbd47953cabed36a6bd21aa590fa28de Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 16:39:56 +0000 Subject: [PATCH 0552/1224] Bump com.google.cloud.tools:jib-core from 0.23.0 to 0.27.3 in /core Bumps [com.google.cloud.tools:jib-core](https://github.com/GoogleContainerTools/jib) from 0.23.0 to 0.27.3. - [Release notes](https://github.com/GoogleContainerTools/jib/releases) - [Commits](https://github.com/GoogleContainerTools/jib/commits) --- updated-dependencies: - dependency-name: com.google.cloud.tools:jib-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 423c4d4b612..ad8405fc906 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -78,7 +78,7 @@ dependencies { exclude(group: 'org.jetbrains', module: 'annotations') } - provided('com.google.cloud.tools:jib-core:0.23.0') { + provided('com.google.cloud.tools:jib-core:0.27.3') { exclude group: 'com.google.guava', module: 'guava' exclude group: 'com.fasterxml.jackson.datatype', module: 'jackson-datatype-jsr310' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core' @@ -106,7 +106,7 @@ dependencies { shaded 'org.zeroturnaround:zt-exec:1.12' - testImplementation('com.google.cloud.tools:jib-core:0.23.0') { + testImplementation('com.google.cloud.tools:jib-core:0.27.3') { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' From 5f22d70b24cff0216f6dca5f236a6f32a268292c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:08:37 +0000 Subject: [PATCH 0553/1224] Bump io.kubernetes:client-java in /modules/k3s Bumps [io.kubernetes:client-java](https://github.com/kubernetes-client/java) from 21.0.1-legacy to 24.0.0-legacy. - [Release notes](https://github.com/kubernetes-client/java/releases) - [Changelog](https://github.com/kubernetes-client/java/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes-client/java/commits/v24.0.0-legacy) --- updated-dependencies: - dependency-name: io.kubernetes:client-java dependency-version: 24.0.0-legacy dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index e1454505c7e..17dab8a4537 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -9,6 +9,6 @@ dependencies { shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.8' testImplementation 'io.fabric8:kubernetes-client:6.13.1' - testImplementation 'io.kubernetes:client-java:21.0.1-legacy' + testImplementation 'io.kubernetes:client-java:24.0.0-legacy' testImplementation 'org.assertj:assertj-core:3.27.3' } From 8e9100ca73fd88efb28529f4adb80cb3c2eac286 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:09:04 +0000 Subject: [PATCH 0554/1224] Bump com.timeplus:timeplus-native-jdbc in /modules/timeplus Bumps [com.timeplus:timeplus-native-jdbc](https://github.com/timeplus-io/timeplus-native-jdbc) from 2.0.5 to 2.0.10. - [Release notes](https://github.com/timeplus-io/timeplus-native-jdbc/releases) - [Commits](https://github.com/timeplus-io/timeplus-native-jdbc/compare/v2.0.5...v2.0.10) --- updated-dependencies: - dependency-name: com.timeplus:timeplus-native-jdbc dependency-version: 2.0.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/timeplus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index a4656822de5..72da2ed182f 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -5,6 +5,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.5' + testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.10' testImplementation 'org.assertj:assertj-core:3.27.3' } From 91142a74648cde955c9a3e9a6b387161fbf4aca6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:26:15 +0000 Subject: [PATCH 0555/1224] Bump com.scylladb:java-driver-core in /modules/scylladb Bumps [com.scylladb:java-driver-core](https://github.com/scylladb/java-driver) from 4.15.0.0 to 4.19.0.1. - [Release notes](https://github.com/scylladb/java-driver/releases) - [Commits](https://github.com/scylladb/java-driver/compare/4.15.0...4.19.0.1) --- updated-dependencies: - dependency-name: com.scylladb:java-driver-core dependency-version: 4.19.0.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index c2cd82ebf0f..a2dcc57fb0e 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: ScyllaDB" dependencies { api project(":testcontainers") - testImplementation 'com.scylladb:java-driver-core:4.15.0.0' + testImplementation 'com.scylladb:java-driver-core:4.19.0.1' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'software.amazon.awssdk:dynamodb:2.28.6' } From e128465790d1fb65b2efd9b6af7da7c1f32eda1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:33:54 +0000 Subject: [PATCH 0556/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 3.8.0 to 4.0.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 11e674f5665..752ae5aa98e 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.33' - testImplementation 'org.apache.kafka:kafka-clients:3.8.0' + testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'org.awaitility:awaitility:4.3.0' From e889988f2fd15269eaf3f4c508d6752f9c9656bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:34:03 +0000 Subject: [PATCH 0557/1224] Bump ch.qos.logback:logback-classic in /modules/hivemq Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.8 to 1.5.18. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.8...v_1.5.18) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 55919cb4fa5..b7cc6bf43c5 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation("com.hivemq:hivemq-extension-sdk:4.32.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.3") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") - testImplementation("ch.qos.logback:logback-classic:1.5.8") + testImplementation("ch.qos.logback:logback-classic:1.5.18") testImplementation 'org.assertj:assertj-core:3.27.3' } From 678702c31f074f66cd463ae0a8b4080e0be84c0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:35:40 +0000 Subject: [PATCH 0558/1224] Bump dev.openfga:openfga-sdk from 0.7.0 to 0.8.1 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.7.0 to 0.8.1. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.7.0...v0.8.1) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 82341045efb..45f4cf1244c 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'dev.openfga:openfga-sdk:0.7.0' + testImplementation 'dev.openfga:openfga-sdk:0.8.2' } test { From e8a7a82b918139f9e94a3dd2e0ba0e89e370e42c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 17:37:20 +0000 Subject: [PATCH 0559/1224] Bump org.neo4j.driver:neo4j-java-driver in /modules/neo4j Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.18 to 4.4.20. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.18...4.4.20) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 ed9a07b8ec4..9c7a70454ff 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -33,7 +33,7 @@ dependencies { api project(":testcontainers") - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' testImplementation 'org.assertj:assertj-core:3.27.3' } From 11818c491d42b95a58a7cfc4c7a31c50d9aea0c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 19:44:45 +0000 Subject: [PATCH 0560/1224] Bump com.yugabyte:jdbc-yugabytedb in /modules/yugabytedb Bumps [com.yugabyte:jdbc-yugabytedb](https://github.com/yugabyte/pgjdbc) from 42.3.5-yb-6 to 42.7.3-yb-4. - [Release notes](https://github.com/yugabyte/pgjdbc/releases) - [Changelog](https://github.com/yugabyte/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/yugabyte/pgjdbc/compare/v42.3.5-yb-6...v42.7.3-yb-4) --- updated-dependencies: - dependency-name: com.yugabyte:jdbc-yugabytedb dependency-version: 42.7.3-yb-4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/yugabytedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/yugabytedb/build.gradle b/modules/yugabytedb/build.gradle index cb5d583b4ca..7d124651a64 100644 --- a/modules/yugabytedb/build.gradle +++ b/modules/yugabytedb/build.gradle @@ -6,5 +6,5 @@ dependencies { // YCQL driver testImplementation 'com.yugabyte:java-driver-core:4.15.0-yb-2-TESTFIX.0' // YSQL driver - testRuntimeOnly 'com.yugabyte:jdbc-yugabytedb:42.3.5-yb-6' + testRuntimeOnly 'com.yugabyte:jdbc-yugabytedb:42.7.3-yb-4' } From c0cc69b792cd457eda6e3e902de8c2105daa52dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:17:24 +0000 Subject: [PATCH 0561/1224] Bump com.databend:databend-jdbc from 0.3.2 to 0.3.9 in /modules/databend Bumps [com.databend:databend-jdbc](https://github.com/databendcloud/databend-jdbc) from 0.3.2 to 0.3.9. - [Release notes](https://github.com/databendcloud/databend-jdbc/releases) - [Commits](https://github.com/databendcloud/databend-jdbc/compare/v0.3.2...v0.3.9) --- updated-dependencies: - dependency-name: com.databend:databend-jdbc dependency-version: 0.3.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 65b014314a3..8eac99519c4 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.databend:databend-jdbc:0.3.2' + testRuntimeOnly 'com.databend:databend-jdbc:0.3.9' testImplementation 'org.assertj:assertj-core:3.27.3' } From ae89f6e8c4da8d61ceeb981e6670f5576de2dec0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:18:20 +0000 Subject: [PATCH 0562/1224] Bump com.timeplus:timeplus-native-jdbc in /modules/timeplus Bumps [com.timeplus:timeplus-native-jdbc](https://github.com/timeplus-io/timeplus-native-jdbc) from 2.0.5 to 2.0.7. - [Release notes](https://github.com/timeplus-io/timeplus-native-jdbc/releases) - [Commits](https://github.com/timeplus-io/timeplus-native-jdbc/compare/v2.0.5...v2.0.7) --- updated-dependencies: - dependency-name: com.timeplus:timeplus-native-jdbc dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/timeplus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index a4656822de5..72da2ed182f 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -5,6 +5,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.5' + testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.10' testImplementation 'org.assertj:assertj-core:3.27.3' } From f87692f46be1a197124101eb66a83b343146a5dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:18:44 +0000 Subject: [PATCH 0563/1224] Bump com.google.guava:guava in /modules/jdbc-test Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.3.1-jre to 33.4.8-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-version: 33.4.8-jre dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 52467ad8582..29dbc9e8897 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -1,7 +1,7 @@ dependencies { api project(':jdbc') - api 'com.google.guava:guava:33.3.1-jre' + api 'com.google.guava:guava:33.4.8-jre' api 'org.apache.commons:commons-lang3:3.17.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 9ddbedae4240c0efe536537822742bc41d79527c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:18:53 +0000 Subject: [PATCH 0564/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-free Bumps com.oracle.database.jdbc:ojdbc11 from 23.5.0.24.07 to 23.8.0.25.04. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.8.0.25.04 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index cc19ce93d54..8ce9ace6b46 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' testImplementation project(':jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.5.0.24.07' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.8.0.25.04' compileOnly 'org.jetbrains:annotations:26.0.2' From fb365d884b6e016db4522238d70ce013fdaf0a64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:18:54 +0000 Subject: [PATCH 0565/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-xe Bumps com.oracle.database.jdbc:ojdbc11 from 23.5.0.24.07 to 23.8.0.25.04. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.8.0.25.04 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index c509b3bf431..e61c4ea9abe 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' testImplementation project(':jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.5.0.24.07' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.8.0.25.04' compileOnly 'org.jetbrains:annotations:26.0.2' From e81d15101fec7388a7a6242832cfb37ef831931a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:18:56 +0000 Subject: [PATCH 0566/1224] Bump org.mariadb.jdbc:mariadb-java-client in /modules/mariadb Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.4.1 to 3.5.4. - [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases) - [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/main/CHANGELOG.md) - [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.4.1...3.5.4) --- updated-dependencies: - dependency-name: org.mariadb.jdbc:mariadb-java-client dependency-version: 3.5.4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 7492300b4b6..416ae4f2707 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' testImplementation project(':jdbc-test') - testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.4.1' + testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.4' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' From 03087b423b7519a1805c76fd9117fbe09893a3f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:19:00 +0000 Subject: [PATCH 0567/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 10.0.27 to 11.0.2. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 52467ad8582..6712d720a47 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -10,7 +10,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.3' - api 'org.apache.tomcat:tomcat-jdbc:10.0.27' + api 'org.apache.tomcat:tomcat-jdbc:11.0.9' api 'org.vibur:vibur-dbcp:25.0' api 'mysql:mysql-connector-java:8.0.33' } From 0c041476eb8c5e2953481b715929b9316c693855 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:19:21 +0000 Subject: [PATCH 0568/1224] Bump io.trino:trino-jdbc from 458 to 476 in /modules/trino Bumps io.trino:trino-jdbc from 458 to 476. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-version: '476' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 0977b0306b4..f8d3a4f1307 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:458' + testRuntimeOnly 'io.trino:trino-jdbc:476' compileOnly 'org.jetbrains:annotations:26.0.2' } From 26acfc1f1c0003a95268e2d425ee43c413a0ed2e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:19:25 +0000 Subject: [PATCH 0569/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 10.1.30 to 11.0.8. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.8 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 009533503bc..de68d8816d0 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:25.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:10.1.30' + testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.9' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation ('org.mockito:mockito-core:4.11.0') { From 8ecdf31277a92bc49e03ea0475148a634407c897 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:19:26 +0000 Subject: [PATCH 0570/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/azure Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 12.8.1.jre8 to 13.1.0.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.1.0.jre8-preview dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 03cdcdd15d0..31699f62ad6 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -13,5 +13,5 @@ dependencies { testImplementation 'com.azure:azure-data-tables:12.5.0' testImplementation 'com.azure:azure-messaging-eventhubs:5.19.2' testImplementation 'com.azure:azure-messaging-servicebus:7.17.8' - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.0.jre8-preview' } From 77dd4fc0fe56b8be7ef86d158e32cd157641200e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:19:33 +0000 Subject: [PATCH 0571/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 12.8.1.jre8 to 13.1.0.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.1.0.jre8-preview dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 006c5d38031..899bbcc88db 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' testImplementation project(':jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.8.1.jre8' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.0.jre8-preview' testImplementation project(':r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' From b1c6297bd5690c6ec7a8c3c39fd4673d58dee0fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 01:51:24 +0000 Subject: [PATCH 0572/1224] Bump slackapi/slack-github-action from 2.1.0 to 2.1.1 Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 2.1.0 to 2.1.1. - [Release notes](https://github.com/slackapi/slack-github-action/releases) - [Commits](https://github.com/slackapi/slack-github-action/compare/v2.1.0...v2.1.1) --- updated-dependencies: - dependency-name: slackapi/slack-github-action dependency-version: 2.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/moby-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index 7c25a3bb8cf..dbb717757b3 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -43,7 +43,7 @@ jobs: - name: Notify to Slack on failures if: failure() id: slack - uses: slackapi/slack-github-action@v2.1.0 + uses: slackapi/slack-github-action@v2.1.1 with: payload: | { From fa2553da83c5c004e40d252e4967ddbf798b93e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 02:06:26 +0000 Subject: [PATCH 0573/1224] Bump org.awaitility:awaitility from 4.2.0 to 4.3.0 in /core Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.0 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.0...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-version: 4.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 423c4d4b612..ba3475859f6 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -86,7 +86,7 @@ dependencies { exclude group: 'org.apache.commons', module: 'commons-compress' } - shaded 'org.awaitility:awaitility:4.2.0' + shaded 'org.awaitility:awaitility:4.3.0' api platform('com.github.docker-java:docker-java-bom:3.4.2') shaded platform('com.github.docker-java:docker-java-bom:3.4.2') From 985383c1a913eac91479f43cd4a7b8611261135f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 15 Jul 2025 09:30:04 -0600 Subject: [PATCH 0574/1224] Use azure-sdk-bom (#10480) --- modules/azure/build.gradle | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 31699f62ad6..d3baf572321 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -7,11 +7,12 @@ dependencies { shaded 'com.squareup.okhttp3:okhttp:4.12.0' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'com.azure:azure-cosmos:4.63.3' - testImplementation 'com.azure:azure-storage-blob:12.29.0' - testImplementation 'com.azure:azure-storage-queue:12.24.0' - testImplementation 'com.azure:azure-data-tables:12.5.0' - testImplementation 'com.azure:azure-messaging-eventhubs:5.19.2' - testImplementation 'com.azure:azure-messaging-servicebus:7.17.8' + testImplementation platform("com.azure:azure-sdk-bom:1.2.32") + testImplementation 'com.azure:azure-cosmos' + testImplementation 'com.azure:azure-storage-blob' + testImplementation 'com.azure:azure-storage-queue' + testImplementation 'com.azure:azure-data-tables' + testImplementation 'com.azure:azure-messaging-eventhubs' + testImplementation 'com.azure:azure-messaging-servicebus' testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.0.jre8-preview' } From 72ab602589ecd9c0840a590704e16aed49c65379 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:38:51 +0000 Subject: [PATCH 0575/1224] Bump com.oracle.database.r2dbc:oracle-r2dbc in /modules/oracle-free Bumps [com.oracle.database.r2dbc:oracle-r2dbc](https://github.com/oracle/oracle-r2dbc) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/oracle/oracle-r2dbc/releases) - [Commits](https://github.com/oracle/oracle-r2dbc/compare/1.2.0...1.3.0) --- updated-dependencies: - dependency-name: com.oracle.database.r2dbc:oracle-r2dbc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index 8ce9ace6b46..424f6c48616 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':jdbc') compileOnly project(':r2dbc') - compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' + compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.8.0.25.04' @@ -12,5 +12,5 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation testFixtures(project(':r2dbc')) - testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' + testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } From fa83c47e29940a81de65751ad331856607b2a5bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 15:38:58 +0000 Subject: [PATCH 0576/1224] Bump com.oracle.database.r2dbc:oracle-r2dbc in /modules/oracle-xe Bumps [com.oracle.database.r2dbc:oracle-r2dbc](https://github.com/oracle/oracle-r2dbc) from 1.2.0 to 1.3.0. - [Release notes](https://github.com/oracle/oracle-r2dbc/releases) - [Commits](https://github.com/oracle/oracle-r2dbc/compare/1.2.0...1.3.0) --- updated-dependencies: - dependency-name: com.oracle.database.r2dbc:oracle-r2dbc dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index e61c4ea9abe..ff04ca864d1 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':jdbc') compileOnly project(':r2dbc') - compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' + compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.8.0.25.04' @@ -12,7 +12,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation testFixtures(project(':r2dbc')) - testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.2.0' + testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } tasks.japicmp { From 4c7b73cdca04b3280f7c528ee5cea6b33be614bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:06:12 +0000 Subject: [PATCH 0577/1224] Bump org.vibur:vibur-dbcp from 25.0 to 26.0 in /modules/jdbc-test Bumps [org.vibur:vibur-dbcp](https://github.com/vibur/vibur-dbcp) from 25.0 to 26.0. - [Changelog](https://github.com/vibur/vibur-dbcp/blob/master/CHANGELOG) - [Commits](https://github.com/vibur/vibur-dbcp/compare/25.0...26.0) --- updated-dependencies: - dependency-name: org.vibur:vibur-dbcp dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 aff78b9efdf..507313e9ad2 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -11,6 +11,6 @@ dependencies { api 'org.assertj:assertj-core:3.27.3' api 'org.apache.tomcat:tomcat-jdbc:11.0.9' - api 'org.vibur:vibur-dbcp:25.0' + api 'org.vibur:vibur-dbcp:26.0' api 'mysql:mysql-connector-java:8.0.33' } From 4dc82f49361609cb1b29ff24b948360e1f81dff8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:06:17 +0000 Subject: [PATCH 0578/1224] Bump org.vibur:vibur-dbcp from 25.0 to 26.0 in /modules/jdbc Bumps [org.vibur:vibur-dbcp](https://github.com/vibur/vibur-dbcp) from 25.0 to 26.0. - [Changelog](https://github.com/vibur/vibur-dbcp/blob/master/CHANGELOG) - [Commits](https://github.com/vibur/vibur-dbcp/compare/25.0...26.0) --- updated-dependencies: - dependency-name: org.vibur:vibur-dbcp dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 de68d8816d0..c343cd17a4a 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -5,7 +5,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' - testImplementation 'org.vibur:vibur-dbcp:25.0' + testImplementation 'org.vibur:vibur-dbcp:26.0' testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.9' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation 'org.assertj:assertj-core:3.27.3' From 6531e902532b3d57143168aea402e5c88abd531a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:06:37 +0000 Subject: [PATCH 0579/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.6.10 to 3.7.7. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.6.10...v3.7.7) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-version: 3.7.7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 0c2bde505b1..b506f5a2515 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -12,6 +12,6 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.6.10' + testFixturesImplementation 'io.projectreactor:reactor-core:3.7.8' testFixturesImplementation 'org.assertj:assertj-core:3.27.3' } From a8ef0f3d5f2715b7338f8f08f7b0705abfda1c4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 16:06:40 +0000 Subject: [PATCH 0580/1224] Bump io.asyncer:r2dbc-mysql from 1.3.0 to 1.4.1 in /modules/mysql Bumps [io.asyncer:r2dbc-mysql](https://github.com/asyncer-io/r2dbc-mysql) from 1.3.0 to 1.4.1. - [Release notes](https://github.com/asyncer-io/r2dbc-mysql/releases) - [Commits](https://github.com/asyncer-io/r2dbc-mysql/compare/r2dbc-mysql-1.3.0...r2dbc-mysql-1.4.1) --- updated-dependencies: - dependency-name: io.asyncer:r2dbc-mysql dependency-version: 1.4.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/mysql/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index 4858aa20ff5..3055cd141fc 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -4,13 +4,13 @@ dependencies { api project(':jdbc') compileOnly project(':r2dbc') - compileOnly 'io.asyncer:r2dbc-mysql:1.3.0' + compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' testImplementation project(':jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation testFixtures(project(':r2dbc')) - testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.3.0' + testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' compileOnly 'org.jetbrains:annotations:26.0.2' } From 4334f84f23213afb5c65f1b6f8bc48071cf5cbf8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:00:03 +0000 Subject: [PATCH 0581/1224] Bump org.apache.solr:solr-solrj from 8.11.3 to 8.11.4 in /examples Bumps org.apache.solr:solr-solrj from 8.11.3 to 8.11.4. --- updated-dependencies: - dependency-name: org.apache.solr:solr-solrj dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 8e479b04ee2..58c380676d2 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -10,7 +10,7 @@ dependencies { compileOnly "org.projectlombok:lombok:1.18.34" annotationProcessor "org.projectlombok:lombok:1.18.34" - implementation 'org.apache.solr:solr-solrj:8.11.3' + implementation 'org.apache.solr:solr-solrj:8.11.4' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' From 40c765a8be4dd3c3cc21f2bd04d7ca982da77cd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:00:23 +0000 Subject: [PATCH 0582/1224] Bump org.apache.curator:curator-framework in /examples Bumps [org.apache.curator:curator-framework](https://github.com/apache/curator) from 5.7.0 to 5.8.0. - [Release notes](https://github.com/apache/curator/releases) - [Commits](https://github.com/apache/curator/compare/apache-curator-5.7.0...apache-curator-5.8.0) --- updated-dependencies: - dependency-name: org.apache.curator:curator-framework dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/zookeeper/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index cd062e2b459..835280cdfc0 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.apache.curator:curator-framework:5.7.0' + testImplementation 'org.apache.curator:curator-framework:5.8.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From b1cfe22dccac09173645ed68d11dec441047732a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:53:27 +0000 Subject: [PATCH 0583/1224] Bump com.rabbitmq:amqp-client from 5.22.0 to 5.25.0 in /modules/rabbitmq Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.22.0 to 5.25.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.22.0...v5.25.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 751baaf15f8..3137ec7f7e1 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testImplementation 'com.rabbitmq:amqp-client:5.22.0' + testImplementation 'com.rabbitmq:amqp-client:5.25.0' testImplementation 'org.assertj:assertj-core:3.27.3' compileOnly 'org.jetbrains:annotations:26.0.2' } From 20a33803d6f83209ddd657ce1894fdf0131ba66a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:53:27 +0000 Subject: [PATCH 0584/1224] Bump com.rabbitmq:amqp-client from 5.22.0 to 5.25.0 in /core Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.22.0 to 5.25.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.22.0...v5.25.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 423c4d4b612..c7cc63cc630 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -111,7 +111,7 @@ dependencies { } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'redis.clients:jedis:6.0.0' - testImplementation 'com.rabbitmq:amqp-client:5.22.0' + testImplementation 'com.rabbitmq:amqp-client:5.25.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From 546a007489464f249c8d98869827a4e5fed7cb0d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 17:53:30 +0000 Subject: [PATCH 0585/1224] Bump io.minio:minio from 8.5.12 to 8.5.17 in /modules/minio Bumps [io.minio:minio](https://github.com/minio/minio-java) from 8.5.12 to 8.5.17. - [Release notes](https://github.com/minio/minio-java/releases) - [Commits](https://github.com/minio/minio-java/compare/8.5.12...8.5.17) --- updated-dependencies: - dependency-name: io.minio:minio dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index bbce75f2c47..8fae8536fb0 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testImplementation("io.minio:minio:8.5.12") + testImplementation("io.minio:minio:8.5.17") testImplementation 'org.assertj:assertj-core:3.27.3' } From 0dd3a76052bd322fade3cb8c236f9e57fc2c387e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:14:37 +0000 Subject: [PATCH 0586/1224] Bump org.influxdb:influxdb-java from 2.24 to 2.25 in /modules/influxdb Bumps [org.influxdb:influxdb-java](https://github.com/influxdata/influxdb-java) from 2.24 to 2.25. - [Release notes](https://github.com/influxdata/influxdb-java/releases) - [Changelog](https://github.com/influxdata/influxdb-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-java/compare/influxdb-java-2.24...influxdb-java-2.25) --- updated-dependencies: - dependency-name: org.influxdb:influxdb-java dependency-version: '2.25' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 4964fbac33e..fb463aaecff 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -3,10 +3,10 @@ description = "Testcontainers :: InfluxDB" dependencies { api project(':testcontainers') - compileOnly 'org.influxdb:influxdb-java:2.24' + compileOnly 'org.influxdb:influxdb-java:2.25' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.influxdb:influxdb-java:2.24' + testImplementation 'org.influxdb:influxdb-java:2.25' testImplementation "com.influxdb:influxdb-client-java:6.12.0" } From 9ece57b4f2d15af445b68d7976fc8b7f55687166 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:14:41 +0000 Subject: [PATCH 0587/1224] Bump com.zaxxer:HikariCP from 4.0.3 to 6.3.0 in /modules/junit-jupiter Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 4.0.3 to 6.3.0. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-4.0.3...HikariCP-6.3.0) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 121e949dbe2..99ac3119075 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') - testImplementation 'com.zaxxer:HikariCP:4.0.3' + testImplementation 'com.zaxxer:HikariCP:6.3.0' testImplementation 'redis.clients:jedis:6.0.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From 4374688c6e7400fac12f2b6c338f23ccb0143949 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 19:17:43 +0000 Subject: [PATCH 0588/1224] Bump org.apache.activemq:activemq-client in /modules/activemq Bumps [org.apache.activemq:activemq-client](https://github.com/apache/activemq) from 6.1.2 to 6.1.7. - [Commits](https://github.com/apache/activemq/compare/activemq-6.1.2...activemq-6.1.7) --- updated-dependencies: - dependency-name: org.apache.activemq:activemq-client dependency-version: 6.1.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 2d2440827ef..89637555670 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation "org.apache.activemq:activemq-client:6.1.2" + testImplementation "org.apache.activemq:activemq-client:6.1.7" testImplementation "org.apache.activemq:artemis-jakarta-client:2.37.0" } From c935f7f392c306fe2bb64fdb6f2e8014f3b942e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:40:03 +0000 Subject: [PATCH 0589/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.32.0 to 4.41.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.32.0...4.41.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-version: 4.41.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 40791439aa4..898f0ba5639 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation(project(":junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.32.0") + testImplementation("com.hivemq:hivemq-extension-sdk:4.41.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") From c4920b1a903e7aba1a2c2bb5c70d8cd114d793a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:40:22 +0000 Subject: [PATCH 0590/1224] Bump org.junit.platform:junit-platform-launcher in /modules/spock Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.10.3 to 1.13.2. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-version: 1.13.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 1b2f5b98a49..7a5c6e0e0fc 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -17,7 +17,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.13.3' testCompileOnly 'org.jetbrains:annotations:26.0.2' From 329b8885e5fcd8e182f4ce93f2ab7be291d180a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 20:40:24 +0000 Subject: [PATCH 0591/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 8.15.1 to 9.0.3. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v8.15.1...v9.0.3) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.0.3 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 f0f260c5fb0..0370bab602f 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:8.15.1" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.0.3" testImplementation "org.elasticsearch.client:transport:7.17.29" testImplementation 'org.assertj:assertj-core:3.27.3' } From 1ebf422042bd4f3e0ceb69e2f373d16e5c410b55 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:17 +0000 Subject: [PATCH 0592/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.7.3 to 3.8.2. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/core-io-3.7.3...core-io-3.8.2) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-version: 3.8.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 1d73edc3396..47b8a28b8fa 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,7 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:4.12.0' - testImplementation 'com.couchbase.client:java-client:3.7.3' + testImplementation 'com.couchbase.client:java-client:3.8.3' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.27.3' } From e85d0ea81892a4354decbe830933f9e5c8a42149 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:20 +0000 Subject: [PATCH 0593/1224] Bump io.fabric8:kubernetes-client from 6.13.1 to 7.3.1 in /modules/k3s Bumps [io.fabric8:kubernetes-client](https://github.com/fabric8io/kubernetes-client) from 6.13.1 to 7.3.1. - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v6.13.1...v7.3.1) --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-version: 7.3.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 17dab8a4537..d82683a4370 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -8,7 +8,7 @@ dependencies { // Any >2.8 version here is not compatible with jackson-databind 2.8.x. shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.8' - testImplementation 'io.fabric8:kubernetes-client:6.13.1' + testImplementation 'io.fabric8:kubernetes-client:7.3.1' testImplementation 'io.kubernetes:client-java:24.0.0-legacy' testImplementation 'org.assertj:assertj-core:3.27.3' } From 193021764e40bf4c27b18efd61d5d27348546040 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:30 +0000 Subject: [PATCH 0594/1224] Bump com.influxdb:influxdb-client-java in /modules/influxdb Bumps [com.influxdb:influxdb-client-java](https://github.com/influxdata/influxdb-client-java) from 6.12.0 to 7.3.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v6.12.0...v7.3.0) --- updated-dependencies: - dependency-name: com.influxdb:influxdb-client-java dependency-version: 7.3.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/influxdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index fb463aaecff..7a5aa985beb 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.influxdb:influxdb-java:2.25' - testImplementation "com.influxdb:influxdb-client-java:6.12.0" + testImplementation "com.influxdb:influxdb-client-java:7.3.0" } tasks.japicmp { From 69c4161a2e8cb32d7fc48f6506a417232be7ff81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:35 +0000 Subject: [PATCH 0595/1224] Bump uk.org.webcompere:system-stubs-junit4 in /modules/grafana Bumps [uk.org.webcompere:system-stubs-junit4](https://github.com/webcompere/system-stubs) from 2.1.6 to 2.1.8. - [Release notes](https://github.com/webcompere/system-stubs/releases) - [Changelog](https://github.com/webcompere/system-stubs/blob/main/History.md) - [Commits](https://github.com/webcompere/system-stubs/compare/system-stubs-parent-2.1.6...system-stubs-parent-2.1.8) --- updated-dependencies: - dependency-name: uk.org.webcompere:system-stubs-junit4 dependency-version: 2.1.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 7ab23016b14..d4dbe68355d 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -6,7 +6,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.1' - testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' + testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.51.0') testImplementation 'io.opentelemetry:opentelemetry-api' From 90aa23928ed38efea7a01bbae5d91f37173728b0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:42 +0000 Subject: [PATCH 0596/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.37.0 to 2.41.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-version: 2.41.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 89637555670..da683e0ad13 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation "org.apache.activemq:activemq-client:6.1.7" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.37.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.41.0" } From 871680fde8f8b5c5f203b759b53095a1051169f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:46 +0000 Subject: [PATCH 0597/1224] Bump org.apache.tinkerpop:gremlin-driver in /modules/orientdb Bumps [org.apache.tinkerpop:gremlin-driver](https://github.com/apache/tinkerpop) from 3.7.2 to 3.7.3. - [Changelog](https://github.com/apache/tinkerpop/blob/master/CHANGELOG.asciidoc) - [Commits](https://github.com/apache/tinkerpop/compare/3.7.2...3.7.3) --- updated-dependencies: - dependency-name: org.apache.tinkerpop:gremlin-driver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 5ed2e137a3d..587ee684b68 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -6,7 +6,7 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.42" testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.2' + testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.3' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.42" } From f2dacfbd4c71179b4ebc32b29b270fd1e605792f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 15 Jul 2025 21:41:48 +0000 Subject: [PATCH 0598/1224] Bump org.apache.solr:solr-solrj from 8.11.3 to 8.11.4 in /modules/solr Bumps org.apache.solr:solr-solrj from 8.11.3 to 8.11.4. --- updated-dependencies: - dependency-name: org.apache.solr:solr-solrj dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/solr/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index 8d9397cd299..f4ac079772d 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -5,7 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:4.12.0' - testImplementation 'org.apache.solr:solr-solrj:8.11.3' + testImplementation 'org.apache.solr:solr-solrj:8.11.4' testImplementation 'org.assertj:assertj-core:3.27.3' } From 5b321b033da74f865ec81f2fa3405c03e9e2dd52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 15 Jul 2025 19:03:25 -0600 Subject: [PATCH 0599/1224] Update com.google.cloud:libraries-bom version to 26.63.0 (#10485) --- modules/gcloud/build.gradle | 2 +- .../containers/BigtableEmulatorContainerTest.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index d1ba980fc8c..4221cbc078f 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.43.0") + testImplementation platform("com.google.cloud:libraries-bom:26.63.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java index 8a100855b3c..a532d5e70af 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java @@ -12,6 +12,7 @@ import com.google.cloud.bigtable.admin.v2.stub.EnhancedBigtableTableAdminStub; import com.google.cloud.bigtable.data.v2.BigtableDataClient; import com.google.cloud.bigtable.data.v2.BigtableDataSettings; +import com.google.cloud.bigtable.data.v2.internal.TableAdminRequestContext; import com.google.cloud.bigtable.data.v2.models.Row; import com.google.cloud.bigtable.data.v2.models.RowCell; import com.google.cloud.bigtable.data.v2.models.RowMutation; @@ -80,12 +81,14 @@ private void createTable( CredentialsProvider credentialsProvider, String tableName ) throws IOException { + TableAdminRequestContext requestContext = TableAdminRequestContext.create(PROJECT_ID, INSTANCE_ID); EnhancedBigtableTableAdminStub stub = EnhancedBigtableTableAdminStub.createEnhanced( BigtableTableAdminStubSettings .newBuilder() .setTransportChannelProvider(channelProvider) .setCredentialsProvider(credentialsProvider) - .build() + .build(), + requestContext ); try (BigtableTableAdminClient client = BigtableTableAdminClient.create(PROJECT_ID, INSTANCE_ID, stub)) { From ef4aa7e8f1bb94250c941f14dc82ee5bec74d108 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 15 Jul 2025 19:08:33 -0600 Subject: [PATCH 0600/1224] Update org.questdb:questdb version to 9.0.0 (#10486) --- modules/questdb/build.gradle | 2 +- .../org/testcontainers/junit/questdb/SimpleQuestDBTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 05d6b3bc873..7364293bbcc 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -7,7 +7,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation project(':jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.questdb:questdb:7.3.9' + testImplementation 'org.questdb:questdb:9.0.0' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } diff --git a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java index c38524018c3..16198740c0e 100644 --- a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java +++ b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java @@ -57,7 +57,7 @@ public void testRest() throws IOException { } private static void populateByInfluxLineProtocol(QuestDBContainer questdb, int rowCount) { - try (Sender sender = Sender.builder().address(questdb.getIlpUrl()).build()) { + try (Sender sender = Sender.builder(Sender.Transport.TCP).address(questdb.getIlpUrl()).build()) { for (int i = 0; i < rowCount; i++) { sender .table(TABLE_NAME) From 9efe8f3731795ab58140b841447fe70d3ccae803 Mon Sep 17 00:00:00 2001 From: ZachChuba <49295341+ZachChuba@users.noreply.github.com> Date: Tue, 15 Jul 2025 23:25:55 -0400 Subject: [PATCH 0601/1224] Update jackson, snakeyaml and docker-java versions (#10258) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update jackson version to 2.18.4 * Update docker-java version to 3.5.3 * Update snakeyaml version to 2.4 Fixes #9289 --------- Co-authored-by: Eddú Meléndez Gonzales --- core/build.gradle | 11 +++++------ modules/k3s/build.gradle | 6 ++---- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 2d3f6ff96c8..138c0548f0f 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -62,9 +62,8 @@ tasks.japicmp { configurations.all { resolutionStrategy { - // use lower Jackson version - force 'com.fasterxml.jackson.core:jackson-databind:2.8.8' - force 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.8.8' + force 'com.fasterxml.jackson.core:jackson-databind:2.18.4' + force 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.4' } } @@ -88,8 +87,8 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - api platform('com.github.docker-java:docker-java-bom:3.4.2') - shaded platform('com.github.docker-java:docker-java-bom:3.4.2') + api platform('com.github.docker-java:docker-java-bom:3.5.3') + shaded platform('com.github.docker-java:docker-java-bom:3.5.3') api "com.github.docker-java:docker-java-api" @@ -100,7 +99,7 @@ dependencies { api 'com.github.docker-java:docker-java-transport-zerodep' shaded 'com.google.guava:guava:33.3.1-jre' - shaded "org.yaml:snakeyaml:1.33" + shaded "org.yaml:snakeyaml:2.4" shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2' diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index d82683a4370..fd52f632cae 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -3,10 +3,8 @@ description = "Testcontainers :: K3S" dependencies { api project(":testcontainers") - // https://youtu.be/otCpCn0l4Wo - // The core module depends on jackson-databind 2.8.x for backward compatibility. - // Any >2.8 version here is not compatible with jackson-databind 2.8.x. - shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.8.8' + // Synchronize with the jackson version, must match major and minor version + shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' testImplementation 'io.fabric8:kubernetes-client:7.3.1' testImplementation 'io.kubernetes:client-java:24.0.0-legacy' From 8547d5b428ee4a70796dc04a736d20cb6d36494a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 15 Jul 2025 21:36:20 -0600 Subject: [PATCH 0602/1224] Allow dependabot updates for snakeyaml and commons-compress --- .github/dependabot.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fe7a57a8603..fe70c0cec98 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -16,12 +16,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.mockito:mockito-core" update-types: [ "version-update:semver-major" ] - - dependency-name: "org.yaml:snakeyaml" - update-types: [ "version-update:semver-major" ] - dependency-name: "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" update-types: [ "version-update:semver-minor", "version-update:semver-patch" ] - - dependency-name: "org.apache.commons:commons-compress" - update-types: [ "version-update:semver-minor" ] - package-ecosystem: "gradle" directory: "/" allow: From dd7362a0421275c12afed1189a9ba9adb8feb582 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:14 +0000 Subject: [PATCH 0603/1224] Bump com.squareup.okhttp3:okhttp in /modules/couchbase Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 4.12.0 to 5.1.0. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-4.12.0...parent-5.1.0) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 47b8a28b8fa..08636089467 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Couchbase" dependencies { api project(':testcontainers') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:4.12.0' + shaded 'com.squareup.okhttp3:okhttp:5.1.0' testImplementation 'com.couchbase.client:java-client:3.8.3' testImplementation 'org.awaitility:awaitility:4.3.0' From 854a5351f26c8fbc06b6356c17d34b8a75ffd3fa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:16 +0000 Subject: [PATCH 0604/1224] Bump com.databend:databend-jdbc from 0.3.9 to 0.4.0 in /modules/databend Bumps [com.databend:databend-jdbc](https://github.com/databendcloud/databend-jdbc) from 0.3.9 to 0.4.0. - [Release notes](https://github.com/databendcloud/databend-jdbc/releases) - [Commits](https://github.com/databendcloud/databend-jdbc/compare/v0.3.9...v0.4.0) --- updated-dependencies: - dependency-name: com.databend:databend-jdbc dependency-version: 0.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 8eac99519c4..392c2b51eb0 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':jdbc') testImplementation project(':jdbc-test') - testRuntimeOnly 'com.databend:databend-jdbc:0.3.9' + testRuntimeOnly 'com.databend:databend-jdbc:0.4.0' testImplementation 'org.assertj:assertj-core:3.27.3' } From 457e94d3da5252cf769e4aae78e695840df09109 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:30 +0000 Subject: [PATCH 0605/1224] Bump com.squareup.okhttp3:okhttp from 4.12.0 to 5.1.0 in /modules/azure Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 4.12.0 to 5.1.0. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-4.12.0...parent-5.1.0) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index d3baf572321..b0878d7e0d8 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':mssqlserver') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:4.12.0' + shaded 'com.squareup.okhttp3:okhttp:5.1.0' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation platform("com.azure:azure-sdk-bom:1.2.32") From 91d27f3e27c43059584036332f550517b5d26be9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:48 +0000 Subject: [PATCH 0606/1224] Bump org.junit.platform:junit-platform-launcher in /modules/hivemq Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.10.3 to 1.13.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-version: 1.13.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 898f0ba5639..e2373eb1e7b 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -12,7 +12,7 @@ dependencies { shaded("net.lingala.zip4j:zip4j:2.11.5") testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.41.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") From 5ba6c8c2eb8ef6965fc1c4aaed2b062882fbd942 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:49 +0000 Subject: [PATCH 0607/1224] Bump org.junit.platform:junit-platform-launcher Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.10.3 to 1.13.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-version: 1.13.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 99ac3119075..3ff102a8ece 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } From aec04511f817474ba9270ceab9e5b1eeb9b8f94b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:50 +0000 Subject: [PATCH 0608/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.15.1 to 1.15.2. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.15.1...v1.15.2) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.15.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index d4dbe68355d..82efbf7f824 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.rest-assured:rest-assured:5.5.5' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.1' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.2' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.51.0') From 7a13a2ee246605f863f67615b238c1eeaee94bb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:53 +0000 Subject: [PATCH 0609/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.51.0 to 1.52.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.51.0...v1.52.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.52.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index d4dbe68355d..0f88bf3e13f 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.1' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.51.0') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.52.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From e53019483763a59ecd7c53f8a8a84989250bbd4b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:55 +0000 Subject: [PATCH 0610/1224] Bump org.apache.commons:commons-lang3 in /modules/jdbc-test Bumps org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 507313e9ad2..1e44b84947a 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -2,7 +2,7 @@ dependencies { api project(':jdbc') api 'com.google.guava:guava:33.4.8-jre' - api 'org.apache.commons:commons-lang3:3.17.0' + api 'org.apache.commons:commons-lang3:3.18.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From b6b0bed9902e1a211293b867e1f4ab46d9937f7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:37:55 +0000 Subject: [PATCH 0611/1224] Bump io.milvus:milvus-sdk-java from 2.6.0 to 2.6.1 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.6.0 to 2.6.1. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.6.0...v2.6.1) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-version: 2.6.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index bb7167babfa..b79edac49aa 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.milvus:milvus-sdk-java:2.6.0' + testImplementation 'io.milvus:milvus-sdk-java:2.6.1' } From 98e6b6e7d8728bb044fc90ad6ce09fa0ab04c52d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:38:01 +0000 Subject: [PATCH 0612/1224] Bump software.amazon.awssdk:s3 in /modules/localstack Bumps software.amazon.awssdk:s3 from 2.31.77 to 2.32.0. --- updated-dependencies: - dependency-name: software.amazon.awssdk:s3 dependency-version: 2.32.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 f104d08e63c..5d2fe749f7e 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-logs' testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.31.77' + testImplementation 'software.amazon.awssdk:s3:2.32.0' testImplementation 'org.assertj:assertj-core:3.27.3' } From 4018cffa9435f82138bc4d93fbed6ead97f6c1bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:43:23 +0000 Subject: [PATCH 0613/1224] Bump dev.openfga:openfga-sdk from 0.8.2 to 0.8.3 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.8.2 to 0.8.3. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.8.2...v0.8.3) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-version: 0.8.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 45f4cf1244c..14d7179f7df 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'dev.openfga:openfga-sdk:0.8.2' + testImplementation 'dev.openfga:openfga-sdk:0.8.3' } test { From 141dbadbc2894245748e7a4e5b66fe3be37cf229 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:47:26 +0000 Subject: [PATCH 0614/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.31.77 to 2.32.0. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.32.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index 4136702010d..cdd7526dc62 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.scylladb:java-driver-core:4.19.0.1' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'software.amazon.awssdk:dynamodb:2.31.77' + testImplementation 'software.amazon.awssdk:dynamodb:2.32.0' } From 41d526d42616fb8a44b2a6753941b6f79e3db984 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:48:17 +0000 Subject: [PATCH 0615/1224] Bump com.squareup.okhttp3:okhttp from 4.12.0 to 5.1.0 in /modules/solr Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 4.12.0 to 5.1.0. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-4.12.0...parent-5.1.0) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/solr/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index f4ac079772d..d2cdc0083eb 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Solr" dependencies { api project(':testcontainers') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:4.12.0' + shaded 'com.squareup.okhttp3:okhttp:5.1.0' testImplementation 'org.apache.solr:solr-solrj:8.11.4' testImplementation 'org.assertj:assertj-core:3.27.3' From e1e743aa9a144cbd7e0ab2f8b67b997f582d74d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:49:37 +0000 Subject: [PATCH 0616/1224] Bump ch.qos.logback:logback-classic from 1.3.14 to 1.3.15 in /smoke-test Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.3.14 to 1.3.15. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.14...v_1.3.15) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.3.15 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- smoke-test/turbo-mode/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index 488f005147d..825d240ddf1 100644 --- a/build.gradle +++ b/build.gradle @@ -132,7 +132,7 @@ subprojects { } dependencies { - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' } checkstyle { diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index 2f6cf78a6ce..9bc4c158c45 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -7,7 +7,7 @@ dependencies { api "io.lettuce:lettuce-core:6.4.0.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(":spock") - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' } test { diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index 1408842ee00..0e67df25a20 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -5,7 +5,7 @@ plugins { dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' } From 0f32b1392cbde766abf7c938c1757073b7386cbf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:49:46 +0000 Subject: [PATCH 0617/1224] Bump org.slf4j:slf4j-api from 2.0.16 to 2.0.17 in /smoke-test Bumps org.slf4j:slf4j-api from 2.0.16 to 2.0.17. --- updated-dependencies: - dependency-name: org.slf4j:slf4j-api dependency-version: 2.0.17 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- test-support/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-support/build.gradle b/test-support/build.gradle index 5c39ac72ac9..344366da1eb 100644 --- a/test-support/build.gradle +++ b/test-support/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation 'junit:junit:4.13.2' - implementation 'org.slf4j:slf4j-api:2.0.16' + implementation 'org.slf4j:slf4j-api:2.0.17' testImplementation 'org.assertj:assertj-core:3.27.3' } From 1c7e5ad33efffeec510cada11b1b89f50c398c40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 03:50:35 +0000 Subject: [PATCH 0618/1224] Bump org.junit:junit-bom from 5.10.3 to 5.13.3 in /examples Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.10.3 to 5.13.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.10.3...r5.13.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 530cf60616c..1be708da810 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -12,7 +12,7 @@ dependencies { implementation 'org.seleniumhq.selenium:selenium-firefox-driver' implementation 'org.seleniumhq.selenium:selenium-chrome-driver' - testImplementation platform('org.junit:junit-bom:5.10.3') + testImplementation platform('org.junit:junit-bom:5.13.3') testImplementation 'org.junit.platform:junit-platform-suite' testImplementation platform('io.cucumber:cucumber-bom:7.23.0') testImplementation 'io.cucumber:cucumber-java' From fbbc5933723016fcc830feb426d9b1da51e59c48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:57:21 +0000 Subject: [PATCH 0619/1224] Bump org.apache.commons:commons-lang3 in /modules/hivemq Bumps org.apache.commons:commons-lang3 from 3.17.0 to 3.18.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.18.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index e2373eb1e7b..019f8f5f1e3 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -4,7 +4,7 @@ dependencies { api(project(":testcontainers")) api("org.jetbrains:annotations:26.0.2") - shaded("org.apache.commons:commons-lang3:3.17.0") + shaded("org.apache.commons:commons-lang3:3.18.0") shaded("commons-io:commons-io:2.19.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") From 13c802c5813576503febd865bae4b9069fcc8fdc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 16 Jul 2025 11:21:46 -0600 Subject: [PATCH 0620/1224] Restore JibTest (#10520) --- core/src/test/java/org/testcontainers/containers/JibTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/JibTest.java b/core/src/test/java/org/testcontainers/containers/JibTest.java index d784b08f2a8..1441ff00120 100644 --- a/core/src/test/java/org/testcontainers/containers/JibTest.java +++ b/core/src/test/java/org/testcontainers/containers/JibTest.java @@ -1,7 +1,6 @@ package org.testcontainers.containers; import com.github.dockerjava.api.command.InspectImageResponse; -import org.junit.Ignore; import org.junit.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.output.OutputFrame.OutputType; @@ -13,7 +12,6 @@ import static org.assertj.core.api.Assertions.assertThat; -@Ignore("Jib doesn't work with latest Docker version provided by GH Actions. Jib should be updated") public class JibTest { @Test From fd1b08204556959e1f14a90cc5bc6aa8549daab7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 16 Jul 2025 11:54:46 -0600 Subject: [PATCH 0621/1224] Fix testMetaInf --- .../java/org/testcontainers/JarFileShadingTest.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java b/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java index 6477e4b7625..6b9ebc32efc 100644 --- a/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java +++ b/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java @@ -21,7 +21,15 @@ public void testPackages() throws Exception { @Test public void testMetaInf() throws Exception { assertThatFileList(root.resolve("META-INF")) - .containsOnly("MANIFEST.MF", "services", "versions", "native-image"); + .containsOnly( + "MANIFEST.MF", + "services", + "versions", + "native-image", + "thirdparty-LICENSE", + "FastDoubleParser-NOTICE", + "FastDoubleParser-LICENSE" + ); } @Test From 29822555efe388a40d0892e47381b5798c8bea8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:58:23 +0000 Subject: [PATCH 0622/1224] Bump io.lettuce:lettuce-core in /examples Bumps [io.lettuce:lettuce-core](https://github.com/redis/lettuce) from 6.4.0.RELEASE to 6.7.1.RELEASE. - [Release notes](https://github.com/redis/lettuce/releases) - [Changelog](https://github.com/redis/lettuce/blob/6.7.1.RELEASE/RELEASE-NOTES.md) - [Commits](https://github.com/redis/lettuce/compare/6.4.0.RELEASE...6.7.1.RELEASE) --- updated-dependencies: - dependency-name: io.lettuce:lettuce-core dependency-version: 6.7.1.RELEASE dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index f2e492fa7df..08bcb4d0580 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.4.0.RELEASE" + api "io.lettuce:lettuce-core:6.7.1.RELEASE" testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 4419bc3216b..c0c7a3c2054 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.4.0.RELEASE" + api "io.lettuce:lettuce-core:6.7.1.RELEASE" testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.3' diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index 2f6cf78a6ce..0d786f0363c 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - api "io.lettuce:lettuce-core:6.4.0.RELEASE" + api "io.lettuce:lettuce-core:6.7.1.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(":spock") testImplementation 'ch.qos.logback:logback-classic:1.3.14' From 2a4181fb6aeaada91999faf02efc8d63b4c162a6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:59:00 +0000 Subject: [PATCH 0623/1224] Bump io.nats:jnats from 2.20.2 to 2.21.4 in /examples Bumps [io.nats:jnats](https://github.com/nats-io/nats.java) from 2.20.2 to 2.21.4. - [Release notes](https://github.com/nats-io/nats.java/releases) - [Changelog](https://github.com/nats-io/nats.java/blob/main/CHANGELOG.md) - [Commits](https://github.com/nats-io/nats.java/compare/2.20.2...2.21.4) --- updated-dependencies: - dependency-name: io.nats:jnats dependency-version: 2.21.4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/nats/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 21b0baa3a3a..705fd41e04f 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'io.nats:jnats:2.20.2' + testImplementation 'io.nats:jnats:2.21.4' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' From b26bacaaaa0e93edda9048fc0e2a9a9ed1d83cf2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:59:02 +0000 Subject: [PATCH 0624/1224] Bump org.seleniumhq.selenium:selenium-bom in /examples Bumps [org.seleniumhq.selenium:selenium-bom](https://github.com/SeleniumHQ/selenium) from 4.25.0 to 4.34.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.25.0...selenium-4.34.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-bom dependency-version: 4.34.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 1be708da810..0e73bac9195 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - implementation platform('org.seleniumhq.selenium:selenium-bom:4.25.0') + implementation platform('org.seleniumhq.selenium:selenium-bom:4.34.0') implementation 'org.seleniumhq.selenium:selenium-remote-driver' implementation 'org.seleniumhq.selenium:selenium-firefox-driver' implementation 'org.seleniumhq.selenium:selenium-chrome-driver' From da2f61a10a854a137f18f50a5e7f41afa709b5df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 18:59:43 +0000 Subject: [PATCH 0625/1224] Bump org.neo4j.driver:neo4j-java-driver in /examples Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.18 to 4.4.20. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.18...4.4.20) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-version: 4.4.20 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/neo4j-container/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 7f85f5162a1..0bede32a835 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.18' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' From ac454368adc7a4b44fc13443f62b3286b703be53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Jul 2025 19:00:00 +0000 Subject: [PATCH 0626/1224] Bump org.projectlombok:lombok from 1.18.34 to 1.18.38 in /examples Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.34 to 1.18.38. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.34...v1.18.38) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-version: 1.18.38 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 4 ++-- examples/solr-container/build.gradle | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 2efabca33a3..ce4c44041fa 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -7,8 +7,8 @@ repositories { } dependencies { - testCompileOnly "org.projectlombok:lombok:1.18.34" - testAnnotationProcessor "org.projectlombok:lombok:1.18.34" + testCompileOnly "org.projectlombok:lombok:1.18.38" + testAnnotationProcessor "org.projectlombok:lombok:1.18.38" testImplementation 'org.testcontainers:kafka' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.26.3' diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 58c380676d2..75ddcd62d67 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -7,8 +7,8 @@ repositories { } dependencies { - compileOnly "org.projectlombok:lombok:1.18.34" - annotationProcessor "org.projectlombok:lombok:1.18.34" + compileOnly "org.projectlombok:lombok:1.18.38" + annotationProcessor "org.projectlombok:lombok:1.18.38" implementation 'org.apache.solr:solr-solrj:8.11.4' From 35577878c7f0a5e308c74377c5e3fecb1f40adc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 17 Jul 2025 10:13:24 -0600 Subject: [PATCH 0627/1224] Remove junit-toolbox dependency (#10522) --- modules/jdbc-test/build.gradle | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle index 1e44b84947a..1051af04383 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -6,8 +6,6 @@ dependencies { api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' - api 'com.googlecode.junit-toolbox:junit-toolbox:2.4' - api 'org.assertj:assertj-core:3.27.3' api 'org.apache.tomcat:tomcat-jdbc:11.0.9' From 8d37207cff74a63b17a9de4a031d3017a3891a16 Mon Sep 17 00:00:00 2001 From: julianladisch Date: Fri, 18 Jul 2025 07:08:41 +0200 Subject: [PATCH 0628/1224] Move from com.jcraft:jsch to com.github.mwiede:jsch (#10275) Upgrade testImplementation dependency from `com.jcraft:jsch:0.1.55` to `com.github.mwiede:jsch:2.27.0` --- examples/sftp/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index fbb5f6cbe40..53515e58b0a 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'com.jcraft:jsch:0.1.55' + testImplementation 'com.github.mwiede:jsch:2.27.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From e36c9e773c757d318f09d25807640cfa32e47333 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 18 Jul 2025 00:11:13 -0600 Subject: [PATCH 0629/1224] Use rest-assured in mockserver module (#10523) --- modules/mockserver/build.gradle | 1 + .../MockServerContainerRuleTest.java | 5 ++- .../containers/MockServerContainerTest.java | 35 ++++++++++++++-- .../containers/SimpleHttpClient.java | 41 ------------------- 4 files changed, 37 insertions(+), 45 deletions(-) delete mode 100644 modules/mockserver/src/test/java/org/testcontainers/containers/SimpleHttpClient.java diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index a41957cf57a..054944d2eb8 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -5,6 +5,7 @@ dependencies { testImplementation 'org.mock-server:mockserver-client-java:5.15.0' testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'io.rest-assured:rest-assured:5.5.5' } tasks.japicmp { diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java index eaf240f0fe2..066b86b05fd 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java @@ -5,6 +5,7 @@ import org.mockserver.client.MockServerClient; import org.testcontainers.utility.DockerImageName; +import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; @@ -33,7 +34,9 @@ public void shouldReturnExpectation() throws Exception { // ...a GET request to '/person?name=peter' returns "Peter the person!" - assertThat(SimpleHttpClient.responseFromMockserver(mockServer, "/person?name=peter")) + assertThat( + given().baseUri(mockServer.getEndpoint()).get("/person?name=peter").then().extract().body().asString() + ) .as("Expectation returns expected response body") .contains("Peter the person"); } 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 3f4a8fef293..a06ea3e7e63 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java @@ -1,9 +1,16 @@ package org.testcontainers.containers; +import io.restassured.config.RestAssuredConfig; +import io.restassured.config.SSLConfig; +import org.apache.http.conn.ssl.SSLSocketFactory; import org.junit.Test; import org.mockserver.client.MockServerClient; +import org.mockserver.configuration.Configuration; +import org.mockserver.logging.MockServerLogger; +import org.mockserver.socket.tls.KeyStoreFactory; import org.testcontainers.utility.DockerImageName; +import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; @@ -26,7 +33,7 @@ public void shouldCallActualMockserverVersion() throws Exception { client.when(request().withPath("/hello")).respond(response().withBody(expectedBody)); - assertThat(SimpleHttpClient.responseFromMockserver(mockServer, "/hello")) + assertThat(given().when().get(mockServer.getEndpoint() + "/hello").then().extract().body().asString()) .as("MockServer returns correct result") .isEqualTo(expectedBody); } @@ -48,7 +55,7 @@ public void shouldCallMockserverUsingTlsProtocol() throws Exception { client.when(request().withPath("/hello")).respond(response().withBody(expectedBody)); - assertThat(SimpleHttpClient.secureResponseFromMockserver(mockServer, "/hello")) + assertThat(secureResponseFromMockserver(mockServer)) .as("MockServer returns correct result") .isEqualTo(expectedBody); } @@ -73,7 +80,7 @@ public void shouldCallMockserverUsingMutualTlsProtocol() throws Exception { client.when(request().withPath("/hello")).respond(response().withBody(expectedBody)); - assertThat(SimpleHttpClient.secureResponseFromMockserver(mockServer, "/hello")) + assertThat(secureResponseFromMockserver(mockServer)) .as("MockServer returns correct result") .isEqualTo(expectedBody); } @@ -86,4 +93,26 @@ public void newVersionStartsWithDefaultWaitStrategy() { mockServer.start(); } } + + private static String secureResponseFromMockserver(MockServerContainer mockServer) { + return given() + .config( + RestAssuredConfig + .config() + .sslConfig( + SSLConfig + .sslConfig() + .sslSocketFactory( + new SSLSocketFactory( + new KeyStoreFactory(Configuration.configuration(), new MockServerLogger()) + .sslContext() + ) + ) + ) + ) + .baseUri(mockServer.getSecureEndpoint()) + .get("/hello") + .body() + .asString(); + } } diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/SimpleHttpClient.java b/modules/mockserver/src/test/java/org/testcontainers/containers/SimpleHttpClient.java deleted file mode 100644 index 6c7e75c4622..00000000000 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/SimpleHttpClient.java +++ /dev/null @@ -1,41 +0,0 @@ -package org.testcontainers.containers; - -import lombok.Cleanup; -import org.mockserver.configuration.Configuration; -import org.mockserver.logging.MockServerLogger; -import org.mockserver.socket.tls.KeyStoreFactory; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; - -import javax.net.ssl.HttpsURLConnection; - -public class SimpleHttpClient { - - public static String responseFromMockserver(MockServerContainer mockServer, String path) throws IOException { - URLConnection urlConnection = new URL(mockServer.getEndpoint() + path).openConnection(); - @Cleanup - BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream())); - return reader.readLine(); - } - - public static String secureResponseFromMockserver(MockServerContainer mockServer, String path) throws IOException { - HttpsURLConnection httpUrlConnection = (HttpsURLConnection) new URL(mockServer.getSecureEndpoint() + path) - .openConnection(); - try { - httpUrlConnection.setSSLSocketFactory( - new KeyStoreFactory(Configuration.configuration(), new MockServerLogger()) - .sslContext() - .getSocketFactory() - ); - @Cleanup - BufferedReader reader = new BufferedReader(new InputStreamReader(httpUrlConnection.getInputStream())); - return reader.readLine(); - } finally { - httpUrlConnection.disconnect(); - } - } -} From 048c6fa60dffc4b06beff71592877480759fd1f3 Mon Sep 17 00:00:00 2001 From: Ling Hengqian Date: Tue, 29 Jul 2025 03:09:42 +0800 Subject: [PATCH 0630/1224] Implement `AutoCloseable` for `TestcontainersExtension$StoreAdapter` (#10529) Fixes #10525 --- .../testcontainers/junit/jupiter/TestcontainersExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java b/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java index 6d482f8aab7..89adba6033f 100644 --- a/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java +++ b/modules/junit-jupiter/src/main/java/org/testcontainers/junit/jupiter/TestcontainersExtension.java @@ -260,7 +260,7 @@ private static StoreAdapter getContainerInstance(final Object testInstance, fina * thereby letting the JUnit automatically stop containers once the current * {@link ExtensionContext} is closed. */ - private static class StoreAdapter implements CloseableResource { + private static class StoreAdapter implements CloseableResource, AutoCloseable { @Getter private String key; From 00a813390be988ddfc509bd04a48cfe1d547d9fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 28 Jul 2025 16:50:19 -0500 Subject: [PATCH 0631/1224] Clean up dependabot.yml --- .github/dependabot.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index fe70c0cec98..b42e02fe2b6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -161,9 +161,6 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 - ignore: - - dependency-name: "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml" - update-types: [ "version-update:semver-minor", "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/kafka" schedule: From df8c3915af1fcf64b5a460f91695a2122ee12fd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:34:24 +0000 Subject: [PATCH 0632/1224] Bump org.junit:junit-bom from 5.13.3 to 5.13.4 in /examples Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 0e73bac9195..c0e916c652c 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -12,7 +12,7 @@ dependencies { implementation 'org.seleniumhq.selenium:selenium-firefox-driver' implementation 'org.seleniumhq.selenium:selenium-chrome-driver' - testImplementation platform('org.junit:junit-bom:5.13.3') + testImplementation platform('org.junit:junit-bom:5.13.4') testImplementation 'org.junit.platform:junit-platform-suite' testImplementation platform('io.cucumber:cucumber-bom:7.23.0') testImplementation 'io.cucumber:cucumber-java' From 8daef1c8ecb8527290eb186567edec0e0acfa112 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:37:08 +0000 Subject: [PATCH 0633/1224] Bump com.rabbitmq:amqp-client from 5.25.0 to 5.26.0 in /core Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.25.0 to 5.26.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.25.0...v5.26.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-version: 5.26.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 138c0548f0f..6fd325f78c0 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -110,7 +110,7 @@ dependencies { } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'redis.clients:jedis:6.0.0' - testImplementation 'com.rabbitmq:amqp-client:5.25.0' + testImplementation 'com.rabbitmq:amqp-client:5.26.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From e7a5b50e96c34c73423c1dc7edd3e14c4d400474 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:44:07 +0000 Subject: [PATCH 0634/1224] Bump com.rabbitmq:amqp-client from 5.25.0 to 5.26.0 in /modules/rabbitmq Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.25.0 to 5.26.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.25.0...v5.26.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-version: 5.26.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 3137ec7f7e1..0b6d8f90487 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testImplementation 'com.rabbitmq:amqp-client:5.25.0' + testImplementation 'com.rabbitmq:amqp-client:5.26.0' testImplementation 'org.assertj:assertj-core:3.27.3' compileOnly 'org.jetbrains:annotations:26.0.2' } From fa6dcfe80429ccc5bb62ee109e8b9cbb8a2933b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:44:44 +0000 Subject: [PATCH 0635/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.32.0 to 2.32.9. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.32.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index cdd7526dc62..f531ef94eaf 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.scylladb:java-driver-core:4.19.0.1' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'software.amazon.awssdk:dynamodb:2.32.0' + testImplementation 'software.amazon.awssdk:dynamodb:2.32.9' } From e1d76cf532dc4d1a983c55cb1b8752e67caa2b48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:47:18 +0000 Subject: [PATCH 0636/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.1.0.jre8-preview to 13.1.1.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.1.1.jre8-preview dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 899bbcc88db..c1174c84b15 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' testImplementation project(':jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.0.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.1.jre8-preview' testImplementation project(':r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' From b65a2e83393a43c838e63e5adb4f7be6f3470c97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:47:20 +0000 Subject: [PATCH 0637/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.0.3 to 9.0.4. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.0.3...v9.0.4) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.0.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 0370bab602f..5425bf784d0 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.0.3" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.0.4" testImplementation "org.elasticsearch.client:transport:7.17.29" testImplementation 'org.assertj:assertj-core:3.27.3' } From 97b1b199a1a027dbbb79acef31cc6474e57d3677 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:47:25 +0000 Subject: [PATCH 0638/1224] Bump org.junit.jupiter:junit-jupiter in /modules/hivemq Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 019f8f5f1e3..5bebeacdc0b 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -11,7 +11,7 @@ dependencies { shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") shaded("net.lingala.zip4j:zip4j:2.11.5") - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.41.0") From 27888788ea896bc50d6abebb760f9e64fcd5c87c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:48:05 +0000 Subject: [PATCH 0639/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps com.solacesystems:sol-jcsmp from 10.27.2 to 10.27.3. --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-version: 10.27.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index aae6c28eefd..d9e5c17e94e 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -6,7 +6,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'com.solacesystems:sol-jcsmp:10.27.2' + testImplementation 'com.solacesystems:sol-jcsmp:10.27.3' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From bf57d659d161a0c6ab8940f8c99c81e1b96e067a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:50:17 +0000 Subject: [PATCH 0640/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/azure Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.1.0.jre8-preview to 13.1.1.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.1.1.jre8-preview dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index b0878d7e0d8..18cf96527b3 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -14,5 +14,5 @@ dependencies { testImplementation 'com.azure:azure-data-tables' testImplementation 'com.azure:azure-messaging-eventhubs' testImplementation 'com.azure:azure-messaging-servicebus' - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.0.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.1.jre8-preview' } From 82b0888fa2f84707fad7a4f68189f8762482b08c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:51:16 +0000 Subject: [PATCH 0641/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.63.0 to 26.64.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Changelog](https://github.com/googleapis/java-cloud-bom/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.63.0...v26.64.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.64.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 4221cbc078f..73783e22089 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.63.0") + testImplementation platform("com.google.cloud:libraries-bom:26.64.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From 0eb868fb106d33e55a7d6205f7075c8955ce6ce9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 22:52:06 +0000 Subject: [PATCH 0642/1224] Bump org.junit.platform:junit-platform-launcher in /modules/hivemq Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.13.3 to 1.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-version: 1.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 019f8f5f1e3..59d8153c9cf 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -12,7 +12,7 @@ dependencies { shaded("net.lingala.zip4j:zip4j:2.11.5") testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' testImplementation(project(":junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.41.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") From e4abbf44e6864b0606ba4bec9c76314ca1a13222 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 23:00:51 +0000 Subject: [PATCH 0643/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.41.0 to 2.42.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-version: 2.42.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index da683e0ad13..34217bf1f1a 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation "org.apache.activemq:activemq-client:6.1.7" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.41.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.42.0" } From 1413e442fa7e1d8feb11fdd1dbdb8175eb57f9d0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 23:04:57 +0000 Subject: [PATCH 0644/1224] Bump io.rest-assured:rest-assured from 5.5.0 to 5.5.5 in /examples Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.0 to 5.5.5. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.0...rest-assured-5.5.5) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/ollama-hugging-face/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 4bfe199e62b..3e18514afec 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' - testImplementation 'io.rest-assured:rest-assured:5.5.0' + testImplementation 'io.rest-assured:rest-assured:5.5.5' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } From b39944758634af3ea72f83bb6b23f078c2939a4c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 28 Jul 2025 23:13:28 +0000 Subject: [PATCH 0645/1224] Bump org.junit.jupiter:junit-jupiter-params in /examples Bumps [org.junit.jupiter:junit-jupiter-params](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit5/redis/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index c0c7a3c2054..60e78fc589d 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,9 +3,9 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.7.1.RELEASE" - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.3' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.3' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":junit-jupiter") From 84138c0fd1deccf4c6f06088d8d84b92c3a8baee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 28 Jul 2025 21:03:38 -0500 Subject: [PATCH 0646/1224] Use junit-bom in spock module --- modules/spock/build.gradle | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle index 7a5c6e0e0fc..4e013aa65a9 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -17,8 +17,9 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' - testRuntimeOnly 'org.junit.platform:junit-platform-testkit:1.13.3' + testRuntimeOnly platform('org.junit:junit-bom:5.13.3') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + testRuntimeOnly 'org.junit.platform:junit-platform-testkit' testCompileOnly 'org.jetbrains:annotations:26.0.2' } From 78aa5f4603124b4da13ebcc2994fda6b0166998c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 02:18:56 +0000 Subject: [PATCH 0647/1224] Bump com.zaxxer:HikariCP from 6.3.0 to 7.0.0 in /modules/spock Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 6.3.0 to 7.0.0. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-6.3.0...HikariCP-7.0.0) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 4e013aa65a9..9cf47997203 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') - testImplementation 'com.zaxxer:HikariCP:6.3.0' + testImplementation 'com.zaxxer:HikariCP:7.0.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.7' From f1c5822fd87a6b4152bc093f31d2b5646ad4613f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 02:37:14 +0000 Subject: [PATCH 0648/1224] Bump com.github.mwiede:jsch from 2.27.0 to 2.27.2 in /examples Bumps [com.github.mwiede:jsch](https://github.com/mwiede/jsch) from 2.27.0 to 2.27.2. - [Release notes](https://github.com/mwiede/jsch/releases) - [Changelog](https://github.com/mwiede/jsch/blob/master/ChangeLog) - [Commits](https://github.com/mwiede/jsch/compare/jsch-2.27.0...jsch-2.27.2) --- updated-dependencies: - dependency-name: com.github.mwiede:jsch dependency-version: 2.27.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/sftp/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 53515e58b0a..a0b615e8226 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'com.github.mwiede:jsch:2.27.0' + testImplementation 'com.github.mwiede:jsch:2.27.2' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.14' From 98ab332325bf745d968ccba7d885d0ca7e3cc70d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 02:38:10 +0000 Subject: [PATCH 0649/1224] Bump com.google.code.gson:gson from 2.11.0 to 2.13.1 in /examples Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.11.0 to 2.13.1. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.11.0...gson-parent-2.13.1) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-version: 2.13.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 3fda7078fa4..e94529d507d 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'redis.clients:jedis:6.0.0' - implementation 'com.google.code.gson:gson:2.11.0' + implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'ch.qos.logback:logback-classic:1.3.14' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 26dd05f170d..dd2c73ed1b7 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'redis.clients:jedis:6.0.0' - implementation 'com.google.code.gson:gson:2.11.0' + implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index fecaa3d0499..4e264fd2d2a 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation 'redis.clients:jedis:6.0.0' - implementation 'com.google.code.gson:gson:2.11.0' + implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From c883515a2f603052b9ddfd5ac735f562d0d3111f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 02:38:19 +0000 Subject: [PATCH 0650/1224] Bump ch.qos.logback:logback-classic from 1.3.14 to 1.3.15 in /examples Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.3.14 to 1.3.15. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.14...v_1.3.15) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.3.15 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 0a33949201e..fcbc30049ee 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'com.hazelcast:hazelcast:5.3.8' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index ee39cf51865..55abe166f88 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index ce4c44041fa..fbb098c72a5 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'org.awaitility:awaitility:4.2.2' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 705fd41e04f..90f0643a7bc 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.testcontainers:testcontainers' testImplementation 'io.nats:jnats:2.21.4' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 4bfe199e62b..d1bb5ddbaa2 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.testcontainers:ollama' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testImplementation 'io.rest-assured:rest-assured:5.5.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 3fda7078fa4..09093e808ef 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -12,7 +12,7 @@ dependencies { implementation 'com.google.code.gson:gson:2.11.0' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testng:testng:7.5.1' testImplementation 'org.assertj:assertj-core:3.26.3' } diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 26dd05f170d..c2628599388 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.26.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 53515e58b0a..8ee6c68a473 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'com.github.mwiede:jsch:2.27.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index fecaa3d0499..d0a9846b576 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index 835280cdfc0..a9f41e76c07 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.apache.curator:curator-framework:5.8.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'ch.qos.logback:logback-classic:1.3.14' + testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } From 2c579eae54f74bd249cabcc50ebf223e042b5ac0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 29 Jul 2025 02:39:32 +0000 Subject: [PATCH 0651/1224] Bump commons-io:commons-io from 2.19.0 to 2.20.0 in /modules/hivemq Bumps [commons-io:commons-io](https://github.com/apache/commons-io) from 2.19.0 to 2.20.0. - [Changelog](https://github.com/apache/commons-io/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-io/compare/rel/commons-io-2.19.0...rel/commons-io-2.20.0) --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 98011ef3dbd..5c1f6b7c8e3 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -5,7 +5,7 @@ dependencies { api("org.jetbrains:annotations:26.0.2") shaded("org.apache.commons:commons-lang3:3.18.0") - shaded("commons-io:commons-io:2.19.0") + shaded("commons-io:commons-io:2.20.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") From 2a013c6fa5a519f4a5d307e9ec6e0177465b1933 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:12:20 +0000 Subject: [PATCH 0652/1224] Bump org.questdb:questdb from 9.0.0 to 9.0.1 in /modules/questdb Bumps [org.questdb:questdb](https://github.com/questdb/questdb) from 9.0.0 to 9.0.1. - [Release notes](https://github.com/questdb/questdb/releases) - [Commits](https://github.com/questdb/questdb/compare/9.0.0...9.0.1) --- updated-dependencies: - dependency-name: org.questdb:questdb dependency-version: 9.0.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 7364293bbcc..66355d19d61 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -7,7 +7,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation project(':jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.questdb:questdb:9.0.0' + testImplementation 'org.questdb:questdb:9.0.1' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } From dd523ed0483bc7fc37212b01fe2bd1024ee69296 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:13:04 +0000 Subject: [PATCH 0653/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-xe Bumps com.oracle.database.jdbc:ojdbc11 from 23.8.0.25.04 to 23.9.0.25.07. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.9.0.25.07 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index ff04ca864d1..012ba002e49 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.8.0.25.04' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' compileOnly 'org.jetbrains:annotations:26.0.2' From e8479f5b1b79f0330c6562ca880c5b75b75ee2b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:15:38 +0000 Subject: [PATCH 0654/1224] Bump org.junit:junit-bom from 5.13.3 to 5.13.4 in /modules/spock Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 9cf47997203..0e361b5c793 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -17,7 +17,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testRuntimeOnly platform('org.junit:junit-bom:5.13.3') + testRuntimeOnly platform('org.junit:junit-bom:5.13.4') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' From d7bf143395bab0a0fcca97f6e0fb35e62781a67e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:15:42 +0000 Subject: [PATCH 0655/1224] Bump software.amazon.awssdk:s3 in /modules/localstack Bumps software.amazon.awssdk:s3 from 2.32.0 to 2.32.14. --- updated-dependencies: - dependency-name: software.amazon.awssdk:s3 dependency-version: 2.32.14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 5d2fe749f7e..cddaeeaf432 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation 'com.amazonaws:aws-java-sdk-logs' testImplementation 'com.amazonaws:aws-java-sdk-lambda' testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.32.0' + testImplementation 'software.amazon.awssdk:s3:2.32.14' testImplementation 'org.assertj:assertj-core:3.27.3' } From 535745db56d6d13dc1f42842e7d13a9713b62be3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:16:41 +0000 Subject: [PATCH 0656/1224] Bump org.junit.jupiter:junit-jupiter from 5.13.3 to 5.13.4 in /examples Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index fcbc30049ee..0b2d1a2ddd7 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 55abe166f88..80c4f962bf2 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index fbb098c72a5..a5be0be25ac 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.awaitility:awaitility:4.2.2' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 90f0643a7bc..3d90b1b1912 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation 'io.nats:jnats:2.21.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 0bede32a835..c4305469e36 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -11,6 +11,6 @@ dependencies { testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index aae4e4353bc..440d6d4a773 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:ollama' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index a67d83de4e3..f77102ac307 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.26.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 3a07bc675c4..b02e0a4728b 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 05a344a845f..a732fd284f4 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 75ddcd62d67..cd087543cda 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' testImplementation 'org.assertj:assertj-core:3.26.3' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index a9f41e76c07..8f81d89334e 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } From e05532d48b8afe36a6d35540cca65f171e944f1e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:21:51 +0000 Subject: [PATCH 0657/1224] Bump io.qdrant:client from 1.14.1 to 1.15.0 in /modules/qdrant Bumps [io.qdrant:client](https://github.com/qdrant/java-client) from 1.14.1 to 1.15.0. - [Release notes](https://github.com/qdrant/java-client/releases) - [Commits](https://github.com/qdrant/java-client/compare/v1.14.1...v1.15.0) --- updated-dependencies: - dependency-name: io.qdrant:client dependency-version: 1.15.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 479928a5e0e..470004c16ec 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.qdrant:client:1.14.1' + testImplementation 'io.qdrant:client:1.15.0' testImplementation platform('io.grpc:grpc-bom:1.73.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' From f3f53b329fdf2e1caedd7fb1bd07bbd1aa0b1fcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:22:20 +0000 Subject: [PATCH 0658/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.0.4 to 9.1.0. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.0.4...v9.1.0) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 5425bf784d0..5dea480e20b 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.0.4" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.0" testImplementation "org.elasticsearch.client:transport:7.17.29" testImplementation 'org.assertj:assertj-core:3.27.3' } From 9b705a886c0b6919992f802707f84d175e195e46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:26:15 +0000 Subject: [PATCH 0659/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-free Bumps com.oracle.database.jdbc:ojdbc11 from 23.8.0.25.04 to 23.9.0.25.07. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.9.0.25.07 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index 424f6c48616..e671376497d 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.8.0.25.04' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' compileOnly 'org.jetbrains:annotations:26.0.2' From bd754c89b0f515829e367cbb150ab01bd2865b3a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:43:21 +0000 Subject: [PATCH 0660/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.64.0 to 26.65.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Changelog](https://github.com/googleapis/java-cloud-bom/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.64.0...v26.65.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.65.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 73783e22089..9d4c3ecfa8b 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.64.0") + testImplementation platform("com.google.cloud:libraries-bom:26.65.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From 65197759897df17a1e2104c635a9a4cbdb7eb673 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:43:59 +0000 Subject: [PATCH 0661/1224] Bump io.weaviate:client from 5.3.0 to 5.4.0 in /modules/weaviate Bumps [io.weaviate:client](https://github.com/weaviate/java-client) from 5.3.0 to 5.4.0. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/5.3.0...5.4.0) --- updated-dependencies: - dependency-name: io.weaviate:client dependency-version: 5.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 0a2be01a079..6c0140a64d1 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'io.weaviate:client:5.3.0' + testImplementation 'io.weaviate:client:5.4.0' } From cd733ba6be2cfdc0662f7e7c2cf87fba9bcfeb01 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:55:33 +0000 Subject: [PATCH 0662/1224] Bump com.zaxxer:HikariCP from 6.3.0 to 7.0.0 in /modules/junit-jupiter Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 6.3.0 to 7.0.0. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-6.3.0...HikariCP-7.0.0) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-version: 7.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 3ff102a8ece..7d9faa499db 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(':mysql') testImplementation project(':postgresql') - testImplementation 'com.zaxxer:HikariCP:6.3.0' + testImplementation 'com.zaxxer:HikariCP:7.0.0' testImplementation 'redis.clients:jedis:6.0.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From 04d85db34b94cd27a3f3b0d5246254ab07617fad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:55:38 +0000 Subject: [PATCH 0663/1224] Bump org.junit:junit-bom from 5.13.3 to 5.13.4 in /modules/junit-jupiter Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 3ff102a8ece..806697193b8 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: JUnit Jupiter Extension" dependencies { api project(':testcontainers') - implementation platform('org.junit:junit-bom:5.13.3') + implementation platform('org.junit:junit-bom:5.13.4') implementation 'org.junit.jupiter:junit-jupiter-api' testImplementation project(':mysql') From 4f3afaece2392c035277ef799dfacf3d7b8f0724 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 22:55:40 +0000 Subject: [PATCH 0664/1224] Bump org.junit.platform:junit-platform-launcher Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.13.3 to 1.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-version: 1.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 3ff102a8ece..9c5b8111db5 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } From 7062e7de77dee96ef1161a5436bdbf86d81e973b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 23:00:21 +0000 Subject: [PATCH 0665/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.41.0 to 4.42.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.41.0...4.42.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-version: 4.42.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 5c1f6b7c8e3..77c1bdba8aa 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' testImplementation(project(":junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.41.0") + testImplementation("com.hivemq:hivemq-extension-sdk:4.42.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") From fb25a78190b909ec7f8cf7289117553ef0682ad2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 1 Aug 2025 23:23:50 +0000 Subject: [PATCH 0666/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.32.9 to 2.32.14. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.32.14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index f531ef94eaf..a1b9c150746 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.scylladb:java-driver-core:4.19.0.1' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'software.amazon.awssdk:dynamodb:2.32.9' + testImplementation 'software.amazon.awssdk:dynamodb:2.32.14' } From 7a0cf2e0c135bc6384af9de6ecb98d2a0625a9f9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 17:13:16 +0000 Subject: [PATCH 0667/1224] Bump org.junit.jupiter:junit-jupiter in /smoke-test Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.3 to 5.13.4. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.3...r5.13.4) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.13.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- smoke-test/turbo-mode/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index 0e67df25a20..d6578e3db69 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.3' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' From 4a68e3e7aeee418dea14a1832b98e23b70a910dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:03:23 +0000 Subject: [PATCH 0668/1224] Bump io.cucumber:cucumber-bom from 7.23.0 to 7.27.0 in /examples Bumps [io.cucumber:cucumber-bom](https://github.com/cucumber/cucumber-jvm) from 7.23.0 to 7.27.0. - [Release notes](https://github.com/cucumber/cucumber-jvm/releases) - [Changelog](https://github.com/cucumber/cucumber-jvm/blob/main/CHANGELOG.md) - [Commits](https://github.com/cucumber/cucumber-jvm/compare/v7.23.0...v7.27.0) --- updated-dependencies: - dependency-name: io.cucumber:cucumber-bom dependency-version: 7.27.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 c0e916c652c..0e397c0644c 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation platform('org.junit:junit-bom:5.13.4') testImplementation 'org.junit.platform:junit-platform-suite' - testImplementation platform('io.cucumber:cucumber-bom:7.23.0') + testImplementation platform('io.cucumber:cucumber-bom:7.27.0') testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit-platform-engine' testImplementation 'org.testcontainers:selenium' From 473259c44ed59758b17054a763775e2c05a84cf6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:08:24 +0000 Subject: [PATCH 0669/1224] Bump org.assertj:assertj-core from 3.26.3 to 3.27.3 in /examples Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.3...assertj-build-3.27.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/cucumber/build.gradle | 2 +- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/selenium-container/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/examples/cucumber/build.gradle b/examples/cucumber/build.gradle index c0e916c652c..e2a27023094 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -18,7 +18,7 @@ dependencies { testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit-platform-engine' testImplementation 'org.testcontainers:selenium' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' } diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 0b2d1a2ddd7..9dc09c80253 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 80c4f962bf2..02f161b224a 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -10,7 +10,7 @@ dependencies { implementation 'io.codenotary:immudb4j:1.0.1' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index a5be0be25ac..98faa06472e 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -11,7 +11,7 @@ dependencies { testAnnotationProcessor "org.projectlombok:lombok:1.18.38" testImplementation 'org.testcontainers:kafka' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 3d90b1b1912..3d8c808a9d7 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.testcontainers:testcontainers' testImplementation 'io.nats:jnats:2.21.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index c4305469e36..ebcd5462bbf 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' testImplementation 'org.testcontainers:neo4j' testImplementation 'org.testcontainers:junit-jupiter' diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 440d6d4a773..c8f478b2eb4 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.testcontainers:ollama' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 99e1b6247e3..4a7e1896f51 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testng:testng:7.5.1' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' } test { diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index f77102ac307..abd647930e1 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index 823a7ccfc41..f78ecc536ac 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.testcontainers:selenium' testImplementation 'org.testcontainers:junit-jupiter' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index b02e0a4728b..31b5cfb7171 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'com.github.mwiede:jsch:2.27.2' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index a732fd284f4..55e77b67388 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index cd087543cda..7c0ee785318 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:solr' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index 8f81d89334e..34e13b5e7ed 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.apache.curator:curator-framework:5.8.0' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' From 98bdd8fbaa7c6b9af687f47b27137c9f9278d148 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:08:35 +0000 Subject: [PATCH 0670/1224] Bump org.apache.curator:curator-framework in /examples Bumps [org.apache.curator:curator-framework](https://github.com/apache/curator) from 5.8.0 to 5.9.0. - [Release notes](https://github.com/apache/curator/releases) - [Commits](https://github.com/apache/curator/compare/apache-curator-5.8.0...apache-curator-5.9.0) --- updated-dependencies: - dependency-name: org.apache.curator:curator-framework dependency-version: 5.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/zookeeper/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index 8f81d89334e..516b24c9c33 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.apache.curator:curator-framework:5.8.0' + testImplementation 'org.apache.curator:curator-framework:5.9.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.assertj:assertj-core:3.26.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' From e81ad90e053efa5f4da239162fa65b517923b3e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Aug 2025 18:10:37 +0000 Subject: [PATCH 0671/1224] Bump org.awaitility:awaitility from 4.2.2 to 4.3.0 in /examples Bumps [org.awaitility:awaitility](https://github.com/awaitility/awaitility) from 4.2.2 to 4.3.0. - [Changelog](https://github.com/awaitility/awaitility/blob/master/changelog.txt) - [Commits](https://github.com/awaitility/awaitility/compare/awaitility-4.2.2...awaitility-4.3.0) --- updated-dependencies: - dependency-name: org.awaitility:awaitility dependency-version: 4.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index a5be0be25ac..a1c1b7120ad 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.awaitility:awaitility:4.2.2' + testImplementation 'org.awaitility:awaitility:4.3.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } From 5bd0b6df1f861c874992e8c30782efa605f7614f Mon Sep 17 00:00:00 2001 From: Sergei Bushmelev <77979972+sbushmelev@users.noreply.github.com> Date: Tue, 5 Aug 2025 00:41:30 +0400 Subject: [PATCH 0672/1224] Add method getHttpUrl for ClickHouseContainer (#10526) --- modules/clickhouse/build.gradle | 1 + .../clickhouse/ClickHouseContainer.java | 4 +++ .../clickhouse/ClickHouseContainerTest.java | 30 +++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index d366825e261..8fabc3a3397 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -13,6 +13,7 @@ dependencies { testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'com.clickhouse:client-v2:0.9.0' testImplementation testFixtures(project(':r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.2', classifier: 'http') } diff --git a/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java b/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java index d3256124de1..02a02267ec5 100644 --- a/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java +++ b/modules/clickhouse/src/main/java/org/testcontainers/clickhouse/ClickHouseContainer.java @@ -101,6 +101,10 @@ public String getJdbcUrl() { ); } + public String getHttpUrl() { + return "http://" + getHost() + ":" + getMappedPort(HTTP_PORT); + } + @Override public String getUsername() { return username; diff --git a/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java b/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java index d5389b610c4..0e7a3d1c119 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java @@ -1,13 +1,20 @@ package org.testcontainers.clickhouse; +import com.clickhouse.client.api.Client; +import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader; +import com.clickhouse.client.api.query.QueryResponse; import org.junit.Test; import org.testcontainers.ClickhouseTestImages; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; public class ClickHouseContainerTest extends AbstractContainerDatabaseTest { @@ -56,4 +63,27 @@ public void testNewAuth() throws SQLException { assertThat(resultSetInt).isEqualTo(1); } } + + @Test + public void testGetHttpMethodWithHttpClient() { + ClickHouseContainer clickhouse = new ClickHouseContainer(ClickhouseTestImages.CLICKHOUSE_24_12_IMAGE); + clickhouse.start(); + Client client = new Client.Builder() + .addEndpoint(clickhouse.getHttpUrl()) + .setUsername(clickhouse.getUsername()) + .setPassword(clickhouse.getPassword()) + .build(); + try { + QueryResponse queryResponse = client.query("SELECT 1").get(1, TimeUnit.MINUTES); + ClickHouseBinaryFormatReader reader = client.newBinaryFormatReader(queryResponse); + reader.next(); + int result = reader.getInteger(1); + assertThat(result).isEqualTo(1); + } catch (ExecutionException | InterruptedException | TimeoutException e) { + fail("Cannot get sql result:" + e); + } finally { + clickhouse.close(); + client.close(); + } + } } From a26d58fecc6be3a747cebf31de1446f0fef82e82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 5 Aug 2025 16:17:03 -0600 Subject: [PATCH 0673/1224] Add testcontainers prefix to modules (#10591) --- docs/examples/junit4/generic/build.gradle | 4 ++-- docs/examples/junit5/redis/build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- examples/cucumber/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/neo4j-container/build.gradle | 4 ++-- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/selenium-container/build.gradle | 4 ++-- examples/solr-container/build.gradle | 2 +- examples/spring-boot/build.gradle | 2 +- modules/azure/build.gradle | 2 +- modules/cassandra/build.gradle | 2 +- modules/clickhouse/build.gradle | 8 ++++---- modules/cockroachdb/build.gradle | 4 ++-- modules/cratedb/build.gradle | 4 ++-- modules/databend/build.gradle | 4 ++-- modules/db2/build.gradle | 4 ++-- modules/hivemq/build.gradle | 2 +- modules/jdbc-test/build.gradle | 2 +- modules/jdbc/build.gradle | 2 +- modules/junit-jupiter/build.gradle | 4 ++-- modules/mariadb/build.gradle | 8 ++++---- modules/mssqlserver/build.gradle | 10 +++++----- modules/mysql/build.gradle | 8 ++++---- modules/oceanbase/build.gradle | 4 ++-- modules/oracle-free/build.gradle | 8 ++++---- modules/oracle-xe/build.gradle | 8 ++++---- modules/postgresql/build.gradle | 8 ++++---- modules/presto/build.gradle | 4 ++-- modules/questdb/build.gradle | 4 ++-- modules/r2dbc/build.gradle | 2 +- modules/selenium/build.gradle | 2 +- modules/spock/build.gradle | 6 +++--- modules/tidb/build.gradle | 4 ++-- modules/timeplus/build.gradle | 4 ++-- modules/trino/build.gradle | 4 ++-- modules/yugabytedb/build.gradle | 4 ++-- settings.gradle | 4 ++-- 40 files changed, 80 insertions(+), 80 deletions(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index 50b7d9caf32..d5bdd39e3f9 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -3,8 +3,8 @@ description = "Examples for docs" dependencies { testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") - testImplementation project(":selenium") - testImplementation project(":mysql") + testImplementation project(":testcontainers-selenium") + testImplementation project(":testcontainers-mysql") testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation "org.seleniumhq.selenium:selenium-api:4.34.0" diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 60e78fc589d..f03bc7cdf4c 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -8,7 +8,7 @@ dependencies { testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") - testImplementation project(":junit-jupiter") + testImplementation project(":testcontainers-junit-jupiter") testImplementation 'org.assertj:assertj-core:3.27.3' } diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index d6fd81a8370..2b82febefb6 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -6,7 +6,7 @@ plugins { dependencies { api "io.lettuce:lettuce-core:6.7.1.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' - testImplementation project(":spock") + testImplementation project(":testcontainers-spock") testImplementation 'ch.qos.logback:logback-classic:1.3.15' } diff --git a/examples/cucumber/build.gradle b/examples/cucumber/build.gradle index 79ce094b656..e671b26d454 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -17,7 +17,7 @@ dependencies { testImplementation platform('io.cucumber:cucumber-bom:7.27.0') testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit-platform-engine' - testImplementation 'org.testcontainers:selenium' + testImplementation 'org.testcontainers:testcontainers-selenium' testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' } diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 02f161b224a..1d349ba33ec 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation 'io.codenotary:immudb4j:1.0.1' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers-junit-jupiter' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index e5c09635a89..4483b006709 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testCompileOnly "org.projectlombok:lombok:1.18.38" testAnnotationProcessor "org.projectlombok:lombok:1.18.38" - testImplementation 'org.testcontainers:kafka' + testImplementation 'org.testcontainers:testcontainers-kafka' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'com.google.guava:guava:23.0' diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index ebcd5462bbf..cb7a334b712 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -9,8 +9,8 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' - testImplementation 'org.testcontainers:neo4j' - testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers-neo4j' + testImplementation 'org.testcontainers:testcontainers-junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index c8f478b2eb4..800136bc628 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.testcontainers:ollama' + testImplementation 'org.testcontainers:testcontainers-ollama' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index abd647930e1..b6a4e47f094 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -12,7 +12,7 @@ dependencies { implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers-junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.assertj:assertj-core:3.27.3' diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index f78ecc536ac..3629b3de78e 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -14,8 +14,8 @@ dependencies { implementation 'org.seleniumhq.selenium:selenium-chrome-driver' implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.testcontainers:selenium' - testImplementation 'org.testcontainers:junit-jupiter' + testImplementation 'org.testcontainers:testcontainers-selenium' + testImplementation 'org.testcontainers:testcontainers-junit-jupiter' testImplementation 'org.assertj:assertj-core:3.27.3' testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 7c0ee785318..8cef396fe61 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -13,7 +13,7 @@ dependencies { implementation 'org.apache.solr:solr-solrj:8.11.4' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.testcontainers:solr' + testImplementation 'org.testcontainers:testcontainers-solr' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/spring-boot/build.gradle b/examples/spring-boot/build.gradle index 2001c393afa..e3a40d27f06 100644 --- a/examples/spring-boot/build.gradle +++ b/examples/spring-boot/build.gradle @@ -16,7 +16,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' runtimeOnly 'org.postgresql:postgresql' testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'org.testcontainers:postgresql' + testImplementation 'org.testcontainers:testcontainers-postgresql' testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 18cf96527b3..13f3f353ba9 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: Azure" dependencies { api project(':testcontainers') - api project(':mssqlserver') + api project(':testcontainers-mssqlserver') // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index e146c26e69e..42c503f6752 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -7,7 +7,7 @@ configurations.all { } dependencies { - api project(":database-commons") + api project(":testcontainers-database-commons") api "com.datastax.cassandra:cassandra-driver-core:3.10.0" testImplementation 'com.datastax.oss:java-driver-core:4.17.0' diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 8fabc3a3397..f0c57fe8c36 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -2,18 +2,18 @@ description = "Testcontainers :: JDBC :: ClickHouse" dependencies { api project(':testcontainers') - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.2', classifier: 'http') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.7.2', classifier: 'http') testRuntimeOnly(group: 'com.clickhouse', name: 'jdbc-v2', version: '0.7.2', classifier: 'http') testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'com.clickhouse:client-v2:0.9.0' - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.2', classifier: 'http') } diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 6340d918e7e..a1967c94fbd 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: CockroachDB" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation 'org.assertj:assertj-core:3.27.3' } diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index 79ca4864f46..b74d9c5f949 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: CrateDB" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' compileOnly 'org.jetbrains:annotations:26.0.2' diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 392c2b51eb0..2770b2ccff3 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: Databend" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.databend:databend-jdbc:0.4.0' testImplementation 'org.assertj:assertj-core:3.27.3' } diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 0163eb17bd6..15600ec3856 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: DB2" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' testImplementation 'org.assertj:assertj-core:3.27.3' } diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 77c1bdba8aa..9a0fda05afe 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' - testImplementation(project(":junit-jupiter")) + testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.42.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle index 1051af04383..b5774ce794d 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -1,5 +1,5 @@ dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') api 'com.google.guava:guava:33.4.8-jre' api 'org.apache.commons:commons-lang3:3.18.0' diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle index c343cd17a4a..c45f1bf65d3 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -1,7 +1,7 @@ description = "Testcontainers :: JDBC" dependencies { - api project(':database-commons') + api project(':testcontainers-database-commons') compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle index 20546c873cb..13652ef111b 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -5,8 +5,8 @@ dependencies { implementation platform('org.junit:junit-bom:5.13.4') implementation 'org.junit.jupiter:junit-jupiter-api' - testImplementation project(':mysql') - testImplementation project(':postgresql') + testImplementation project(':testcontainers-mysql') + testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.0' testImplementation 'redis.clients:jedis:6.0.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle index 416ae4f2707..cf0b92dd5fe 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -1,15 +1,15 @@ description = "Testcontainers :: JDBC :: MariaDB" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.4' - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' } diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle index c1174c84b15..793f5b48c99 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -1,19 +1,19 @@ description = "Testcontainers :: MS SQL Server" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.1.jre8-preview' - testImplementation project(':r2dbc') + testImplementation project(':testcontainers-r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' // MSSQL's wait strategy requires the JDBC driver - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) } tasks.japicmp { diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index 3055cd141fc..ddacc0fdc50 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -1,15 +1,15 @@ description = "Testcontainers :: JDBC :: MySQL" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' compileOnly 'org.jetbrains:annotations:26.0.2' diff --git a/modules/oceanbase/build.gradle b/modules/oceanbase/build.gradle index e1f13a7a6a1..d4278ddc0bc 100644 --- a/modules/oceanbase/build.gradle +++ b/modules/oceanbase/build.gradle @@ -1,8 +1,8 @@ description = "Testcontainers :: JDBC :: OceanBase" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index e671376497d..a55c9f26518 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -1,16 +1,16 @@ description = "Testcontainers :: JDBC :: Oracle Database Free" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' compileOnly 'org.jetbrains:annotations:26.0.2' - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index 012ba002e49..a384fcb7221 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -1,17 +1,17 @@ description = "Testcontainers :: JDBC :: Oracle XE" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' compileOnly 'org.jetbrains:annotations:26.0.2' - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle index bbe8e596b95..8af61c5f3e2 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -1,15 +1,15 @@ description = "Testcontainers :: JDBC :: PostgreSQL" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - compileOnly project(':r2dbc') + compileOnly project(':testcontainers-r2dbc') compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' - testImplementation testFixtures(project(':r2dbc')) + testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' compileOnly 'org.jetbrains:annotations:26.0.2' diff --git a/modules/presto/build.gradle b/modules/presto/build.gradle index 988b00630d8..194b413c10f 100644 --- a/modules/presto/build.gradle +++ b/modules/presto/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: Presto" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.prestosql:presto-jdbc:350' compileOnly 'org.jetbrains:annotations:26.0.2' } diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 66355d19d61..954b0300ad5 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -2,10 +2,10 @@ description = "Testcontainers :: QuestDB" dependencies { api project(':testcontainers') - api project(':jdbc') + api project(':testcontainers-jdbc') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'org.questdb:questdb:9.0.1' testImplementation 'org.awaitility:awaitility:4.3.0' diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index b506f5a2515..49f7672bd18 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' - testImplementation project(':postgresql') + testImplementation project(':testcontainers-postgresql') testFixturesImplementation 'io.projectreactor:reactor-core:3.7.8' testFixturesImplementation 'org.assertj:assertj-core:3.27.3' diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index 10dbcd6752d..1b9312d6187 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation 'org.seleniumhq.selenium:selenium-support' testImplementation 'org.mortbay.jetty:jetty:6.1.26' - testImplementation project(':nginx') + testImplementation project(':testcontainers-nginx') testImplementation 'org.assertj:assertj-core:3.27.3' compileOnly 'org.jetbrains:annotations:26.0.2' diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle index 0e361b5c793..ae7f37050ba 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -8,9 +8,9 @@ dependencies { api project(':testcontainers') implementation 'org.spockframework:spock-core:2.3-groovy-4.0' - testImplementation project(':selenium') - testImplementation project(':mysql') - testImplementation project(':postgresql') + testImplementation project(':testcontainers-selenium') + testImplementation project(':testcontainers-mysql') + testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 37a528a41ff..47dd9d01027 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: TiDB" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' compileOnly 'org.jetbrains:annotations:26.0.2' diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index 72da2ed182f..188edeeb677 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -2,9 +2,9 @@ description = "Testcontainers :: JDBC :: Timeplus" dependencies { api project(':testcontainers') - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.10' testImplementation 'org.assertj:assertj-core:3.27.3' } diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index f8d3a4f1307..08e3c0c2982 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -1,9 +1,9 @@ description = "Testcontainers :: JDBC :: Trino" dependencies { - api project(':jdbc') + api project(':testcontainers-jdbc') - testImplementation project(':jdbc-test') + testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.trino:trino-jdbc:476' compileOnly 'org.jetbrains:annotations:26.0.2' } diff --git a/modules/yugabytedb/build.gradle b/modules/yugabytedb/build.gradle index 15540f0020a..d81dd3e0648 100644 --- a/modules/yugabytedb/build.gradle +++ b/modules/yugabytedb/build.gradle @@ -1,8 +1,8 @@ description = "Testcontainers :: JDBC :: YugabyteDB" dependencies { - api project(':jdbc') - testImplementation project(':jdbc-test') + api project(':testcontainers-jdbc') + testImplementation project(':testcontainers-jdbc-test') // YCQL driver testImplementation 'com.yugabyte:java-driver-core:4.19.0-yb-1' // YSQL driver diff --git a/settings.gradle b/settings.gradle index 0099b899082..2076cb71c86 100644 --- a/settings.gradle +++ b/settings.gradle @@ -23,8 +23,8 @@ include "testcontainers" project(':testcontainers').projectDir = "$rootDir/core" as File file('modules').eachDir { dir -> - include dir.name - project(":${dir.name}").projectDir = dir + include "testcontainers-${dir.name}" + project(":testcontainers-${dir.name}").projectDir = dir } include ':docs:examples:junit4:generic' From 0218c2040d15c951747ca020d793c4bd11169891 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 6 Aug 2025 08:26:13 -0600 Subject: [PATCH 0674/1224] Move localstack's tests to aws sdk v2 (#10592) --- docs/modules/localstack.md | 4 - modules/localstack/build.gradle | 13 +- .../containers/localstack/LegacyModeTest.java | 37 +- .../localstack/LocalstackContainerTest.java | 352 ++++++++---------- .../localstack/LocalstackTestImages.java | 6 +- 5 files changed, 172 insertions(+), 240 deletions(-) diff --git a/docs/modules/localstack.md b/docs/modules/localstack.md index 827ed4a6534..5527416e854 100644 --- a/docs/modules/localstack.md +++ b/docs/modules/localstack.md @@ -16,10 +16,6 @@ public LocalStackContainer localstack = new LocalStackContainer(localstackImage) ## Creating a client using AWS SDK - -[AWS SDK V1](../../modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java) inside_block:with_aws_sdk_v1 - - [AWS SDK V2](../../modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java) inside_block:with_aws_sdk_v2 diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle index cddaeeaf432..5390d190282 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,13 +3,12 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testImplementation platform("com.amazonaws:aws-java-sdk-bom:1.12.572") - testImplementation 'com.amazonaws:aws-java-sdk-s3' - testImplementation 'com.amazonaws:aws-java-sdk-sqs' - testImplementation 'com.amazonaws:aws-java-sdk-logs' - testImplementation 'com.amazonaws:aws-java-sdk-lambda' - testImplementation 'com.amazonaws:aws-java-sdk-core' - testImplementation 'software.amazon.awssdk:s3:2.32.14' + testImplementation platform("software.amazon.awssdk:bom:2.32.14") + testImplementation 'software.amazon.awssdk:s3' + testImplementation 'software.amazon.awssdk:sqs' + testImplementation 'software.amazon.awssdk:cloudwatchlogs' + testImplementation 'software.amazon.awssdk:lambda' + testImplementation 'software.amazon.awssdk:kms' testImplementation 'org.assertj:assertj-core:3.27.3' } diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java index e66bd8c3e62..f888c53afeb 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java @@ -1,6 +1,5 @@ package org.testcontainers.containers.localstack; -import com.amazonaws.client.builder.AwsClientBuilder; import com.github.dockerjava.api.DockerClient; import lombok.AllArgsConstructor; import org.junit.BeforeClass; @@ -20,7 +19,9 @@ @RunWith(Enclosed.class) public class LegacyModeTest { - private static DockerImageName LOCALSTACK_CUSTOM_TAG = LocalstackTestImages.LOCALSTACK_IMAGE.withTag("custom"); + private static DockerImageName LOCALSTACK_CUSTOM_TAG = DockerImageName + .parse("localstack/localstack:0.12.8") + .withTag("custom"); @RunWith(Parameterized.class) @AllArgsConstructor @@ -54,21 +55,9 @@ public void samePortIsExposedForAllServices() { assertThat(localstack.getEndpointOverride(Service.SQS).toString()) .as("Endpoint overrides are different") .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - assertThat( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpointOverride(Service.SQS).toString(), - localstack.getRegion() - ) - .getServiceEndpoint() - ) + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) .as("Endpoint configuration have different endpoints") - .isEqualTo( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpointOverride(Service.S3).toString(), - localstack.getRegion() - ) - .getServiceEndpoint() - ); + .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); } finally { localstack.stop(); } @@ -119,21 +108,9 @@ public void differentPortsAreExposed() { assertThat(localstack.getEndpointOverride(Service.SQS).toString()) .as("Endpoint overrides are different") .isNotEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - assertThat( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpointOverride(Service.SQS).toString(), - localstack.getRegion() - ) - .getServiceEndpoint() - ) + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) .as("Endpoint configuration have different endpoints") - .isNotEqualTo( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpointOverride(Service.S3).toString(), - localstack.getRegion() - ) - .getServiceEndpoint() - ); + .isNotEqualTo(localstack.getEndpointOverride(Service.S3).toString()); } finally { localstack.stop(); } 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 a1c36078840..cf729a48a32 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,35 +1,5 @@ package org.testcontainers.containers.localstack; -import com.amazonaws.auth.AWSStaticCredentialsProvider; -import com.amazonaws.auth.BasicAWSCredentials; -import com.amazonaws.client.builder.AwsClientBuilder; -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.lambda.AWSLambda; -import com.amazonaws.services.lambda.AWSLambdaClientBuilder; -import com.amazonaws.services.lambda.model.CreateFunctionRequest; -import com.amazonaws.services.lambda.model.CreateFunctionResult; -import com.amazonaws.services.lambda.model.FunctionCode; -import com.amazonaws.services.lambda.model.GetFunctionRequest; -import com.amazonaws.services.lambda.model.InvokeRequest; -import com.amazonaws.services.lambda.model.InvokeResult; -import com.amazonaws.services.lambda.model.Runtime; -import com.amazonaws.services.logs.AWSLogs; -import com.amazonaws.services.logs.AWSLogsClientBuilder; -import com.amazonaws.services.logs.model.CreateLogGroupRequest; -import com.amazonaws.services.logs.model.LogGroup; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import com.amazonaws.services.s3.model.Bucket; -import com.amazonaws.services.s3.model.ObjectListing; -import com.amazonaws.services.s3.model.S3Object; -import com.amazonaws.services.sqs.AmazonSQS; -import com.amazonaws.services.sqs.AmazonSQSClientBuilder; -import com.amazonaws.services.sqs.model.CreateQueueResult; -import com.amazonaws.waiters.WaiterParameters; import com.github.dockerjava.api.DockerClient; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; @@ -45,19 +15,46 @@ import org.testcontainers.utility.DockerImageName; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; +import software.amazon.awssdk.core.SdkBytes; import software.amazon.awssdk.regions.Region; +import software.amazon.awssdk.services.cloudwatchlogs.CloudWatchLogsClient; +import software.amazon.awssdk.services.cloudwatchlogs.model.CreateLogGroupRequest; +import software.amazon.awssdk.services.cloudwatchlogs.model.DescribeLogGroupsResponse; +import software.amazon.awssdk.services.kms.KmsClient; +import software.amazon.awssdk.services.kms.model.CreateKeyRequest; +import software.amazon.awssdk.services.kms.model.CreateKeyResponse; +import software.amazon.awssdk.services.kms.model.Tag; +import software.amazon.awssdk.services.lambda.LambdaClient; +import software.amazon.awssdk.services.lambda.model.CreateFunctionRequest; +import software.amazon.awssdk.services.lambda.model.CreateFunctionResponse; +import software.amazon.awssdk.services.lambda.model.FunctionCode; +import software.amazon.awssdk.services.lambda.model.GetFunctionConfigurationRequest; +import software.amazon.awssdk.services.lambda.model.InvokeRequest; +import software.amazon.awssdk.services.lambda.model.InvokeResponse; +import software.amazon.awssdk.services.lambda.model.Runtime; +import software.amazon.awssdk.services.lambda.waiters.LambdaWaiter; import software.amazon.awssdk.services.s3.S3Client; +import software.amazon.awssdk.services.s3.model.Bucket; +import software.amazon.awssdk.services.s3.model.CreateBucketRequest; +import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Request; +import software.amazon.awssdk.services.s3.model.ListObjectsV2Response; +import software.amazon.awssdk.services.s3.model.PutObjectRequest; +import software.amazon.awssdk.services.s3.presigner.S3Presigner; +import software.amazon.awssdk.services.s3.presigner.model.GetObjectPresignRequest; +import software.amazon.awssdk.services.sqs.SqsClient; +import software.amazon.awssdk.services.sqs.model.CreateQueueRequest; +import software.amazon.awssdk.services.sqs.model.CreateQueueResponse; +import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest; +import software.amazon.awssdk.services.sqs.model.SendMessageRequest; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.URL; -import java.nio.ByteBuffer; import java.nio.charset.StandardCharsets; -import java.time.Instant; -import java.time.temporal.ChronoUnit; +import java.time.Duration; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Optional; @@ -82,6 +79,7 @@ public static class WithoutNetwork { // without_network { @ClassRule public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withEnv("SQS_ENDPOINT_STRATEGY", "dynamic") .withServices( Service.S3, Service.SQS, @@ -94,42 +92,39 @@ public static class WithoutNetwork { @Test public void s3TestOverBridgeNetwork() throws IOException { - // with_aws_sdk_v1 { - AmazonS3 s3 = AmazonS3ClientBuilder - .standard() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey()) + S3Client s3 = S3Client + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) ) ) + .region(Region.of(localstack.getRegion())) .build(); - // } final String bucketName = "foo"; - s3.createBucket(bucketName); - s3.putObject(bucketName, "bar", "baz"); + s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); + s3.putObject( + PutObjectRequest.builder().bucket(bucketName).key("bar").build(), + software.amazon.awssdk.core.sync.RequestBody.fromString("baz") + ); - final List buckets = s3.listBuckets(); - final Optional maybeBucket = buckets - .stream() - .filter(b -> b.getName().equals(bucketName)) - .findFirst(); + final List buckets = s3.listBuckets().buckets(); + final Optional maybeBucket = buckets.stream().filter(b -> b.name().equals(bucketName)).findFirst(); assertThat(maybeBucket).as("The created bucket is present").isPresent(); final Bucket bucket = maybeBucket.get(); - assertThat(bucket.getName()).as("The created bucket has the right name").isEqualTo(bucketName); + assertThat(bucket.name()).as("The created bucket has the right name").isEqualTo(bucketName); - final ObjectListing objectListing = s3.listObjects(bucketName); - assertThat(objectListing.getObjectSummaries()).as("The created bucket has 1 item in it").hasSize(1); + final ListObjectsV2Response objectListing = s3.listObjectsV2( + ListObjectsV2Request.builder().bucket(bucketName).build() + ); + assertThat(objectListing.contents()).as("The created bucket has 1 item in it").hasSize(1); - final S3Object object = s3.getObject(bucketName, "bar"); - final String content = IOUtils.toString(object.getObjectContent(), StandardCharsets.UTF_8); + final String content = s3 + .getObjectAsBytes(GetObjectRequest.builder().bucket(bucketName).key("bar").build()) + .asString(StandardCharsets.UTF_8); assertThat(content).as("The object can be retrieved").isEqualTo("baz"); } @@ -157,86 +152,73 @@ public void s3TestUsingAwsSdkV2() { @Test public void sqsTestOverBridgeNetwork() { - AmazonSQS sqs = AmazonSQSClientBuilder - .standard() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey()) + SqsClient sqs = SqsClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) ) ) + .region(Region.of(localstack.getRegion())) .build(); - CreateQueueResult queueResult = sqs.createQueue("baz"); - String fooQueueUrl = queueResult.getQueueUrl(); - assertThat(fooQueueUrl) - .as("Created queue has external hostname URL") - .contains("http://" + localstack.getHost() + ":" + localstack.getMappedPort(LocalStackContainer.PORT)); + CreateQueueResponse queueResult = sqs.createQueue(CreateQueueRequest.builder().queueName("baz").build()); + String fooQueueUrl = queueResult.queueUrl(); - sqs.sendMessage(fooQueueUrl, "test"); + sqs.sendMessage(SendMessageRequest.builder().queueUrl(fooQueueUrl).messageBody("test").build()); final long messageCount = sqs - .receiveMessage(fooQueueUrl) - .getMessages() + .receiveMessage(ReceiveMessageRequest.builder().queueUrl(fooQueueUrl).build()) + .messages() .stream() - .filter(message -> message.getBody().equals("test")) + .filter(message -> message.body().equals("test")) .count(); assertThat(messageCount).as("the sent message can be received").isEqualTo(1L); } @Test public void cloudWatchLogsTestOverBridgeNetwork() { - AWSLogs logs = AWSLogsClientBuilder - .standard() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey()) + CloudWatchLogsClient logs = CloudWatchLogsClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) ) ) + .region(Region.of(localstack.getRegion())) .build(); - logs.createLogGroup(new CreateLogGroupRequest("foo")); + logs.createLogGroup(CreateLogGroupRequest.builder().logGroupName("foo").build()); - List groups = logs.describeLogGroups().getLogGroups(); - assertThat(groups).as("One log group should be created").hasSize(1); - assertThat(groups.get(0).getLogGroupName()).as("Name of created log group is [foo]").isEqualTo("foo"); + DescribeLogGroupsResponse response = logs.describeLogGroups(); + assertThat(response.logGroups()).as("One log group should be created").hasSize(1); + assertThat(response.logGroups().get(0).logGroupName()) + .as("Name of created log group is [foo]") + .isEqualTo("foo"); } @Test public void kmsKeyCreationTest() { - AWSKMS awskms = AWSKMSClientBuilder - .standard() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey()) + KmsClient kms = KmsClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) ) ) + .region(Region.of(localstack.getRegion())) .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); + String desc = "AWS CMK Description"; + Tag createdByTag = Tag.builder().tagKey("CreatedBy").tagValue("StorageService").build(); + CreateKeyRequest req = CreateKeyRequest.builder().description(desc).tags(createdByTag).build(); + CreateKeyResponse key = kms.createKey(req); assertThat(desc) .as("AWS KMS Customer Managed Key should be created ") - .isEqualTo(key.getKeyMetadata().getDescription()); + .isEqualTo(key.keyMetadata().description()); } @Test @@ -245,21 +227,6 @@ public void samePortIsExposedForAllServices() { assertThat(localstack.getEndpointOverride(Service.SQS).toString()) .as("Endpoint overrides are different") .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - assertThat( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpointOverride(Service.SQS).toString(), - localstack.getRegion() - ) - .getServiceEndpoint() - ) - .as("Endpoint configuration have different endpoints") - .isEqualTo( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpointOverride(Service.S3).toString(), - localstack.getRegion() - ) - .getServiceEndpoint() - ); } } @@ -270,7 +237,7 @@ public static class WithNetwork { @ClassRule public static LocalStackContainer localstackInDockerNetwork = new LocalStackContainer( - LocalstackTestImages.LOCALSTACK_IMAGE + DockerImageName.parse("localstack/localstack:0.12.8") ) .withNetwork(network) .withNetworkAliases("notthis", "localstack") // the last alias is used for HOSTNAME_EXTERNAL @@ -367,22 +334,14 @@ public static class WithRegion { @Test public void s3EndpointHasProperRegion() { - final AwsClientBuilder.EndpointConfiguration endpointConfiguration = new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ); - assertThat(endpointConfiguration.getSigningRegion()) - .as("The endpoint configuration has right region") - .isEqualTo(region); + assertThat(localstack.getRegion()).as("The endpoint configuration has right region").isEqualTo(region); } } public static class WithoutServices { @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer( - LocalstackTestImages.LOCALSTACK_0_13_IMAGE - ); + public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE); @Test public void s3ServiceStartLazily() { @@ -478,46 +437,53 @@ private String runAwsCliAgainstDockerNetworkContainer(String command) throws Exc public static class S3SkipSignatureValidation { @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer( - LocalstackTestImages.LOCALSTACK_2_3_IMAGE - ) + public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) .withEnv("S3_SKIP_SIGNATURE_VALIDATION", "0"); @Test public void shouldBeAccessibleWithCredentials() throws IOException { - AmazonS3 s3 = AmazonS3ClientBuilder - .standard() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey()) + S3Client s3 = S3Client + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) ) ) + .region(Region.of(localstack.getRegion())) .build(); final String bucketName = "foo"; - s3.createBucket(bucketName); + s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); - s3.putObject(bucketName, "bar", "baz"); + s3.putObject( + PutObjectRequest.builder().bucket(bucketName).key("bar").build(), + software.amazon.awssdk.core.sync.RequestBody.fromString("baz") + ); - final List buckets = s3.listBuckets(); - final Optional maybeBucket = buckets - .stream() - .filter(b -> b.getName().equals(bucketName)) - .findFirst(); + final List buckets = s3.listBuckets().buckets(); + final Optional maybeBucket = buckets.stream().filter(b -> b.name().equals(bucketName)).findFirst(); assertThat(maybeBucket).as("The created bucket is present").isPresent(); - URL presignedUrl = s3.generatePresignedUrl( - bucketName, - "bar", - Date.from(Instant.now().plus(5, ChronoUnit.MINUTES)) - ); + S3Presigner presigner = S3Presigner + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) + ) + .region(Region.of(localstack.getRegion())) + .build(); + + GetObjectPresignRequest presignRequest = GetObjectPresignRequest + .builder() + .signatureDuration(Duration.ofMinutes(5)) + .getObjectRequest(GetObjectRequest.builder().bucket(bucketName).key("bar").build()) + .build(); + + URL presignedUrl = presigner.presignGetObject(presignRequest).url(); assertThat(presignedUrl).as("The presigned url is valid").isNotNull(); final String content = IOUtils.toString(presignedUrl, StandardCharsets.UTF_8); @@ -528,9 +494,7 @@ public void shouldBeAccessibleWithCredentials() throws IOException { public static class LambdaContainerLabels { @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer( - LocalstackTestImages.LOCALSTACK_2_3_IMAGE - ); + public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE); private static byte[] createLambdaHandlerZipFile() throws IOException { StringBuilder sb = new StringBuilder(); @@ -551,44 +515,44 @@ private static byte[] createLambdaHandlerZipFile() throws IOException { @Test public void shouldLabelLambdaContainers() throws IOException { - AWSLambda lambda = AWSLambdaClientBuilder - .standard() - .withEndpointConfiguration( - new AwsClientBuilder.EndpointConfiguration( - localstack.getEndpoint().toString(), - localstack.getRegion() - ) - ) - .withCredentials( - new AWSStaticCredentialsProvider( - new BasicAWSCredentials(localstack.getAccessKey(), localstack.getSecretKey()) + LambdaClient lambda = LambdaClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) ) ) + .region(Region.of(localstack.getRegion())) .build(); // create function byte[] handlerFile = createLambdaHandlerZipFile(); - CreateFunctionRequest createFunctionRequest = new CreateFunctionRequest() - .withFunctionName("test-function") - .withRuntime(Runtime.Python311) - .withHandler("handler.handler") - .withRole("arn:aws:iam::000000000000:role/test-role") - .withCode(new FunctionCode().withZipFile(ByteBuffer.wrap(handlerFile))); - CreateFunctionResult createFunctionResult = lambda.createFunction(createFunctionRequest); - GetFunctionRequest getFunctionRequest = new GetFunctionRequest() - .withFunctionName(createFunctionResult.getFunctionName()); - lambda - .waiters() - .functionActiveV2() - .run(new WaiterParameters().withRequest(getFunctionRequest)); + CreateFunctionRequest createFunctionRequest = CreateFunctionRequest + .builder() + .functionName("test-function") + .runtime(Runtime.PYTHON3_11) + .handler("handler.handler") + .role("arn:aws:iam::000000000000:role/test-role") + .code(FunctionCode.builder().zipFile(SdkBytes.fromByteArray(handlerFile)).build()) + .build(); + CreateFunctionResponse createFunctionResult = lambda.createFunction(createFunctionRequest); + + try (LambdaWaiter waiter = lambda.waiter()) { + waiter.waitUntilFunctionActive( + GetFunctionConfigurationRequest.builder().functionName(createFunctionResult.functionName()).build() + ); + } // invoke function once String payload = "{\"test\": \"payload\"}"; - InvokeRequest invokeRequest = new InvokeRequest() - .withFunctionName(createFunctionResult.getFunctionName()) - .withPayload(payload); - InvokeResult invokeResult = lambda.invoke(invokeRequest); - assertThat(StandardCharsets.UTF_8.decode(invokeResult.getPayload()).toString()) + InvokeRequest invokeRequest = InvokeRequest + .builder() + .functionName(createFunctionResult.functionName()) + .payload(SdkBytes.fromUtf8String(payload)) + .build(); + InvokeResponse invokeResult = lambda.invoke(invokeRequest); + assertThat(invokeResult.payload().asUtf8String()) .as("Invoke result not matching expected output") .isEqualTo(payload); diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java index 08e50cc1d2a..bb9366c435b 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java @@ -3,7 +3,7 @@ import org.testcontainers.utility.DockerImageName; public interface LocalstackTestImages { - DockerImageName LOCALSTACK_IMAGE = DockerImageName.parse("localstack/localstack:0.12.8"); + DockerImageName LOCALSTACK_IMAGE = DockerImageName.parse("localstack/localstack:4.7.0"); DockerImageName LOCALSTACK_0_10_IMAGE = LOCALSTACK_IMAGE.withTag("0.10.7"); @@ -11,9 +11,5 @@ public interface LocalstackTestImages { DockerImageName LOCALSTACK_0_12_IMAGE = LOCALSTACK_IMAGE.withTag("0.12.8"); - DockerImageName LOCALSTACK_0_13_IMAGE = LOCALSTACK_IMAGE.withTag("0.13.0"); - - DockerImageName LOCALSTACK_2_3_IMAGE = LOCALSTACK_IMAGE.withTag("2.3"); - DockerImageName AWS_CLI_IMAGE = DockerImageName.parse("amazon/aws-cli:2.7.27"); } From 1aec92b8d11cb9b56c0ce3d50bbd008265c7eb86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 6 Aug 2025 09:49:34 -0600 Subject: [PATCH 0675/1224] Update clickhouse version to 0.9.1 (#10593) --- modules/clickhouse/build.gradle | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index f0c57fe8c36..0b67f29ef2b 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -5,15 +5,14 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.2', classifier: 'http') + compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.7.2', classifier: 'http') - testRuntimeOnly(group: 'com.clickhouse', name: 'jdbc-v2', version: '0.7.2', classifier: 'http') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.1', classifier: 'all') testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'com.clickhouse:client-v2:0.9.0' + testImplementation 'com.clickhouse:client-v2:0.9.1' testImplementation testFixtures(project(':testcontainers-r2dbc')) - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.7.2', classifier: 'http') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') } From 51ad2bc96a2bc75b138ee67eab6df21faee41427 Mon Sep 17 00:00:00 2001 From: livk Date: Tue, 12 Aug 2025 00:09:51 +0800 Subject: [PATCH 0676/1224] Make MySQLContainer compatible with mysql:9.3.0 (#10185) Fixes #10184 --- modules/mysql/src/main/resources/mysql-default-conf/my.cnf | 1 - .../mysql/src/test/java/org/testcontainers/MySQLTestImages.java | 2 ++ .../org/testcontainers/containers/MySQLRootAccountTest.java | 1 + .../org/testcontainers/junit/mysql/MultiVersionMySQLTest.java | 1 + .../src/test/resources/somepath/mysql_conf_override/my.cnf | 1 - 5 files changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/mysql/src/main/resources/mysql-default-conf/my.cnf b/modules/mysql/src/main/resources/mysql-default-conf/my.cnf index 6fc2129357f..b22aa7d9e93 100644 --- a/modules/mysql/src/main/resources/mysql-default-conf/my.cnf +++ b/modules/mysql/src/main/resources/mysql-default-conf/my.cnf @@ -43,7 +43,6 @@ innodb_data_file_path = ibdata1:10M:autoextend innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size -innodb_log_file_size = 5M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 diff --git a/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java b/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java index 2254754f2c2..6b3fe80ce4a 100644 --- a/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java +++ b/modules/mysql/src/test/java/org/testcontainers/MySQLTestImages.java @@ -9,4 +9,6 @@ public class MySQLTestImages { public static final DockerImageName MYSQL_80_IMAGE = DockerImageName.parse("mysql:8.0.36"); public static final DockerImageName MYSQL_INNOVATION_IMAGE = DockerImageName.parse("mysql:8.3.0"); + + public static final DockerImageName MYSQL_93_IMAGE = DockerImageName.parse("mysql:9.3.0"); } diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java index 51ba5257fa3..e9a3c862143 100644 --- a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java @@ -22,6 +22,7 @@ public static DockerImageName[] params() { MySQLTestImages.MYSQL_57_IMAGE, MySQLTestImages.MYSQL_80_IMAGE, MySQLTestImages.MYSQL_INNOVATION_IMAGE, + MySQLTestImages.MYSQL_93_IMAGE, }; } diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java index 4c8516cc5cc..25085289ba7 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java @@ -22,6 +22,7 @@ public static DockerImageName[] params() { MySQLTestImages.MYSQL_57_IMAGE, MySQLTestImages.MYSQL_80_IMAGE, MySQLTestImages.MYSQL_INNOVATION_IMAGE, + MySQLTestImages.MYSQL_93_IMAGE, }; } diff --git a/modules/mysql/src/test/resources/somepath/mysql_conf_override/my.cnf b/modules/mysql/src/test/resources/somepath/mysql_conf_override/my.cnf index 5721bf52ccb..6e6dcd28ad1 100644 --- a/modules/mysql/src/test/resources/somepath/mysql_conf_override/my.cnf +++ b/modules/mysql/src/test/resources/somepath/mysql_conf_override/my.cnf @@ -46,7 +46,6 @@ innodb_data_file_path = ibdata1:10M:autoextend innodb_buffer_pool_size = 16M #innodb_additional_mem_pool_size = 2M # Set .._log_file_size to 25 % of buffer pool size -innodb_log_file_size = 5M innodb_log_buffer_size = 8M innodb_flush_log_at_trx_commit = 1 innodb_lock_wait_timeout = 50 From f555bdecabc8bfa5d68f67229566fee653e227ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 06:16:55 +0000 Subject: [PATCH 0677/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /core Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 6fd325f78c0..f38d301c389 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -119,13 +119,13 @@ dependencies { // Synthetic JAR used for MountableFileTest and DirectoryTarResourceTest testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" jarFileTestImplementation 'junit:junit:4.13.2' - jarFileTestImplementation 'org.assertj:assertj-core:3.27.3' + jarFileTestImplementation 'org.assertj:assertj-core:3.27.4' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' } From 1c2db714f52cfd2dd5515c09855db5ec7b2544ee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 07:24:22 +0000 Subject: [PATCH 0678/1224] Bump actions/checkout from 4 to 5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v4...v5) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-docker-wormhole.yml | 2 +- .github/workflows/ci-rootless.yml | 2 +- .github/workflows/ci-windows.yml | 4 ++-- .github/workflows/ci.yml | 16 ++++++++-------- .github/workflows/moby-latest.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-gradle-wrapper.yml | 2 +- .../workflows/update-testcontainers-version.yml | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci-docker-wormhole.yml b/.github/workflows/ci-docker-wormhole.yml index 8204bd0454b..9359316a924 100644 --- a/.github/workflows/ci-docker-wormhole.yml +++ b/.github/workflows/ci-docker-wormhole.yml @@ -44,7 +44,7 @@ jobs: in-docker_test: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Build with Gradle run: | docker run -i --rm \ diff --git a/.github/workflows/ci-rootless.yml b/.github/workflows/ci-rootless.yml index e5c9afd1dbc..d13c0437112 100644 --- a/.github/workflows/ci-rootless.yml +++ b/.github/workflows/ci-rootless.yml @@ -46,7 +46,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Setup rootless Docker uses: docker/setup-docker-action@v4 with: diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 3dd919bc919..57b2d117894 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -52,7 +52,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build - name: Build with Gradle run: ./gradlew.bat cleanTest testcontainers:test --no-daemon --continue --scan --no-build-cache @@ -78,7 +78,7 @@ jobs: target_url: `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`, context: 'CI - Windows', }) - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ed96bfdcfc7..66b364c6bfa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: matrix: java: [ '17', '21' ] steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build with: java-version: ${{ matrix.java }} @@ -69,7 +69,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build - name: Setup Testcontainers Cloud Client uses: atomicjar/testcontainers-cloud-setup-action@main @@ -88,7 +88,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action uses: gradle/actions/setup-gradle@v4 @@ -110,7 +110,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build - name: Build and test with Gradle (${{matrix.gradle_args}}) run: | @@ -123,7 +123,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action uses: gradle/actions/setup-gradle@v4 @@ -146,7 +146,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build - name: Build and test Examples with Gradle (${{matrix.gradle_args}}) working-directory: ./examples/ @@ -160,7 +160,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action uses: gradle/actions/setup-gradle@v4 @@ -182,7 +182,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build - name: Build and test with Gradle (${{matrix.gradle_args}}) run: | diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index dbb717757b3..b6af77feb2a 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -21,7 +21,7 @@ jobs: runs-on: ubuntu-22.04 continue-on-error: true steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-build - name: Install Stable Docker diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 77128657b0e..ca009b1dc8b 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: release: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Clear existing docker image cache run: docker image prune -af diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index 0248fa1d93a..5bbf47c3484 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -15,7 +15,7 @@ jobs: if: github.repository == 'testcontainers/testcontainers-java' runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: main - name: Update latest_version property in mkdocs.yml diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 8740b7a3e4f..da9c77c1b5e 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@512b1875f3b6270828abfe77b247d5895a2da1e5 # v1.0.13 diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index 13837626c06..90d249c7d3f 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -15,7 +15,7 @@ jobs: if: github.repository == 'testcontainers/testcontainers-java' runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: ref: main - name: Update testcontainers.version property in gradle.properties From 3603f6ca3a3c09f0cfa547e24f226aeeea6811f7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Aug 2025 07:27:08 +0000 Subject: [PATCH 0679/1224] Bump redis.clients:jedis from 6.0.0 to 6.1.0 in /core Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 6fd325f78c0..043faffa4ee 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -109,7 +109,7 @@ dependencies { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'redis.clients:jedis:6.0.0' + testImplementation 'redis.clients:jedis:6.1.0' testImplementation 'com.rabbitmq:amqp-client:5.26.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' From 911ef5eea3116effbf67b5a24d042f7592391279 Mon Sep 17 00:00:00 2001 From: winfriedgerlach <158032591+winfriedgerlach@users.noreply.github.com> Date: Tue, 12 Aug 2025 23:46:41 +0200 Subject: [PATCH 0680/1224] Fix parameter check in Kafka cluster examples (#10361) --- .../kafkacluster/ApacheKafkaContainerCluster.java | 10 ++++++---- .../kafkacluster/ConfluentKafkaContainerCluster.java | 10 ++++++---- .../example/kafkacluster/KafkaContainerCluster.java | 8 +++++--- .../kafkacluster/KafkaContainerKraftCluster.java | 10 ++++++---- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ApacheKafkaContainerCluster.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ApacheKafkaContainerCluster.java index a8616d2d4bb..0e56bd9d758 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ApacheKafkaContainerCluster.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ApacheKafkaContainerCluster.java @@ -25,12 +25,14 @@ public class ApacheKafkaContainerCluster implements Startable { private final Collection brokers; public ApacheKafkaContainerCluster(String version, int brokersNum, int internalTopicsRf) { - if (brokersNum < 0) { + if (brokersNum <= 0) { throw new IllegalArgumentException("brokersNum '" + brokersNum + "' must be greater than 0"); } - if (internalTopicsRf < 0 || internalTopicsRf > brokersNum) { + if (internalTopicsRf <= 0 || internalTopicsRf > brokersNum) { throw new IllegalArgumentException( - "internalTopicsRf '" + internalTopicsRf + "' must be less than brokersNum and greater than 0" + "internalTopicsRf '" + + internalTopicsRf + + "' must be less than or equal to brokersNum and greater than 0" ); } @@ -99,6 +101,6 @@ public void start() { @Override public void stop() { - this.brokers.stream().parallel().forEach(GenericContainer::stop); + this.brokers.parallelStream().forEach(GenericContainer::stop); } } diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ConfluentKafkaContainerCluster.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ConfluentKafkaContainerCluster.java index 222050c76c0..f09c3072ea3 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ConfluentKafkaContainerCluster.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/ConfluentKafkaContainerCluster.java @@ -25,12 +25,14 @@ public class ConfluentKafkaContainerCluster implements Startable { private final Collection brokers; public ConfluentKafkaContainerCluster(String confluentPlatformVersion, int brokersNum, int internalTopicsRf) { - if (brokersNum < 0) { + if (brokersNum <= 0) { throw new IllegalArgumentException("brokersNum '" + brokersNum + "' must be greater than 0"); } - if (internalTopicsRf < 0 || internalTopicsRf > brokersNum) { + if (internalTopicsRf <= 0 || internalTopicsRf > brokersNum) { throw new IllegalArgumentException( - "internalTopicsRf '" + internalTopicsRf + "' must be less than brokersNum and greater than 0" + "internalTopicsRf '" + + internalTopicsRf + + "' must be less than or equal to brokersNum and greater than 0" ); } @@ -100,6 +102,6 @@ public void start() { @Override public void stop() { - this.brokers.stream().parallel().forEach(GenericContainer::stop); + this.brokers.parallelStream().forEach(GenericContainer::stop); } } diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java index 403d087af3e..aa22cceadb0 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerCluster.java @@ -31,12 +31,14 @@ public class KafkaContainerCluster implements Startable { private final Collection brokers; public KafkaContainerCluster(String confluentPlatformVersion, int brokersNum, int internalTopicsRf) { - if (brokersNum < 0) { + if (brokersNum <= 0) { throw new IllegalArgumentException("brokersNum '" + brokersNum + "' must be greater than 0"); } - if (internalTopicsRf < 0 || internalTopicsRf > brokersNum) { + if (internalTopicsRf <= 0 || internalTopicsRf > brokersNum) { throw new IllegalArgumentException( - "internalTopicsRf '" + internalTopicsRf + "' must be less than brokersNum and greater than 0" + "internalTopicsRf '" + + internalTopicsRf + + "' must be less than or equal to brokersNum and greater than 0" ); } diff --git a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java index f42e3c5b1ba..264f751ecc6 100644 --- a/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java +++ b/examples/kafka-cluster/src/test/java/com/example/kafkacluster/KafkaContainerKraftCluster.java @@ -25,12 +25,14 @@ public class KafkaContainerKraftCluster implements Startable { private final Collection brokers; public KafkaContainerKraftCluster(String confluentPlatformVersion, int brokersNum, int internalTopicsRf) { - if (brokersNum < 0) { + if (brokersNum <= 0) { throw new IllegalArgumentException("brokersNum '" + brokersNum + "' must be greater than 0"); } - if (internalTopicsRf < 0 || internalTopicsRf > brokersNum) { + if (internalTopicsRf <= 0 || internalTopicsRf > brokersNum) { throw new IllegalArgumentException( - "internalTopicsRf '" + internalTopicsRf + "' must be less than brokersNum and greater than 0" + "internalTopicsRf '" + + internalTopicsRf + + "' must be less than or equal to brokersNum and greater than 0" ); } @@ -101,6 +103,6 @@ public void start() { @Override public void stop() { - this.brokers.stream().parallel().forEach(GenericContainer::stop); + this.brokers.parallelStream().forEach(GenericContainer::stop); } } From 860f58d4d0542a90061872a1f9045227e2962d49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 14 Aug 2025 15:10:25 -0600 Subject: [PATCH 0681/1224] Fix grafana docs (#10605) --- docs/modules/grafana.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/modules/grafana.md b/docs/modules/grafana.md index b1ec7f284ba..f31984ea7ce 100644 --- a/docs/modules/grafana.md +++ b/docs/modules/grafana.md @@ -10,6 +10,8 @@ You can start a Grafana OTel LGTM container instance from any Java application b [Grafana Otel LGTM container](../../modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java) inside_block:container +## Adding this module to your project dependencies + Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" From 615332fdf28645baa2b2373b9339a8d89f0a54fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 14 Aug 2025 16:18:19 -0600 Subject: [PATCH 0682/1224] Fix redpanda docs link (#10606) --- docs/modules/redpanda.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/redpanda.md b/docs/modules/redpanda.md index 2ce4a284836..9c7b7b3fb86 100644 --- a/docs/modules/redpanda.md +++ b/docs/modules/redpanda.md @@ -45,7 +45,7 @@ Below is an example of how to create the `AdminClient`: There are scenarios where additional listeners are needed because the consumer/producer can be another container in the same network or a different process where the port to connect differs from the default -exposed port `9092`. E.g [Toxiproxy](../../docs/modules/toxiproxy.md). +exposed port `9092`. E.g [Toxiproxy](../modules/toxiproxy.md). [Register additional listener](../../modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java) inside_block:registerListener From efb858457e050d84a83af2775c1f4ae3815a6456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 14 Aug 2025 17:06:09 -0600 Subject: [PATCH 0683/1224] Improve database docs (#10607) --- docs/modules/databases/clickhouse.md | 10 +++ docs/modules/databases/cockroachdb.md | 10 +++ docs/modules/databases/cratedb.md | 10 +++ docs/modules/databases/databend.md | 10 +++ docs/modules/databases/db2.md | 26 +++----- docs/modules/databases/mariadb.md | 10 +++ docs/modules/databases/mssqlserver.md | 22 +++---- docs/modules/databases/mysql.md | 10 +++ docs/modules/databases/oceanbase.md | 10 +++ docs/modules/databases/oraclefree.md | 9 ++- docs/modules/databases/oraclexe.md | 9 ++- docs/modules/databases/orientdb.md | 42 ++----------- docs/modules/databases/postgres.md | 10 +++ docs/modules/databases/questdb.md | 11 +++- docs/modules/databases/tidb.md | 10 +++ docs/modules/databases/timeplus.md | 10 +++ docs/modules/databases/trino.md | 63 ++----------------- docs/modules/databases/yugabytedb.md | 17 +---- .../clickhouse/ClickHouseContainerTest.java | 5 +- .../cockroachdb/SimpleCockroachDBTest.java | 5 +- .../junit/cratedb/SimpleCrateDBTest.java | 5 +- .../databend/DatabendContainerTest.java | 5 +- .../junit/db2/SimpleDb2Test.java | 5 +- .../junit/mariadb/SimpleMariaDBTest.java | 5 +- .../mssqlserver/SimpleMSSQLServerTest.java | 8 ++- .../junit/mysql/SimpleMySQLTest.java | 6 +- .../oceanbase/SimpleOceanBaseCETest.java | 47 +++++++------- .../junit/oracle/SimpleOracleTest.java | 9 +-- .../junit/oracle/SimpleOracleTest.java | 7 ++- .../containers/OrientDBContainerTest.java | 33 +++++----- .../postgresql/SimplePostgreSQLTest.java | 5 +- .../junit/questdb/SimpleQuestDBTest.java | 5 +- .../junit/tidb/SimpleTiDBTest.java | 5 +- .../timeplus/TimeplusContainerTest.java | 5 +- .../containers/TrinoContainerTest.java | 5 +- .../junit/yugabytedb/YugabyteDBYCQLTest.java | 2 - .../junit/yugabytedb/YugabyteDBYSQLTest.java | 2 - 37 files changed, 250 insertions(+), 218 deletions(-) diff --git a/docs/modules/databases/clickhouse.md b/docs/modules/databases/clickhouse.md index b3494867edf..204e8434b90 100644 --- a/docs/modules/databases/clickhouse.md +++ b/docs/modules/databases/clickhouse.md @@ -1,5 +1,15 @@ # Clickhouse Module +Testcontainers module for [ClickHouse](https://hub.docker.com/r/clickhouse/clickhouse-server) + +## Usage example + +You can start a ClickHouse container instance from any Java application by using: + + +[Container definition](../../../modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java) inside_block:container + + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/cockroachdb.md b/docs/modules/databases/cockroachdb.md index 45e3f75b86c..ce25ab016d5 100644 --- a/docs/modules/databases/cockroachdb.md +++ b/docs/modules/databases/cockroachdb.md @@ -1,5 +1,15 @@ # CockroachDB Module +Testcontainers module for [CockroachDB](https://hub.docker.com/r/cockroachdb/cockroach) + +## Usage example + +You can start a CockroachDB container instance from any Java application by using: + + +[Container definition](../../../modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## Adding this module to your project dependencies diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md index 74ec23dda00..520f476c178 100644 --- a/docs/modules/databases/cratedb.md +++ b/docs/modules/databases/cratedb.md @@ -1,5 +1,15 @@ # CrateDB Module +Testcontainers module for [CrateDB](https://hub.docker.com/_/crate) + +## Usage example + +You can start a CrateDB container instance from any Java application by using: + + +[Container definition](../../../modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## Adding this module to your project dependencies diff --git a/docs/modules/databases/databend.md b/docs/modules/databases/databend.md index c399dc2bb51..3dae2740796 100644 --- a/docs/modules/databases/databend.md +++ b/docs/modules/databases/databend.md @@ -1,5 +1,15 @@ # Databend Module +Testcontainers module for [Databend](https://hub.docker.com/r/datafuselabs/databend) + +## Usage example + +You can start a Databend container instance from any Java application by using: + + +[Container definition](../../../modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java) inside_block:container + + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/db2.md b/docs/modules/databases/db2.md index 945536cac05..4017cbf7408 100644 --- a/docs/modules/databases/db2.md +++ b/docs/modules/databases/db2.md @@ -1,34 +1,22 @@ # DB2 Module -!!! 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. - -See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +Testcontainers module for [DB2](https://hub.docker.com/r/ibmcom/db2) ## Usage example -Running DB2 as a stand-in for in a test: +You can start a DB2 container instance from any Java application by using: -```java -public class SomeTest { - - @ClassRule - public Db2Container db2 = new Db2Container() - .acceptLicense(); - - @Test - public void someTestMethod() { - String url = db2.getJdbcUrl(); - - ... create a connection and run test as normal - } -``` + +[Container definition](../../../modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java) inside_block:container + !!! warning "EULA Acceptance" Due to licencing restrictions you are required to accept an EULA for this container image. To indicate that you accept the DB2 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: `ibmcom/db2:11.5.0.0a` (or, if you are overriding the docker image name/tag, update accordingly). Please see the [`ibmcom/db2` image documentation](https://hub.docker.com/r/ibmcom/db2) for a link to the EULA document. +See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/mariadb.md b/docs/modules/databases/mariadb.md index 25367d629bd..48058d187f6 100644 --- a/docs/modules/databases/mariadb.md +++ b/docs/modules/databases/mariadb.md @@ -1,5 +1,15 @@ # MariaDB Module +Testcontainers module for [MariaDB](https://hub.docker.com/_/mariadb) + +## Usage example + +You can start a MySQL container instance from any Java application by using: + + +[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## MariaDB `root` user password diff --git a/docs/modules/databases/mssqlserver.md b/docs/modules/databases/mssqlserver.md index 9d0912f2563..1bc71def3b8 100644 --- a/docs/modules/databases/mssqlserver.md +++ b/docs/modules/databases/mssqlserver.md @@ -1,30 +1,22 @@ # MS SQL Server Module -See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +Testcontainers module for [MS SQL Server](https://mcr.microsoft.com/en-us/artifact/mar/mssql/server/) ## Usage example -Running MS SQL Server as a stand-in for in a test: - -```java -public class SomeTest { - - @Rule - public MSSQLServerContainer mssqlserver = new MSSQLServerContainer() - .acceptLicense(); - - @Test - public void someTestMethod() { - String url = mssqlserver.getJdbcUrl(); +You can start a MS SQL Server container instance from any Java application by using: - ... create a connection and run test as normal -``` + +[Container definition](../../../modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java) inside_block:container + !!! 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, 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. +See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/mysql.md b/docs/modules/databases/mysql.md index 9d03d52b109..a6af2eef735 100644 --- a/docs/modules/databases/mysql.md +++ b/docs/modules/databases/mysql.md @@ -1,5 +1,15 @@ # MySQL Module +Testcontainers module for [MySQL](https://hub.docker.com/_/mysql) + +## Usage example + +You can start a MySQL container instance from any Java application by using: + + +[Container definition](../../../modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## Overriding MySQL my.cnf settings diff --git a/docs/modules/databases/oceanbase.md b/docs/modules/databases/oceanbase.md index b90a492a6e4..7715f0d90fc 100644 --- a/docs/modules/databases/oceanbase.md +++ b/docs/modules/databases/oceanbase.md @@ -1,5 +1,15 @@ # OceanBase Module +Testcontainers module for [OceanBase](https://hub.docker.com/r/oceanbase/oceanbase-ce) + +## Usage example + +You can start an OceanBase container instance from any Java application by using: + + +[Container definition](../../../modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## Adding this module to your project dependencies diff --git a/docs/modules/databases/oraclefree.md b/docs/modules/databases/oraclefree.md index c85d672f140..63e7f8391fd 100644 --- a/docs/modules/databases/oraclefree.md +++ b/docs/modules/databases/oraclefree.md @@ -1,14 +1,17 @@ # Oracle Database Free Module -See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +Testcontainers module for [Oracle Free](https://hub.docker.com/r/gvenzl/oracle-free) ## Usage example -You can use `OracleContainer` like any other JDBC container: +You can start an Oracle-Free container instance from any Java application by using: + -[Container creation](../../../modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java) inside_block:constructor +[Container creation](../../../modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java) inside_block:container +See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/oraclexe.md b/docs/modules/databases/oraclexe.md index bfc06d9a106..fe6176a5bb1 100644 --- a/docs/modules/databases/oraclexe.md +++ b/docs/modules/databases/oraclexe.md @@ -1,14 +1,17 @@ # Oracle-XE Module -See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +Testcontainers module for [Oracle XE](https://hub.docker.com/r/gvenzl/oracle-xe) ## Usage example -You can use `OracleContainer` like any other JDBC container: +You can start an Oracle-XE container instance from any Java application by using: + -[Container creation](../../../modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java) inside_block:constructor +[Container creation](../../../modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java) inside_block:container +See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/orientdb.md b/docs/modules/databases/orientdb.md index 57839cd99f0..40a26100ae1 100644 --- a/docs/modules/databases/orientdb.md +++ b/docs/modules/databases/orientdb.md @@ -1,46 +1,14 @@ # OrientDB Module -!!! 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 [OrientDB](https://orientdb.org/download) using Testcontainers. - -Note that it's based on the [official Docker image](https://hub.docker.com/_/orientdb/) provided by OrientDB. +Testcontainers module for [OrientDB](https://hub.docker.com/_/orientdb/) ## Usage example -Declare your Testcontainers instance as a `@ClassRule` or `@Rule` in a JUnit 4 test or as static or member attribute of a JUnit 5 test annotated with `@Container` as you would with other Testcontainers. -You can call `getDbUrl()` OrientDB container and build the `ODatabaseSession` by your own, but a more useful `getSession()` method is provided. -On the JVM you would most likely use the [Java driver](https://github.com/). - -The following example uses the JUnit 5 extension `@Testcontainers` and demonstrates both the usage of the Java Client: - -=== "JUnit 5 example" - ```java - @Testcontainers - public class ExampleTest { - - @Container - private static OrientDBContainer container = new OrientDBContainer(); - - @Test - void testDbCreation() { - - final ODatabaseSession session = container.getSession(); - - session.command("CREATE CLASS Person EXTENDS V"); - session.command("INSERT INTO Person set name='john'"); - session.command("INSERT INTO Person set name='jane'"); - - assertThat(session.query("SELECT FROM Person").stream()).hasSize(2); - } - - } - ``` - -You are not limited to Unit tests and can of course use an instance of the OrientDB Testcontainers implementation in vanilla Java code as well. +You can start an OrientDB container instance from any Java application by using: + +[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java) inside_block:container + ## Adding this module to your project dependencies diff --git a/docs/modules/databases/postgres.md b/docs/modules/databases/postgres.md index d07e77937b9..e936205d4cb 100644 --- a/docs/modules/databases/postgres.md +++ b/docs/modules/databases/postgres.md @@ -1,5 +1,15 @@ # Postgres Module +Testcontainers module for [PostgresSQL](https://hub.docker.com/_/postgres) + +## Usage example + +You can start a PostgreSQL container instance from any Java application by using: + + +[Container creation](../../../modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## Compatible images diff --git a/docs/modules/databases/questdb.md b/docs/modules/databases/questdb.md index 8783dd4b757..f1a436fc26d 100644 --- a/docs/modules/databases/questdb.md +++ b/docs/modules/databases/questdb.md @@ -1,7 +1,14 @@ # QuestDB Module -Testcontainers module for [QuestDB](https://github.com/questdb/questdb). QuestDB is a high-performance, open-source SQL -database for applications in financial services, IoT, machine learning, DevOps and observability. +Testcontainers module for [QuestDB](https://hub.docker.com/r/questdb/questdb) + +## Usage example + +You can start a QuestDB container instance from any Java application by using: + + +[Container creation](../../../modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java) inside_block:container + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. diff --git a/docs/modules/databases/tidb.md b/docs/modules/databases/tidb.md index 01c6b4cfcd4..c203f3155bb 100644 --- a/docs/modules/databases/tidb.md +++ b/docs/modules/databases/tidb.md @@ -1,5 +1,15 @@ # TiDB Module +Testcontainers module for [TiDB](https://hub.docker.com/r/pingcap/tidb) + +## Usage example + +You can start a TiDB container instance from any Java application by using: + + +[Container creation](../../../modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java) inside_block:container + + See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. ## Adding this module to your project dependencies diff --git a/docs/modules/databases/timeplus.md b/docs/modules/databases/timeplus.md index 4f5cd4106a3..fd94da043ff 100644 --- a/docs/modules/databases/timeplus.md +++ b/docs/modules/databases/timeplus.md @@ -1,5 +1,15 @@ # Timeplus Module +Testcontainers module for [Timeplus](https://hub.docker.com/r/timeplus/timeplusd) + +## Usage example + +You can start a Timeplus container instance from any Java application by using: + + +[Container creation](../../../modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java) inside_block:container + + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/trino.md b/docs/modules/databases/trino.md index b6aeddafb40..5ea9b2d8ab3 100644 --- a/docs/modules/databases/trino.md +++ b/docs/modules/databases/trino.md @@ -1,67 +1,16 @@ # Trino Module -!!! 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. - -See [Database containers](./index.md) for documentation and usage that is common to all database container types. +Testcontainers module for [Trino](https://hub.docker.com/r/trinodb/trino) ## Usage example -Running Trino as a stand-in for in a test: - -```java -public class SomeTest { - - @Rule - public TrinoContainer trino = new TrinoContainer(); - - @Test - public void someTestMethod() { - String url = trino.getJdbcUrl(); - - ... create a connection and run test as normal -``` +You can start a Trino container instance from any Java application by using: -Trino comes with several catalogs preconfigured. Most useful ones for testing are + +[Container creation](../../../modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java) inside_block:container + -* `tpch` catalog using the [Trino TPCH Connector](https://trino.io/docs/current/connector/tpch.html). - This is a read-only catalog that defines standard TPCH schema, so is available for querying without a need - to create any tables. -* `memory` catalog using the [Trino Memory Connector](https://trino.io/docs/current/connector/memory.html). - This catalog can be used for creating schemas and tables and does not require any storage, as everything - is stored fully in-memory. - -Example test using the `tpch` and `memory` catalogs: - -```java -public class SomeTest { - @Rule - public TrinoContainer trino = new TrinoContainer(); - - @Test - public void queryMemoryAndTpchConnectors() throws SQLException { - try (Connection connection = trino.createConnection(); - Statement statement = connection.createStatement()) { - // Prepare data - statement.execute("CREATE TABLE memory.default.table_with_array AS SELECT 1 id, ARRAY[1, 42, 2, 42, 4, 42] my_array"); - - // Query Trino using newly created table and a builtin connector - try (ResultSet resultSet = statement.executeQuery("" + - "SELECT nationkey, element " + - "FROM tpch.tiny.nation " + - "JOIN memory.default.table_with_array twa ON nationkey = twa.id " + - "LEFT JOIN UNNEST(my_array) a(element) ON true " + - "ORDER BY element OFFSET 1 FETCH NEXT 3 ROWS WITH TIES ")) { - List actualElements = new ArrayList<>(); - while (resultSet.next()) { - actualElements.add(resultSet.getInt("element")); - } - Assert.assertEquals(Arrays.asList(2, 4, 42, 42, 42), actualElements); - } - } - } -} -``` +See [Database containers](./index.md) for documentation and usage that is common to all database container types. ## Adding this module to your project dependencies diff --git a/docs/modules/databases/yugabytedb.md b/docs/modules/databases/yugabytedb.md index 4ab3436b57c..3b7130a2958 100644 --- a/docs/modules/databases/yugabytedb.md +++ b/docs/modules/databases/yugabytedb.md @@ -1,11 +1,11 @@ # YugabyteDB Module -!!! 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. +Testcontainers module for [YugabyteDB](https://hub.docker.com/r/yugabytedb/yugabyte) See [Database containers](./index.md) for documentation and usage that is common to all database container types. -YugabyteDB supports two APIs. +YugabyteDB supports two APIs. + - Yugabyte Structured Query Language [YSQL](https://docs.yugabyte.com/latest/api/ysql/) is a fully-relational API that is built by the PostgreSQL code - Yugabyte Cloud Query Language [YCQL](https://docs.yugabyte.com/latest/api/ycql/) is a semi-relational SQL API that has its roots in the Cassandra Query Language @@ -17,12 +17,6 @@ YugabyteDB supports two APIs. [Creating a YSQL container](../../../modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java) inside_block:creatingYSQLContainer - - -[Starting a YSQL container](../../../modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java) inside_block:startingYSQLContainer - - - ### YCQL API @@ -30,11 +24,6 @@ YugabyteDB supports two APIs. - -[Starting a YCQL container](../../../modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java) inside_block:startingYCQLContainer - - - ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java b/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java index 0e7a3d1c119..ff20917e009 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java @@ -20,7 +20,10 @@ public class ClickHouseContainerTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (ClickHouseContainer clickhouse = new ClickHouseContainer("clickhouse/clickhouse-server:21.11-alpine")) { + try ( // container { + ClickHouseContainer clickhouse = new ClickHouseContainer("clickhouse/clickhouse-server:21.11-alpine") + // } + ) { clickhouse.start(); ResultSet resultSet = performQuery(clickhouse, "SELECT 1"); diff --git a/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java b/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java index 9ea8dd6c770..12c25738e45 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 @@ -22,7 +22,10 @@ public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (CockroachContainer cockroach = new CockroachContainer(CockroachDBTestImages.COCKROACHDB_IMAGE)) { + try ( // container { + CockroachContainer cockroach = new CockroachContainer("cockroachdb/cockroach:v22.2.3") + // } + ) { cockroach.start(); ResultSet resultSet = performQuery(cockroach, "SELECT 1"); diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java index c36b1432100..40f2c667711 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java @@ -20,7 +20,10 @@ public class SimpleCrateDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (CrateDBContainer cratedb = new CrateDBContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE)) { + try ( // container { + CrateDBContainer cratedb = new CrateDBContainer("crate:5.2.5") + // } + ) { cratedb.start(); ResultSet resultSet = performQuery(cratedb, "SELECT 1"); diff --git a/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java b/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java index 92f4842d119..66f3504e725 100644 --- a/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java +++ b/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java @@ -12,7 +12,10 @@ public class DatabendContainerTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (DatabendContainer databend = new DatabendContainer("datafuselabs/databend:v1.2.615")) { + try ( // container { + DatabendContainer databend = new DatabendContainer("datafuselabs/databend:v1.2.615") + // } + ) { databend.start(); ResultSet resultSet = performQuery(databend, "SELECT 1"); 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 2cffbdb117a..5f8763b1e19 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 @@ -14,7 +14,10 @@ public class SimpleDb2Test extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (Db2Container db2 = new Db2Container(Db2TestImages.DB2_IMAGE).acceptLicense()) { + try ( // container { + Db2Container db2 = new Db2Container("ibmcom/db2:11.5.0.0a").acceptLicense() + // } + ) { db2.start(); ResultSet resultSet = performQuery(db2, "SELECT 1 FROM SYSIBM.SYSDUMMY1"); 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 d4bcc529cbc..2651615928c 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 @@ -25,7 +25,10 @@ public class SimpleMariaDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (MariaDBContainer mariadb = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE)) { + try ( // container { + MariaDBContainer mariadb = new MariaDBContainer<>("mariadb:10.3.39") + // } + ) { mariadb.start(); ResultSet resultSet = performQuery(mariadb, "SELECT 1"); 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 2827544cade..943eff30a53 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 @@ -17,8 +17,12 @@ public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try ( - MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE) + try ( // container { + MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>( + "mcr.microsoft.com/mssql/server:2022-CU20-ubuntu-22.04" + ) + .acceptLicense() + // } ) { mssqlServer.start(); ResultSet resultSet = performQuery(mssqlServer, "SELECT 1"); 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 5de23504584..085fdf074cb 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 @@ -36,9 +36,9 @@ public class SimpleMySQLTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try ( - MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) - .withLogConsumer(new Slf4jLogConsumer(logger)) + try ( // container { + MySQLContainer mysql = new MySQLContainer<>("mysql:8.0.36") + // } ) { mysql.start(); diff --git a/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java b/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java index efe7ead90bd..46619f328be 100644 --- a/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java +++ b/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java @@ -1,9 +1,6 @@ package org.testcontainers.oceanbase; import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -13,33 +10,31 @@ public class SimpleOceanBaseCETest extends AbstractContainerDatabaseTest { - private static final Logger logger = LoggerFactory.getLogger(SimpleOceanBaseCETest.class); - - private final OceanBaseCEContainerProvider containerProvider = new OceanBaseCEContainerProvider(); - - @SuppressWarnings("resource") - private OceanBaseCEContainer testContainer() { - return ((OceanBaseCEContainer) containerProvider.newInstance()).withLogConsumer(new Slf4jLogConsumer(logger)); - } + private static final String IMAGE = "oceanbase/oceanbase-ce:4.2.1.8-108000022024072217"; @Test public void testSimple() throws SQLException { - try (OceanBaseCEContainer container = testContainer()) { - container.start(); - - ResultSet resultSet = performQuery(container, "SELECT 1"); + try ( // container { + OceanBaseCEContainer oceanbase = new OceanBaseCEContainer( + "oceanbase/oceanbase-ce:4.2.1.8-108000022024072217" + ) + // } + ) { + oceanbase.start(); + + ResultSet resultSet = performQuery(oceanbase, "SELECT 1"); int resultSetInt = resultSet.getInt(1); assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); - assertHasCorrectExposedAndLivenessCheckPorts(container); + assertHasCorrectExposedAndLivenessCheckPorts(oceanbase); } } @Test public void testExplicitInitScript() throws SQLException { - try (OceanBaseCEContainer container = testContainer().withInitScript("init.sql")) { - container.start(); + try (OceanBaseCEContainer oceanbase = new OceanBaseCEContainer(IMAGE).withInitScript("init.sql")) { + oceanbase.start(); - ResultSet resultSet = performQuery(container, "SELECT foo FROM bar"); + ResultSet resultSet = performQuery(oceanbase, "SELECT foo FROM bar"); String firstColumnValue = resultSet.getString(1); assertThat(firstColumnValue).as("Value from init script should equal real value").isEqualTo("hello world"); } @@ -47,21 +42,21 @@ public void testExplicitInitScript() throws SQLException { @Test public void testWithAdditionalUrlParamInJdbcUrl() { - try (OceanBaseCEContainer container = testContainer().withUrlParam("useSSL", "false")) { - container.start(); + try (OceanBaseCEContainer oceanbase = new OceanBaseCEContainer(IMAGE).withUrlParam("useSSL", "false")) { + oceanbase.start(); - String jdbcUrl = container.getJdbcUrl(); + String jdbcUrl = oceanbase.getJdbcUrl(); assertThat(jdbcUrl).contains("?"); assertThat(jdbcUrl).contains("useSSL=false"); } } - private void assertHasCorrectExposedAndLivenessCheckPorts(OceanBaseCEContainer container) { + private void assertHasCorrectExposedAndLivenessCheckPorts(OceanBaseCEContainer oceanbase) { int sqlPort = 2881; int rpcPort = 2882; - assertThat(container.getExposedPorts()).containsExactlyInAnyOrder(sqlPort, rpcPort); - assertThat(container.getLivenessCheckPortNumbers()) - .containsExactlyInAnyOrder(container.getMappedPort(sqlPort), container.getMappedPort(rpcPort)); + assertThat(oceanbase.getExposedPorts()).containsExactlyInAnyOrder(sqlPort, rpcPort); + assertThat(oceanbase.getLivenessCheckPortNumbers()) + .containsExactlyInAnyOrder(oceanbase.getMappedPort(sqlPort), oceanbase.getMappedPort(rpcPort)); } } diff --git a/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java b/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java index 45ed72cb622..a9c3bce593a 100644 --- a/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java +++ b/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java @@ -13,7 +13,7 @@ public class SimpleOracleTest extends AbstractContainerDatabaseTest { - public static final DockerImageName ORACLE_DOCKER_IMAGE_NAME = DockerImageName.parse( + private static final DockerImageName ORACLE_DOCKER_IMAGE_NAME = DockerImageName.parse( "gvenzl/oracle-free:slim-faststart" ); @@ -33,7 +33,10 @@ private void runTest(OracleContainer container, String databaseName, String user @Test public void testDefaultSettings() throws SQLException { - try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME)) { + try ( // container { + OracleContainer oracle = new OracleContainer("gvenzl/oracle-free:slim-faststart") + // } + ) { runTest(oracle, "freepdb1", "test", "test"); // Match against the last '/' @@ -52,12 +55,10 @@ public void testPluggableDatabase() throws SQLException { @Test public void testPluggableDatabaseAndCustomUser() throws SQLException { try ( - // constructor { OracleContainer oracle = new OracleContainer("gvenzl/oracle-free:slim-faststart") .withDatabaseName("testDB") .withUsername("testUser") .withPassword("testPassword") - // } ) { runTest(oracle, "testDB", "testUser", "testPassword"); } diff --git a/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java b/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java index 82ef9846ab2..eb63442c06e 100644 --- a/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java +++ b/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java @@ -33,7 +33,10 @@ private void runTest(OracleContainer container, String databaseName, String user @Test public void testDefaultSettings() throws SQLException { - try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME);) { + try ( // container { + OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21-slim-faststart") + // } + ) { runTest(oracle, "xepdb1", "test", "test"); // Match against the last '/' @@ -52,12 +55,10 @@ public void testPluggableDatabase() throws SQLException { @Test public void testPluggableDatabaseAndCustomUser() throws SQLException { try ( - // constructor { OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21-slim-faststart") .withDatabaseName("testDB") .withUsername("testUser") .withPassword("testPassword") - // } ) { runTest(oracle, "testDB", "testUser", "testPassword"); } 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 d370dc71472..ca520983e71 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java @@ -13,11 +13,14 @@ public class OrientDBContainerTest { @Test public void shouldReturnTheSameSession() { - try (OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE)) { - container.start(); + try ( // container { + OrientDBContainer orientdb = new OrientDBContainer("orientdb:3.2.0-tp3") + // } + ) { + orientdb.start(); - final ODatabaseSession session = container.getSession(); - final ODatabaseSession session2 = container.getSession(); + final ODatabaseSession session = orientdb.getSession(); + final ODatabaseSession session2 = orientdb.getSession(); assertThat(session).isSameAs(session2); } @@ -25,10 +28,10 @@ public void shouldReturnTheSameSession() { @Test public void shouldInitializeWithCommands() { - try (OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE)) { - container.start(); + try (OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE)) { + orientdb.start(); - final ODatabaseSession session = container.getSession(); + final ODatabaseSession session = orientdb.getSession(); session.command("CREATE CLASS Person EXTENDS V"); session.command("INSERT INTO Person set name='john'"); @@ -41,15 +44,15 @@ public void shouldInitializeWithCommands() { @Test public void shouldQueryWithGremlin() { try ( - OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE) + OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE) .withCopyFileToContainer( MountableFile.forClasspathResource("orientdb-server-config.xml"), "/orientdb/config/orientdb-server-config.xml" ) ) { - container.start(); + orientdb.start(); - final ODatabaseSession session = container.getSession("admin", "admin"); + final ODatabaseSession session = orientdb.getSession("admin", "admin"); session.command("CREATE CLASS Person EXTENDS V"); session.command("INSERT INTO Person set name='john'"); @@ -62,16 +65,16 @@ public void shouldQueryWithGremlin() { @Test public void shouldInitializeDatabaseFromScript() { try ( - OrientDBContainer container = new OrientDBContainer(ORIENTDB_IMAGE) + OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE) .withScriptPath("initscript.osql") .withDatabaseName("persons") ) { - container.start(); + orientdb.start(); - assertThat(container.getDbUrl()) - .isEqualTo("remote:" + container.getHost() + ":" + container.getMappedPort(2424) + "/persons"); + assertThat(orientdb.getDbUrl()) + .isEqualTo("remote:" + orientdb.getHost() + ":" + orientdb.getMappedPort(2424) + "/persons"); - final ODatabaseSession session = container.getSession(); + final ODatabaseSession session = orientdb.getSession(); assertThat(session.query("SELECT FROM Person").stream()).hasSize(4); } 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 250f19d87a0..53585fec327 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 @@ -21,7 +21,10 @@ public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE)) { + try ( // container { + PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:9.6.12") + // } + ) { postgres.start(); ResultSet resultSet = performQuery(postgres, "SELECT 1"); diff --git a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java index 16198740c0e..f91f17f14b4 100644 --- a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java +++ b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java @@ -26,7 +26,10 @@ public class SimpleQuestDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (QuestDBContainer questDB = new QuestDBContainer(QuestDBTestImages.QUESTDB_IMAGE)) { + try ( // container { + QuestDBContainer questDB = new QuestDBContainer("questdb/questdb:6.5.3") + // } + ) { questDB.start(); ResultSet resultSet = performQuery(questDB, questDB.getTestQueryString()); diff --git a/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java b/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java index 6b4429afe75..c010e4298fe 100644 --- a/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java +++ b/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java @@ -14,7 +14,10 @@ public class SimpleTiDBTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (TiDBContainer tidb = new TiDBContainer(TiDBTestImages.TIDB_IMAGE)) { + try ( // container { + TiDBContainer tidb = new TiDBContainer("pingcap/tidb:v6.1.0") + // } + ) { tidb.start(); ResultSet resultSet = performQuery(tidb, "SELECT 1"); diff --git a/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java b/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java index 95ecc1c6ef7..5e00f945555 100644 --- a/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java +++ b/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java @@ -13,7 +13,10 @@ public class TimeplusContainerTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (TimeplusContainer timeplus = new TimeplusContainer(TimeplusImages.TIMEPLUS_IMAGE)) { + try ( // container { + TimeplusContainer timeplus = new TimeplusContainer("timeplus/timeplusd:2.3.21") + // } + ) { timeplus.start(); ResultSet resultSet = performQuery(timeplus, "SELECT 1"); diff --git a/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java b/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java index 6ef733ca972..ea25f39dbef 100644 --- a/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java +++ b/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java @@ -13,7 +13,10 @@ public class TrinoContainerTest { @Test public void testSimple() throws Exception { - try (TrinoContainer trino = new TrinoContainer(TrinoTestImages.TRINO_TEST_IMAGE)) { + try ( // container { + TrinoContainer trino = new TrinoContainer("trinodb/trino:352") + // } + ) { trino.start(); try ( Connection connection = trino.createConnection(); diff --git a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java index fe4723b409f..bf8ec2be1ea 100644 --- a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java +++ b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java @@ -30,9 +30,7 @@ public void testSmoke() { .withPassword("cassandra") // } ) { - // startingYCQLContainer { ycqlContainer.start(); - // } assertThat(performQuery(ycqlContainer, "SELECT release_version FROM system.local").wasApplied()) .as("A sample test query succeeds") .isTrue(); diff --git a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java index 94cfaa7f2e4..47a36f4f784 100644 --- a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java +++ b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java @@ -27,9 +27,7 @@ public void testSmoke() throws SQLException { ) // } ) { - // startingYSQLContainer { ysqlContainer.start(); - // } assertThat(performQuery(ysqlContainer, "SELECT 1").getInt(1)) .as("A sample test query succeeds") .isEqualTo(1); From a72adadd38076cb5080c119d294427346051b495 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 15 Aug 2025 11:20:40 -0600 Subject: [PATCH 0684/1224] Fix JDBC docs (#10608) --- 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 05229db4ec0..72539aef44e 100644 --- a/docs/modules/databases/jdbc.md +++ b/docs/modules/databases/jdbc.md @@ -37,11 +37,11 @@ Insert `tc:` after `jdbc:` as follows. Note that the hostname, port and database #### Using CrateDB -`jdbc:tc:cratedb:5.2.3//localhost:5432/crate` +`jdbc:tc:cratedb:5.2.3:///databasename` #### Using DB2 -`jdbc:tc:db2:11.5.0.0a//localhost:5432/crate` +`jdbc:tc:db2:11.5.0.0a:///databasename` #### Using MariaDB From d3e22489d3be6750c7ea090ddb4c2f418ad94a38 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 15 Aug 2025 11:36:49 -0600 Subject: [PATCH 0685/1224] Add Testcontainers JDBC URL section to modules (#10609) --- docs/modules/databases/clickhouse.md | 6 ++++++ docs/modules/databases/cockroachdb.md | 6 ++++++ docs/modules/databases/cratedb.md | 6 ++++++ docs/modules/databases/databend.md | 6 ++++++ docs/modules/databases/db2.md | 6 ++++++ docs/modules/databases/mariadb.md | 6 ++++++ docs/modules/databases/mssqlserver.md | 6 ++++++ docs/modules/databases/mysql.md | 6 ++++++ docs/modules/databases/oceanbase.md | 6 ++++++ docs/modules/databases/oraclefree.md | 6 ++++++ docs/modules/databases/oraclexe.md | 6 ++++++ docs/modules/databases/postgres.md | 9 +++++++++ docs/modules/databases/questdb.md | 6 ++++++ docs/modules/databases/tidb.md | 6 ++++++ docs/modules/databases/timeplus.md | 6 ++++++ docs/modules/databases/trino.md | 6 ++++++ docs/modules/databases/yugabytedb.md | 6 ++++++ 17 files changed, 105 insertions(+) diff --git a/docs/modules/databases/clickhouse.md b/docs/modules/databases/clickhouse.md index 204e8434b90..1ba8a1ff0aa 100644 --- a/docs/modules/databases/clickhouse.md +++ b/docs/modules/databases/clickhouse.md @@ -10,6 +10,12 @@ You can start a ClickHouse container instance from any Java application by using [Container definition](../../../modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java) inside_block:container +### Testcontainers JDBC URL + +`jdbc:tc:clickhouse:18.10.3:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/cockroachdb.md b/docs/modules/databases/cockroachdb.md index ce25ab016d5..258a51ea74c 100644 --- a/docs/modules/databases/cockroachdb.md +++ b/docs/modules/databases/cockroachdb.md @@ -12,6 +12,12 @@ You can start a CockroachDB container instance from any Java application by usin See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:cockroach:v21.2.3:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md index 520f476c178..14c15608904 100644 --- a/docs/modules/databases/cratedb.md +++ b/docs/modules/databases/cratedb.md @@ -12,6 +12,12 @@ You can start a CrateDB container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:cratedb:5.2.3:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/databend.md b/docs/modules/databases/databend.md index 3dae2740796..97b92729241 100644 --- a/docs/modules/databases/databend.md +++ b/docs/modules/databases/databend.md @@ -10,6 +10,12 @@ You can start a Databend container instance from any Java application by using: [Container definition](../../../modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java) inside_block:container +### Testcontainers JDBC URL + +`jdbc:tc:databend:v1.2.615:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/db2.md b/docs/modules/databases/db2.md index 4017cbf7408..fde68a77afe 100644 --- a/docs/modules/databases/db2.md +++ b/docs/modules/databases/db2.md @@ -17,6 +17,12 @@ You can start a DB2 container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:db2:11.5.0.0a:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/mariadb.md b/docs/modules/databases/mariadb.md index 48058d187f6..2968c7a7e13 100644 --- a/docs/modules/databases/mariadb.md +++ b/docs/modules/databases/mariadb.md @@ -12,6 +12,12 @@ You can start a MySQL container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:mariadb:10.3.39:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## MariaDB `root` user password If no custom password is specified, the container will use the default user password `test` for the `root` user as well. diff --git a/docs/modules/databases/mssqlserver.md b/docs/modules/databases/mssqlserver.md index 1bc71def3b8..f12365aaa18 100644 --- a/docs/modules/databases/mssqlserver.md +++ b/docs/modules/databases/mssqlserver.md @@ -17,6 +17,12 @@ You can start a MS SQL Server container instance from any Java application by us See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:sqlserver:2017-CU12:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/mysql.md b/docs/modules/databases/mysql.md index a6af2eef735..825ab42f60c 100644 --- a/docs/modules/databases/mysql.md +++ b/docs/modules/databases/mysql.md @@ -12,6 +12,12 @@ You can start a MySQL container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:mysql:8.0.36:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Overriding MySQL my.cnf settings For MySQL databases, it is possible to override configuration settings using resources on the classpath. Assuming `somepath/mysql_conf_override` diff --git a/docs/modules/databases/oceanbase.md b/docs/modules/databases/oceanbase.md index 7715f0d90fc..c5c82a091fd 100644 --- a/docs/modules/databases/oceanbase.md +++ b/docs/modules/databases/oceanbase.md @@ -12,6 +12,12 @@ You can start an OceanBase container instance from any Java application by using See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:oceanbasece:4.2.1-lts:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/oraclefree.md b/docs/modules/databases/oraclefree.md index 63e7f8391fd..b9ade460a20 100644 --- a/docs/modules/databases/oraclefree.md +++ b/docs/modules/databases/oraclefree.md @@ -12,6 +12,12 @@ You can start an Oracle-Free container instance from any Java application by usi See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:oracle:21-slim-faststart:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/oraclexe.md b/docs/modules/databases/oraclexe.md index fe6176a5bb1..0f018a045fb 100644 --- a/docs/modules/databases/oraclexe.md +++ b/docs/modules/databases/oraclexe.md @@ -12,6 +12,12 @@ You can start an Oracle-XE container instance from any Java application by using See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:oracle:21-slim-faststart:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/postgres.md b/docs/modules/databases/postgres.md index e936205d4cb..043a01bb93e 100644 --- a/docs/modules/databases/postgres.md +++ b/docs/modules/databases/postgres.md @@ -12,6 +12,15 @@ You can start a PostgreSQL container instance from any Java application by using See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +* PostgreSQL: `jdbc:tc:postgresql:9.6.8:///databasename` +* PostGIS: `jdbc:tc:postgis:9.6-2.5:///databasename` +* TimescaleDB: `jdbc:tc:timescaledb:2.1.0-pg13:///databasename` +* PGvector: `jdbc:tc:pgvector:pg16:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Compatible images `PostgreSQLContainer` can also be used with the following images: diff --git a/docs/modules/databases/questdb.md b/docs/modules/databases/questdb.md index f1a436fc26d..6c99e32df2e 100644 --- a/docs/modules/databases/questdb.md +++ b/docs/modules/databases/questdb.md @@ -13,6 +13,12 @@ You can start a QuestDB container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:questdb:6.5.3:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/tidb.md b/docs/modules/databases/tidb.md index c203f3155bb..6ecc12de05b 100644 --- a/docs/modules/databases/tidb.md +++ b/docs/modules/databases/tidb.md @@ -12,6 +12,12 @@ You can start a TiDB container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. +### Testcontainers JDBC URL + +`jdbc:tc:tidb:v6.1.0:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/timeplus.md b/docs/modules/databases/timeplus.md index fd94da043ff..3364f97d509 100644 --- a/docs/modules/databases/timeplus.md +++ b/docs/modules/databases/timeplus.md @@ -10,6 +10,12 @@ You can start a Timeplus container instance from any Java application by using: [Container creation](../../../modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java) inside_block:container +### Testcontainers JDBC URL + +`jdbc:tc:timeplus:2.3.21:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/trino.md b/docs/modules/databases/trino.md index 5ea9b2d8ab3..a7ab7495de8 100644 --- a/docs/modules/databases/trino.md +++ b/docs/modules/databases/trino.md @@ -12,6 +12,12 @@ You can start a Trino container instance from any Java application by using: See [Database containers](./index.md) for documentation and usage that is common to all database container types. +### Testcontainers JDBC URL + +`jdbc:tc:trino:352:///defaultname` + +See [JDBC](./jdbc.md) for documentation. + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/docs/modules/databases/yugabytedb.md b/docs/modules/databases/yugabytedb.md index 3b7130a2958..0824227c937 100644 --- a/docs/modules/databases/yugabytedb.md +++ b/docs/modules/databases/yugabytedb.md @@ -17,6 +17,12 @@ YugabyteDB supports two APIs. [Creating a YSQL container](../../../modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java) inside_block:creatingYSQLContainer +### Testcontainers JDBC URL + +`jdbc:tc:yugabyte:2.14.4.0-b26:///databasename` + +See [JDBC](./jdbc.md) for documentation. + ### YCQL API From 00336f01d2d4bbf9f4eee2e84e0c8a7e0dbe2acc Mon Sep 17 00:00:00 2001 From: Max Hovens <14804474+maxhov@users.noreply.github.com> Date: Sat, 16 Aug 2025 02:13:08 +0200 Subject: [PATCH 0686/1224] Fix support to set a custom database name in Host-less JDBC urls (#10603) Fixes #8319 --- .../org/testcontainers/jdbc/ConnectionUrl.java | 4 ++-- .../testcontainers/jdbc/ConnectionUrlTest.java | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java index e1309f66197..ec606f3ed32 100644 --- a/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java +++ b/modules/jdbc/src/main/java/org/testcontainers/jdbc/ConnectionUrl.java @@ -107,7 +107,7 @@ private void parseUrl() { //In case it matches to the default pattern Matcher dbInstanceMatcher = Patterns.DB_INSTANCE_MATCHING_PATTERN.matcher(dbHostString); if (dbInstanceMatcher.matches()) { - databaseHost = Optional.of(dbInstanceMatcher.group("databaseHost")); + databaseHost = Optional.ofNullable(dbInstanceMatcher.group("databaseHost")); databasePort = Optional.ofNullable(dbInstanceMatcher.group("databasePort")).map(Integer::valueOf); databaseName = Optional.of(dbInstanceMatcher.group("databaseName")); } @@ -227,7 +227,7 @@ public interface Patterns { //Matches to part of string - hostname:port/databasename Pattern DB_INSTANCE_MATCHING_PATTERN = Pattern.compile( - "(?[^:]+)" + + "(?[^:]+)?" + "(:(?[0-9]+))?" + "(" + "(?[:/])" + diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java index 123690d95f6..b6de810e06c 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java @@ -111,4 +111,20 @@ public void testDaemonCapture() { assertThat(url.isInDaemonMode()).as("Daemon flag is set to true.").isTrue(); } + + @Test + public void testHostLessConnectionUrl() { + String urlString = "jdbc:tc:mysql:8.0.36:///databasename?a=b&c=d"; + ConnectionUrl url = ConnectionUrl.newInstance(urlString); + + assertThat(url.getDatabaseType()).as("Database Type value is as expected").isEqualTo("mysql"); + assertThat(url.getImageTag()).as("Database Image tag value is as expected").contains("8.0.36"); + assertThat(url.getQueryString()).as("Query String value is as expected").contains("?a=b&c=d"); + assertThat(url.getDatabaseHost()).as("Database Host value is as expected").isEmpty(); + assertThat(url.getDatabasePort()).as("Database Port value is as expected").isEmpty(); + assertThat(url.getDatabaseName()).as("Database Name value is as expected").contains("databasename"); + + assertThat(url.getQueryParameters()).as("Parameter a is captured").containsEntry("a", "b"); + assertThat(url.getQueryParameters()).as("Parameter c is captured").containsEntry("c", "d"); + } } From c4784534c89f0c5e3bde436f4651bb8692096324 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 15 Aug 2025 18:13:23 -0600 Subject: [PATCH 0687/1224] Remove httpclient5 dependency from clickhouse (#10610) --- modules/clickhouse/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 0b67f29ef2b..039d178fde2 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -10,7 +10,6 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.1', classifier: 'all') - testImplementation 'org.apache.httpcomponents.client5:httpclient5:5.4.2' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'com.clickhouse:client-v2:0.9.1' testImplementation testFixtures(project(':testcontainers-r2dbc')) From ad1cf42ffda880ec97b904b42dcc19261e6632f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Aug 2025 07:12:58 +0000 Subject: [PATCH 0688/1224] Bump io.rest-assured:rest-assured from 5.5.5 to 5.5.6 in /core Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index a4ff15bac01..9b94f587a79 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -120,7 +120,7 @@ dependencies { testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" From 9bf04f4d53ad9a50bb11e92434cc399ac3a764bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 19 Aug 2025 10:46:58 -0600 Subject: [PATCH 0689/1224] Ignore dependencies update --- .github/dependabot.yml | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index b42e02fe2b6..72a6d9110b6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -27,6 +27,9 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "com.gradleup.shadow" + update-types: [ "version-update:semver-major" ] # Explicit entry for each module - package-ecosystem: "gradle" @@ -272,11 +275,17 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.pinecone:pinecone-client" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/pulsar" schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "org.apache.pulsar:pulsar-bom" + update-types: [ "version-update:semver-patch" ] - package-ecosystem: "gradle" directory: "/modules/qdrant" schedule: @@ -400,7 +409,7 @@ updates: - dependency-name: "org.springframework.boot" update-types: [ "version-update:semver-major" ] - dependency-name: "com.diffplug.spotless" - update-types: [ "version-update:semver-minor" ] + update-types: [ "version-update:semver-major", "version-update:semver-minor" ] - dependency-name: "com.hazelcast:hazelcast" update-types: [ "version-update:semver-minor" ] @@ -414,7 +423,7 @@ updates: - dependency-name: "ch.qos.logback:logback-classic" update-types: [ "version-update:semver-minor" ] - dependency-name: "com.diffplug.spotless" - update-types: [ "version-update:semver-minor" ] + update-types: [ "version-update:semver-major", "version-update:semver-minor" ] # GitHub Actions - package-ecosystem: "github-actions" From 26f99f5348c4853cb1b6a325a268b6d52d1807c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 00:07:15 +0000 Subject: [PATCH 0690/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/hivemq Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 9a0fda05afe..5581e6f0a39 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -18,7 +18,7 @@ dependencies { testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } test { From 4a0cf43edac704ad6427ca0eaecbf7ab20851da8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 00:28:11 +0000 Subject: [PATCH 0691/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/milvus Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index b79edac49aa..e8a8939b813 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.milvus:milvus-sdk-java:2.6.1' } From e0bcd3d76540a9591ab87fc00bfb3b7cb679faba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 04:04:05 +0000 Subject: [PATCH 0692/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/r2dbc Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 49f7672bd18..c738f3b6f26 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -8,10 +8,10 @@ dependencies { api project(':testcontainers') api 'io.r2dbc:r2dbc-spi:0.9.0.RELEASE' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') testFixturesImplementation 'io.projectreactor:reactor-core:3.7.8' - testFixturesImplementation 'org.assertj:assertj-core:3.27.3' + testFixturesImplementation 'org.assertj:assertj-core:3.27.4' } From 8cebd06d120775dde55dd466529ecb5534631b4f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:26:38 +0000 Subject: [PATCH 0693/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/mongodb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/mongodb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index ad05dbb2e97..d7af71b9f75 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation("org.mongodb:mongodb-driver-sync:5.1.4") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 2f6a5139aef7276fbccc889b9b8438feffdbc89d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:28:34 +0000 Subject: [PATCH 0694/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/azure Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 13f3f353ba9..4dbffa9ac20 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -6,7 +6,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation platform("com.azure:azure-sdk-bom:1.2.32") testImplementation 'com.azure:azure-cosmos' testImplementation 'com.azure:azure-storage-blob' From 3575dc669b217bcb57885ef311c3311f3b94f528 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:29:06 +0000 Subject: [PATCH 0695/1224] Bump org.assertj:assertj-core in /modules/clickhouse Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/clickhouse/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 039d178fde2..b840e70763b 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.1', classifier: 'all') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.clickhouse:client-v2:0.9.1' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') From 5ded174cedc8b61c8d7a30b1184475d50126c541 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:29:45 +0000 Subject: [PATCH 0696/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/kafka Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 d4fb383c3f3..ebfcca345a4 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.apache.kafka:kafka-clients:3.8.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.google.guava:guava:23.0' testImplementation 'org.awaitility:awaitility:4.3.0' } From bc2490feaa1bc2f41d4d9b82a8a3c24131d9d64c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:35:07 +0000 Subject: [PATCH 0697/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/nginx Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/nginx/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index c05010c45e9..f4c5280d4c2 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') compileOnly 'org.jetbrains:annotations:26.0.2' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 6ec9eb1c60edbd10187e74bf86a97522e6a6fbe8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:35:38 +0000 Subject: [PATCH 0698/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/gcloud Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 9d4c3ecfa8b..f77e46180d6 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -10,5 +10,5 @@ dependencies { testImplementation 'com.google.cloud:google-cloud-pubsub' testImplementation 'com.google.cloud:google-cloud-spanner' testImplementation 'com.google.cloud:google-cloud-bigtable' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 2b7e015479aec5a115f997ff6fdf73f751812c92 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:36:38 +0000 Subject: [PATCH 0699/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/db2 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/db2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 15600ec3856..b50291c201d 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 745900f2702742252490b0f86ca18c9aec4767b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:36:38 +0000 Subject: [PATCH 0700/1224] Bump org.assertj:assertj-core in /modules/cassandra Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cassandra/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index 42c503f6752..cc3b9e81df5 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -11,5 +11,5 @@ dependencies { api "com.datastax.cassandra:cassandra-driver-core:3.10.0" testImplementation 'com.datastax.oss:java-driver-core:4.17.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 8e80936d239aed787cb778d981a1ef17c22ec36c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:37:05 +0000 Subject: [PATCH 0701/1224] Bump org.assertj:assertj-core in /modules/mockserver Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/mockserver/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index 054944d2eb8..fdd75b9f153 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.mock-server:mockserver-client-java:5.15.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' } From fdb3326f72b322e53dcf2a4f67c481df6c5281c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:37:18 +0000 Subject: [PATCH 0702/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/orientdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 587ee684b68..174342606fc 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -5,7 +5,7 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.42" - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.3' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.42" } From 74bd1dd5fcc38799e9c5f6c05b43e1f0683fd30c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:37:20 +0000 Subject: [PATCH 0703/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/grafana Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 483016aa055..19f3fd3df51 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Grafana" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.2' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' From 096fbcf2d9cab2232e85241dd0a493f09970300e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:37:52 +0000 Subject: [PATCH 0704/1224] Bump org.assertj:assertj-core in /modules/jdbc-test Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b5774ce794d..6f98d6a9f24 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -6,7 +6,7 @@ dependencies { api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' - api 'org.assertj:assertj-core:3.27.3' + api 'org.assertj:assertj-core:3.27.4' api 'org.apache.tomcat:tomcat-jdbc:11.0.9' api 'org.vibur:vibur-dbcp:26.0' From 560665b90c546ec021308d380c612a6c80d32fd0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:38:00 +0000 Subject: [PATCH 0705/1224] Bump org.assertj:assertj-core in /modules/elasticsearch Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 5dea480e20b..de679721cf7 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.0" testImplementation "org.elasticsearch.client:transport:7.17.29" - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From c6e535e04c80076be17356cba8b6415340b6aa9f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:38:14 +0000 Subject: [PATCH 0706/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/databend Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 2770b2ccff3..6e57f4bd198 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.databend:databend-jdbc:0.4.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 1edb0e6c14b499122cf49e193f7f5d04cccf1131 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:38:17 +0000 Subject: [PATCH 0707/1224] Bump org.assertj:assertj-core in /modules/database-commons Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 e6bb0697252..47b433e7b2f 100644 --- a/modules/database-commons/build.gradle +++ b/modules/database-commons/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Database-Commons" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From e86fdc342198d3373372bd2903b73a06b997f14b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:38:37 +0000 Subject: [PATCH 0708/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/activemq Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 34217bf1f1a..6ca5e6af78a 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation "org.apache.activemq:activemq-client:6.1.7" testImplementation "org.apache.activemq:artemis-jakarta-client:2.42.0" } From 5e1fabb2fca69260746177bffd7235fee7657bec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:38:38 +0000 Subject: [PATCH 0709/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/neo4j Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 9c7a70454ff..9f347a9e34b 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -34,7 +34,7 @@ dependencies { api project(":testcontainers") testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 155e261590c365e707544676bed1c246e77892e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:39:06 +0000 Subject: [PATCH 0710/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/ldap Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ldap/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ldap/build.gradle b/modules/ldap/build.gradle index 5045bf79266..fa255990be8 100644 --- a/modules/ldap/build.gradle +++ b/modules/ldap/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: LDAP" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.3' } From 69c275a9b63ba438cf6fe594992e83fa43ea4b82 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:39:20 +0000 Subject: [PATCH 0711/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/consul Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/consul/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index f62c74e96aa..a8cb1a0d4ae 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.ecwid.consul:consul-api:1.4.5' testImplementation 'io.rest-assured:rest-assured:5.5.5' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 46bc77d6bebfb13398dd15db0b438679ea2ccdff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:39:26 +0000 Subject: [PATCH 0712/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/vault Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 af9f27c505f..b4d1e4dbe46 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -5,6 +5,6 @@ dependencies { testImplementation 'com.bettercloud:vault-java-driver:5.1.0' testImplementation 'io.rest-assured:rest-assured:5.5.5' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 409fafd2eb3ad17808986f4c57a6f127f81465b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:39:46 +0000 Subject: [PATCH 0713/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/k6 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/k6/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k6/build.gradle b/modules/k6/build.gradle index 0a027d12d55..943208029c6 100644 --- a/modules/k6/build.gradle +++ b/modules/k6/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: k6" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From d84b99d93589b34bc2b6c7ec7c968afb456fa27c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:39:58 +0000 Subject: [PATCH 0714/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/qdrant Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 470004c16ec..0507698069a 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Qdrant" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.qdrant:client:1.15.0' testImplementation platform('io.grpc:grpc-bom:1.73.0') testImplementation 'io.grpc:grpc-stub' From cddf9d28dc3dd85344b503f47fb6b3a2ce636d24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:40:05 +0000 Subject: [PATCH 0715/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/selenium Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/selenium/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index 1b9312d6187..d324b0d7d39 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'org.mortbay.jetty:jetty:6.1.26' testImplementation project(':testcontainers-nginx') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' compileOnly 'org.jetbrains:annotations:26.0.2' } From 4bbb5e475c384c6462fcbf09768db05783ae7076 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:40:31 +0000 Subject: [PATCH 0716/1224] Bump org.assertj:assertj-core in /modules/typesense Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.26.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.26.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/typesense/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/typesense/build.gradle b/modules/typesense/build.gradle index b82022ed9ab..41bb4322a9a 100644 --- a/modules/typesense/build.gradle +++ b/modules/typesense/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: Typesense" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.26.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.typesense:typesense-java:1.3.0' } From 6ae038922c43de021379a27c470b6a7f4a731558 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:40:38 +0000 Subject: [PATCH 0717/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/questdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 954b0300ad5..e57309a6bf3 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -6,7 +6,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.questdb:questdb:9.0.1' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' From abb11af867d245ca35de2a41fef89929558d1bba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:40:47 +0000 Subject: [PATCH 0718/1224] Bump org.assertj:assertj-core in /modules/cockroachdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cockroachdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index a1967c94fbd..264c22eff9e 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 144bf31a8a16a37955b552484c061dcfa89f17c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:41:18 +0000 Subject: [PATCH 0719/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/influxdb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/influxdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index 7a5aa985beb..208ae171ec2 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -5,7 +5,7 @@ dependencies { compileOnly 'org.influxdb:influxdb-java:2.25' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.influxdb:influxdb-java:2.25' testImplementation "com.influxdb:influxdb-client-java:7.3.0" } From e1f1a0206c325a5c094b7eaa3be6cd9103ef1d70 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:41:20 +0000 Subject: [PATCH 0720/1224] Bump org.assertj:assertj-core in /modules/toxiproxy Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index fecefb33421..4a0f055db8c 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -5,7 +5,7 @@ dependencies { api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' testImplementation 'redis.clients:jedis:6.0.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 01fbf019dc24a4df9f24e1ce3461e6d3c1cb8c6e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:41:20 +0000 Subject: [PATCH 0721/1224] Bump org.assertj:assertj-core in /modules/localstack Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 5390d190282..b869e470a89 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation 'software.amazon.awssdk:cloudwatchlogs' testImplementation 'software.amazon.awssdk:lambda' testImplementation 'software.amazon.awssdk:kms' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 78ae99b07bf195519aaf8518c35a04c743cc53b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:41:36 +0000 Subject: [PATCH 0722/1224] Bump org.assertj:assertj-core in /modules/couchbase Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 08636089467..89736e47f81 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation 'com.couchbase.client:java-client:3.8.3' testImplementation 'org.awaitility:awaitility:4.3.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 33dacb3c0d06f92ae555405f0583b07a575058a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:41:45 +0000 Subject: [PATCH 0723/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/solace Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index d9e5c17e94e..5e023b07a67 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.solacesystems:sol-jcsmp:10.27.3' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' From 409c702fc092821f3f4c15bcd7ce85277bc627cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:41:50 +0000 Subject: [PATCH 0724/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/chromadb Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/chromadb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index 5017c481ee2..965872b126f 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: ChromaDB" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' } From 15b472744c63c490ee14c762f0268d3f84ca5e37 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:43:53 +0000 Subject: [PATCH 0725/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /examples Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- examples/cucumber/build.gradle | 2 +- examples/hazelcast/build.gradle | 2 +- examples/immudb/build.gradle | 2 +- examples/kafka-cluster/build.gradle | 2 +- examples/nats/build.gradle | 2 +- examples/neo4j-container/build.gradle | 2 +- examples/ollama-hugging-face/build.gradle | 2 +- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/selenium-container/build.gradle | 2 +- examples/sftp/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- examples/solr-container/build.gradle | 2 +- examples/zookeeper/build.gradle | 2 +- test-support/build.gradle | 2 +- 18 files changed, 18 insertions(+), 18 deletions(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index d5bdd39e3f9..84a6b453811 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -8,5 +8,5 @@ dependencies { testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation "org.seleniumhq.selenium:selenium-api:4.34.0" - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 08bcb4d0580..a9a8452987c 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index f03bc7cdf4c..c0ebfc3e491 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -9,7 +9,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":testcontainers-junit-jupiter") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } test { diff --git a/examples/cucumber/build.gradle b/examples/cucumber/build.gradle index e671b26d454..42da5c4c162 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -18,7 +18,7 @@ dependencies { testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit-platform-engine' testImplementation 'org.testcontainers:testcontainers-selenium' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' } diff --git a/examples/hazelcast/build.gradle b/examples/hazelcast/build.gradle index 9dc09c80253..c5086cc4d20 100644 --- a/examples/hazelcast/build.gradle +++ b/examples/hazelcast/build.gradle @@ -10,7 +10,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'com.hazelcast:hazelcast:5.3.8' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 1d349ba33ec..4c2256983eb 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -10,7 +10,7 @@ dependencies { implementation 'io.codenotary:immudb4j:1.0.1' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:testcontainers-junit-jupiter' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 4483b006709..41dffd5a543 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -11,7 +11,7 @@ dependencies { testAnnotationProcessor "org.projectlombok:lombok:1.18.38" testImplementation 'org.testcontainers:testcontainers-kafka' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 3d8c808a9d7..552d5bc33a4 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.testcontainers:testcontainers' testImplementation 'io.nats:jnats:2.21.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index cb7a334b712..5ba6faf08af 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' testImplementation 'org.testcontainers:testcontainers-neo4j' testImplementation 'org.testcontainers:testcontainers-junit-jupiter' diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index 800136bc628..e47ebf744ab 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { testImplementation 'org.testcontainers:testcontainers-ollama' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 4a7e1896f51..b526c66f241 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testng:testng:7.5.1' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } test { diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index b6a4e47f094..03a5ac6a88b 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers-junit-jupiter' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index 3629b3de78e..f2234e604e6 100644 --- a/examples/selenium-container/build.gradle +++ b/examples/selenium-container/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.testcontainers:testcontainers-selenium' testImplementation 'org.testcontainers:testcontainers-junit-jupiter' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } diff --git a/examples/sftp/build.gradle b/examples/sftp/build.gradle index 31b5cfb7171..d7e2dee0f45 100644 --- a/examples/sftp/build.gradle +++ b/examples/sftp/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'com.github.mwiede:jsch:2.27.2' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 55e77b67388..9c658ca974c 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/solr-container/build.gradle b/examples/solr-container/build.gradle index 8cef396fe61..d0d3944cc0a 100644 --- a/examples/solr-container/build.gradle +++ b/examples/solr-container/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:testcontainers-solr' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } diff --git a/examples/zookeeper/build.gradle b/examples/zookeeper/build.gradle index eb5e0ce45d9..4208f4ac266 100644 --- a/examples/zookeeper/build.gradle +++ b/examples/zookeeper/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.apache.curator:curator-framework:5.9.0' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' diff --git a/test-support/build.gradle b/test-support/build.gradle index 344366da1eb..56fcbd98a92 100644 --- a/test-support/build.gradle +++ b/test-support/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation 'junit:junit:4.13.2' implementation 'org.slf4j:slf4j-api:2.0.17' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 36441c259a813aca3df6978ff4109583ce53b9cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:43:57 +0000 Subject: [PATCH 0726/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/pulsar Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 9aed0587d84..957b210ec86 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -6,7 +6,7 @@ dependencies { testImplementation platform("org.apache.pulsar:pulsar-bom:4.0.5") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { From 46c4507ab518ec92ecde9983454e7cefe116cbb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:44:02 +0000 Subject: [PATCH 0727/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/redpanda Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index e3795d93656..157643fade3 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.freemarker:freemarker:2.3.34' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' testImplementation 'org.awaitility:awaitility:4.3.0' } From 80e6e384cc9855e2d86ff592a878398b48811191 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:44:10 +0000 Subject: [PATCH 0728/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/ollama Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ollama/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index eda3bf5bb7a..ece97e4a389 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: Ollama" dependencies { api project(':testcontainers') - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.5' } From 023a91ea8ff9e75b2097584d4bac1149d31707fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:44:16 +0000 Subject: [PATCH 0729/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/jdbc Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 c45f1bf65d3..08b6b707922 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'org.vibur:vibur-dbcp:26.0' testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.9' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') } From 3afb16090028e94aa0abd56b9c070feecf392e20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:44:24 +0000 Subject: [PATCH 0730/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /smoke-test Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- smoke-test/turbo-mode/build.gradle | 2 +- test-support/build.gradle | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index d5bdd39e3f9..84a6b453811 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -8,5 +8,5 @@ dependencies { testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testImplementation "org.seleniumhq.selenium:selenium-api:4.34.0" - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index 08bcb4d0580..a9a8452987c 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index f03bc7cdf4c..c0ebfc3e491 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -9,7 +9,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":testcontainers-junit-jupiter") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } test { diff --git a/smoke-test/turbo-mode/build.gradle b/smoke-test/turbo-mode/build.gradle index d6578e3db69..fb3f09244fd 100644 --- a/smoke-test/turbo-mode/build.gradle +++ b/smoke-test/turbo-mode/build.gradle @@ -6,7 +6,7 @@ dependencies { testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.3' } diff --git a/test-support/build.gradle b/test-support/build.gradle index 344366da1eb..56fcbd98a92 100644 --- a/test-support/build.gradle +++ b/test-support/build.gradle @@ -1,5 +1,5 @@ dependencies { implementation 'junit:junit:4.13.2' implementation 'org.slf4j:slf4j-api:2.0.17' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 84fd64adde74179039e40c85c990157b0ab406a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:44:36 +0000 Subject: [PATCH 0731/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/timeplus Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/timeplus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index 188edeeb677..5816772e300 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.10' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From a33475f943d91f31599b7b1c6cf963b653725957 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:45:19 +0000 Subject: [PATCH 0732/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/k3s Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index fd52f632cae..ee5ed626dc1 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -8,5 +8,5 @@ dependencies { testImplementation 'io.fabric8:kubernetes-client:7.3.1' testImplementation 'io.kubernetes:client-java:24.0.0-legacy' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 56fa474b80d78982234896b6f7722fd93626f8fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Aug 2025 16:46:17 +0000 Subject: [PATCH 0733/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/minio Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index 8fae8536fb0..cf0798d879a 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation("io.minio:minio:8.5.17") - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' } From 4b9ebdfb31c463e96596ccdbe800632ff9a65246 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:24:32 +0000 Subject: [PATCH 0734/1224] Bump io.rest-assured:rest-assured from 5.5.5 to 5.5.6 in /modules/ollama Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ollama/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index ece97e4a389..a0256ba7150 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' } From dea4b984e85346891cc18c45fc685a94b80e0002 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:48:20 +0000 Subject: [PATCH 0735/1224] Bump io.rest-assured:rest-assured in /modules/mockserver Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/mockserver/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index fdd75b9f153..49aad5f08a1 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.mock-server:mockserver-client-java:5.15.0' testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' } tasks.japicmp { From ee75e8f1e2ebac14aba28ab146d899b5f8571e7e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:48:41 +0000 Subject: [PATCH 0736/1224] Bump io.rest-assured:rest-assured in /modules/chromadb Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/chromadb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index 965872b126f..fca8a86e410 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' } From c46a4dd0d520c330d3246c0a9cd766470d63972e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:51:40 +0000 Subject: [PATCH 0737/1224] Bump io.rest-assured:rest-assured from 5.5.5 to 5.5.6 in /modules/consul Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/consul/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index a8cb1a0d4ae..b1e2b19c212 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers') testImplementation 'com.ecwid.consul:consul-api:1.4.5' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.assertj:assertj-core:3.27.4' } From fdb9fc88ff0de16b8a2f93f88fbf10b51ec2a8eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 19:59:11 +0000 Subject: [PATCH 0738/1224] Bump io.rest-assured:rest-assured from 5.5.5 to 5.5.6 in /modules/vault Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b4d1e4dbe46..84d02ebfa9a 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'com.bettercloud:vault-java-driver:5.1.0' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.assertj:assertj-core:3.27.4' } From 9a4cb4440d43f68bfdd898c795f80482ea4799ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 20:10:22 +0000 Subject: [PATCH 0739/1224] Bump io.rest-assured:rest-assured in /modules/grafana Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 19f3fd3df51..3da855e8043 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.2' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' From 734e696de58c990bd54e2e63f3bb7aa20bdb0887 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 20:28:19 +0000 Subject: [PATCH 0740/1224] Bump io.rest-assured:rest-assured in /modules/redpanda Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 157643fade3..ec254add76f 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -6,6 +6,6 @@ dependencies { testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.awaitility:awaitility:4.3.0' } From 0244fb2bd60e447acd707daf0fd1b3634bab0e9b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Aug 2025 20:55:42 +0000 Subject: [PATCH 0741/1224] Bump io.rest-assured:rest-assured from 5.5.5 to 5.5.6 in /examples Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.5 to 5.5.6. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.5...rest-assured-5.5.6) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/ollama-hugging-face/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/ollama-hugging-face/build.gradle b/examples/ollama-hugging-face/build.gradle index e47ebf744ab..1d747834acc 100644 --- a/examples/ollama-hugging-face/build.gradle +++ b/examples/ollama-hugging-face/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'io.rest-assured:rest-assured:5.5.5' + testImplementation 'io.rest-assured:rest-assured:5.5.6' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } From 9ba8f48bb570b304619713ecc02e936cb36b6927 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:23:29 +0000 Subject: [PATCH 0742/1224] Bump org.seleniumhq.selenium:selenium-bom in /examples Bumps [org.seleniumhq.selenium:selenium-bom](https://github.com/SeleniumHQ/selenium) from 4.34.0 to 4.35.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.34.0...selenium-4.35.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-bom dependency-version: 4.35.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 42da5c4c162..57baf68a490 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -7,7 +7,7 @@ repositories { } dependencies { - implementation platform('org.seleniumhq.selenium:selenium-bom:4.34.0') + implementation platform('org.seleniumhq.selenium:selenium-bom:4.35.0') implementation 'org.seleniumhq.selenium:selenium-remote-driver' implementation 'org.seleniumhq.selenium:selenium-firefox-driver' implementation 'org.seleniumhq.selenium:selenium-chrome-driver' From 9fe5c3cd2c2a1de5fa9522c0844ef6c53f29f6a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:23:41 +0000 Subject: [PATCH 0743/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.15.2 to 1.15.3. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.15.2...v1.15.3) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.15.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 3da855e8043..d53d0f80750 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -5,7 +5,7 @@ dependencies { testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.2' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.3' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.52.0') From 414e704155bfed5945cef8fb543d7b0230eef952 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:24:07 +0000 Subject: [PATCH 0744/1224] Bump org.seleniumhq.selenium:selenium-api in /examples Bumps [org.seleniumhq.selenium:selenium-api](https://github.com/SeleniumHQ/selenium) from 4.34.0 to 4.35.0. - [Release notes](https://github.com/SeleniumHQ/selenium/releases) - [Commits](https://github.com/SeleniumHQ/selenium/compare/selenium-4.34.0...selenium-4.35.0) --- updated-dependencies: - dependency-name: org.seleniumhq.selenium:selenium-api dependency-version: 4.35.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/generic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index 84a6b453811..2844f1a19b3 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -7,6 +7,6 @@ dependencies { testImplementation project(":testcontainers-mysql") testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - testImplementation "org.seleniumhq.selenium:selenium-api:4.34.0" + testImplementation "org.seleniumhq.selenium:selenium-api:4.35.0" testImplementation 'org.assertj:assertj-core:3.27.4' } From 07ee87bc46d6803b67d00ffd188cecc82fc8a3ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:25:24 +0000 Subject: [PATCH 0745/1224] Bump io.nats:jnats from 2.21.4 to 2.21.5 in /examples Bumps [io.nats:jnats](https://github.com/nats-io/nats.java) from 2.21.4 to 2.21.5. - [Release notes](https://github.com/nats-io/nats.java/releases) - [Changelog](https://github.com/nats-io/nats.java/blob/main/CHANGELOG.md) - [Commits](https://github.com/nats-io/nats.java/compare/2.21.4...2.21.5) --- updated-dependencies: - dependency-name: io.nats:jnats dependency-version: 2.21.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/nats/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 552d5bc33a4..765fefd7491 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'io.nats:jnats:2.21.4' + testImplementation 'io.nats:jnats:2.21.5' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' From fe38a2dff2d609b56329ee93b3207994739f6555 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:36:48 +0000 Subject: [PATCH 0746/1224] Bump io.lettuce:lettuce-core in /examples Bumps [io.lettuce:lettuce-core](https://github.com/redis/lettuce) from 6.7.1.RELEASE to 6.8.0.RELEASE. - [Release notes](https://github.com/redis/lettuce/releases) - [Changelog](https://github.com/redis/lettuce/blob/main/RELEASE-NOTES.md) - [Commits](https://github.com/redis/lettuce/compare/6.7.1.RELEASE...6.8.0.RELEASE) --- updated-dependencies: - dependency-name: io.lettuce:lettuce-core dependency-version: 6.8.0.RELEASE dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- docs/examples/junit4/redis/build.gradle | 2 +- docs/examples/junit5/redis/build.gradle | 2 +- docs/examples/spock/redis/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/examples/junit4/redis/build.gradle b/docs/examples/junit4/redis/build.gradle index a9a8452987c..8af186d16bb 100644 --- a/docs/examples/junit4/redis/build.gradle +++ b/docs/examples/junit4/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.7.1.RELEASE" + api "io.lettuce:lettuce-core:6.8.0.RELEASE" testImplementation "junit:junit:4.13.2" testImplementation project(":testcontainers") diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index c0ebfc3e491..3404178b957 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -1,7 +1,7 @@ description = "Examples for docs" dependencies { - api "io.lettuce:lettuce-core:6.7.1.RELEASE" + api "io.lettuce:lettuce-core:6.8.0.RELEASE" testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.4' testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' diff --git a/docs/examples/spock/redis/build.gradle b/docs/examples/spock/redis/build.gradle index 2b82febefb6..30a5509929e 100644 --- a/docs/examples/spock/redis/build.gradle +++ b/docs/examples/spock/redis/build.gradle @@ -4,7 +4,7 @@ plugins { } dependencies { - api "io.lettuce:lettuce-core:6.7.1.RELEASE" + api "io.lettuce:lettuce-core:6.8.0.RELEASE" testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0' testImplementation project(":testcontainers-spock") testImplementation 'ch.qos.logback:logback-classic:1.3.15' From fe5002f2772734b42abae206a45c9b997f04b0ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:53:12 +0000 Subject: [PATCH 0747/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.52.0 to 1.53.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.52.0...v1.53.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.53.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 3da855e8043..295a6c617d8 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.2' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.52.0') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.53.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From 3b958e292db8ef4f08a264a859a3e2b30d62c17c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:53:16 +0000 Subject: [PATCH 0748/1224] Bump redis.clients:jedis from 6.0.0 to 6.1.0 in /examples Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index b526c66f241..52c574e182d 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:6.0.0' + implementation 'redis.clients:jedis:6.1.0' implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index 03a5ac6a88b..da92871a0df 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:6.0.0' + implementation 'redis.clients:jedis:6.1.0' implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 9c658ca974c..4e8faa7a1b9 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { - implementation 'redis.clients:jedis:6.0.0' + implementation 'redis.clients:jedis:6.1.0' implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From 35d17991b235eff08c939f26aadabd7cb7e13946 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 00:53:22 +0000 Subject: [PATCH 0749/1224] Bump io.cucumber:cucumber-bom from 7.27.0 to 7.27.2 in /examples Bumps [io.cucumber:cucumber-bom](https://github.com/cucumber/cucumber-jvm) from 7.27.0 to 7.27.2. - [Release notes](https://github.com/cucumber/cucumber-jvm/releases) - [Changelog](https://github.com/cucumber/cucumber-jvm/blob/main/CHANGELOG.md) - [Commits](https://github.com/cucumber/cucumber-jvm/compare/v7.27.0...v7.27.2) --- updated-dependencies: - dependency-name: io.cucumber:cucumber-bom dependency-version: 7.27.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 42da5c4c162..38db64972e1 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation platform('org.junit:junit-bom:5.13.4') testImplementation 'org.junit.platform:junit-platform-suite' - testImplementation platform('io.cucumber:cucumber-bom:7.27.0') + testImplementation platform('io.cucumber:cucumber-bom:7.27.2') testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit-platform-engine' testImplementation 'org.testcontainers:testcontainers-selenium' From 17dbbfd744e4ce570297117ebd3c86ffa07016c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:10:09 +0000 Subject: [PATCH 0750/1224] Bump com.zaxxer:HikariCP from 7.0.0 to 7.0.2 in /modules/spock Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 7.0.0 to 7.0.2. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-7.0.0...HikariCP-7.0.2) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-version: 7.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 ae7f37050ba..ec7fed6ec36 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') - testImplementation 'com.zaxxer:HikariCP:7.0.0' + testImplementation 'com.zaxxer:HikariCP:7.0.2' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.7' From 828552631923ba68b7e34d66b0331b31c51381cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:17:49 +0000 Subject: [PATCH 0751/1224] Bump com.hivemq:hivemq-mqtt-client in /modules/hivemq Bumps [com.hivemq:hivemq-mqtt-client](https://github.com/hivemq/hivemq-mqtt-client) from 1.3.7 to 1.3.8. - [Release notes](https://github.com/hivemq/hivemq-mqtt-client/releases) - [Changelog](https://github.com/hivemq/hivemq-mqtt-client/blob/master/RELEASE.md) - [Commits](https://github.com/hivemq/hivemq-mqtt-client/compare/v1.3.7...v1.3.8) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-mqtt-client dependency-version: 1.3.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 5581e6f0a39..b5fbcac0a32 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -15,7 +15,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.42.0") - testImplementation("com.hivemq:hivemq-mqtt-client:1.3.7") + testImplementation("com.hivemq:hivemq-mqtt-client:1.3.8") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") testImplementation 'org.assertj:assertj-core:3.27.4' From ee4172a132241310dfc74096a8516b67b502ee8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:17:56 +0000 Subject: [PATCH 0752/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 11.0.9 to 11.0.10. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 6f98d6a9f24..f4f762ae43a 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.4' - api 'org.apache.tomcat:tomcat-jdbc:11.0.9' + api 'org.apache.tomcat:tomcat-jdbc:11.0.10' api 'org.vibur:vibur-dbcp:26.0' api 'mysql:mysql-connector-java:8.0.33' } From 494ed20f9f5bc0b72874eb6fee08421046be182a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:17:58 +0000 Subject: [PATCH 0753/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.65.0 to 26.66.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Changelog](https://github.com/googleapis/java-cloud-bom/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.65.0...v26.66.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.66.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index f77e46180d6..4deec14af03 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.65.0") + testImplementation platform("com.google.cloud:libraries-bom:26.66.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From 0377d9214822fd3f39b873498ea489a8c8578884 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:18:19 +0000 Subject: [PATCH 0754/1224] Bump redis.clients:jedis from 6.0.0 to 6.1.0 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 13652ef111b..312d41ee13f 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.0' - testImplementation 'redis.clients:jedis:6.0.0' + testImplementation 'redis.clients:jedis:6.1.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From 2a4c44d2b4b9eaa56b7537225abe807310c46160 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:18:35 +0000 Subject: [PATCH 0755/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.1.0 to 9.1.2. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.1.0...v9.1.2) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.1.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 de679721cf7..075e0e39533 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.0" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.2" testImplementation "org.elasticsearch.client:transport:7.17.29" testImplementation 'org.assertj:assertj-core:3.27.4' } From 7f8acddbb7c4c9d578db72a31e9b5be198db5aac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:20:44 +0000 Subject: [PATCH 0756/1224] Bump dev.openfga:openfga-sdk from 0.8.3 to 0.9.0 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.8.3 to 0.9.0. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.8.3...v0.9.0) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-version: 0.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 14d7179f7df..5d1addfbe9a 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'dev.openfga:openfga-sdk:0.8.3' + testImplementation 'dev.openfga:openfga-sdk:0.9.0' } test { From 78ee0108b87023e82c6973cf676b3e64a4507f74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:21:41 +0000 Subject: [PATCH 0757/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.7.8 to 3.7.9. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.7.8...v3.7.9) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-version: 3.7.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index c738f3b6f26..8837813426c 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -12,6 +12,6 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.7.8' + testFixturesImplementation 'io.projectreactor:reactor-core:3.7.9' testFixturesImplementation 'org.assertj:assertj-core:3.27.4' } From d98a3283bf91a65299b2f21b1fb5557a17bf90ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:21:43 +0000 Subject: [PATCH 0758/1224] Bump redis.clients:jedis from 6.0.0 to 6.1.0 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.0.0 to 6.1.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.0.0...v6.1.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 4a0f055db8c..f97193c730a 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' - testImplementation 'redis.clients:jedis:6.0.0' + testImplementation 'redis.clients:jedis:6.1.0' testImplementation 'org.assertj:assertj-core:3.27.4' } From eec95b9dc0e65fca441f00ace6ee8c49f0c9a0a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:21:59 +0000 Subject: [PATCH 0759/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.8.3 to 3.9.0. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/core-io-3.8.3...3.9.0) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-version: 3.9.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 89736e47f81..d4b481d41ec 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,7 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' - testImplementation 'com.couchbase.client:java-client:3.8.3' + testImplementation 'com.couchbase.client:java-client:3.9.0' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.27.4' } From aec0af0d908cc33e23ca7e18ad0fa50a371746ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:22:02 +0000 Subject: [PATCH 0760/1224] Bump org.mariadb.jdbc:mariadb-java-client in /modules/mariadb Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.5.4 to 3.5.5. - [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases) - [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/main/CHANGELOG.md) - [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.4...3.5.5) --- updated-dependencies: - dependency-name: org.mariadb.jdbc:mariadb-java-client dependency-version: 3.5.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 cf0b92dd5fe..d68f122f4dc 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.4' + testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.5' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' From 83c6910af895a33685ada73a5df70153d02d0227 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:22:07 +0000 Subject: [PATCH 0761/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.1.1.jre8-preview to 13.2.0.jre8. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.2.0.jre8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 793f5b48c99..3ba79559b58 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.1.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' testImplementation project(':testcontainers-r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' From 809ffdfe9883d57796b75c3398ecff161142c1ad Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:22:10 +0000 Subject: [PATCH 0762/1224] Bump org.questdb:questdb from 9.0.1 to 9.0.2 in /modules/questdb Bumps [org.questdb:questdb](https://github.com/questdb/questdb) from 9.0.1 to 9.0.2. - [Release notes](https://github.com/questdb/questdb/releases) - [Commits](https://github.com/questdb/questdb/compare/9.0.1...9.0.2) --- updated-dependencies: - dependency-name: org.questdb:questdb dependency-version: 9.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index e57309a6bf3..665b2473b0a 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -7,7 +7,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'org.questdb:questdb:9.0.1' + testImplementation 'org.questdb:questdb:9.0.2' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } From 0dc66f0b9dd5dbc47052ffe2e0ec3d43aa2da44b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:23:23 +0000 Subject: [PATCH 0763/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 11.0.9 to 11.0.10. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 08b6b707922..30d2cb539c4 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.9' + testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.10' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation ('org.mockito:mockito-core:4.11.0') { From f009964acbf0efbc33612055459d7f4df17af6ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:25:33 +0000 Subject: [PATCH 0764/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/azure Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.1.1.jre8-preview to 13.2.0.jre8. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.2.0.jre8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 4dbffa9ac20..90770150162 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -14,5 +14,5 @@ dependencies { testImplementation 'com.azure:azure-data-tables' testImplementation 'com.azure:azure-messaging-eventhubs' testImplementation 'com.azure:azure-messaging-servicebus' - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.1.1.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' } From f00dd7b3c86b68f66431d83c763c2807fc9c41fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 03:25:43 +0000 Subject: [PATCH 0765/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.32.14 to 2.32.25. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.32.25 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index a1b9c150746..7aa6376fd54 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation 'com.scylladb:java-driver-core:4.19.0.1' testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'software.amazon.awssdk:dynamodb:2.32.14' + testImplementation 'software.amazon.awssdk:dynamodb:2.32.30' } From 664ccb1492062cf1101fb7cdcbd33d29e6ffdbc0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 05:58:22 +0000 Subject: [PATCH 0766/1224] Bump com.gradleup.shadow from 8.3.8 to 8.3.9 Bumps com.gradleup.shadow from 8.3.8 to 8.3.9. --- updated-dependencies: - dependency-name: com.gradleup.shadow dependency-version: 8.3.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 825d240ddf1..b4f97c3eaa5 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ buildscript { plugins { id 'io.franzbecker.gradle-lombok' version '5.0.0' - id 'com.gradleup.shadow' version '8.3.8' + id 'com.gradleup.shadow' version '8.3.9' id 'me.champeau.gradle.japicmp' version '0.4.3' apply false id 'com.diffplug.spotless' version '6.22.0' apply false id 'org.jreleaser' version '1.18.0' apply false From 20ca76649c14cb03841b3c373dbc26be0fb83467 Mon Sep 17 00:00:00 2001 From: Emanuel Trandafir <75391049+etrandafir93@users.noreply.github.com> Date: Tue, 26 Aug 2025 09:03:05 +0300 Subject: [PATCH 0767/1224] Remove deprecated kafka container examples from docs (#10712) --- docs/modules/kafka.md | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/docs/modules/kafka.md b/docs/modules/kafka.md index cd2a660c8e0..4311be61b5a 100644 --- a/docs/modules/kafka.md +++ b/docs/modules/kafka.md @@ -15,20 +15,18 @@ Currently, two different Kafka images are supported: ## Benefits * Running a single node Kafka installation with just one line of code -* No need to manage external Zookeeper installation, required by Kafka. But see [below](#zookeeper) +* No need to manage external Zookeeper installation, required by Kafka. ## Example -### Using org.testcontainers.containers.KafkaContainer +### Using org.testcontainers.kafka.KafkaContainer Create a `KafkaContainer` to use it in your tests: -[Creating a KafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:constructorWithVersion +[Creating a KafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java) inside_block:constructorWithVersion -The correspondence between Confluent Platform versions and Kafka versions can be seen [in Confluent documentation](https://docs.confluent.io/current/installation/versions-interoperability.html#cp-and-apache-kafka-compatibility) - Now your tests or any other process running on your machine can get access to running Kafka broker by using the following bootstrap server location: @@ -46,26 +44,8 @@ Create a `ConfluentKafkaContainer` to use it in your tests: [Creating a ConfluentKafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java) inside_block:constructorWithVersion -### Using org.testcontainers.kafka.KafkaContainer - -Create a `KafkaContainer` to use it in your tests: - - -[Creating a KafkaContainer](../../modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java) inside_block:constructorWithVersion - - ## Options -### Using external Zookeeper - -!!! note - Only available for `org.testcontainers.containers.KafkaContainer` - -If for some reason you want to use an externally running Zookeeper, then just pass its location during construction: - -[External Zookeeper](../../modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java) inside_block:withExternalZookeeper - - ### Using Kraft mode !!! note From 9c65f4776a9e859ca258319211fb88ef2061d9c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 08:07:05 +0000 Subject: [PATCH 0768/1224] Bump software.amazon.awssdk:bom in /modules/localstack Bumps software.amazon.awssdk:bom from 2.32.14 to 2.32.25. --- updated-dependencies: - dependency-name: software.amazon.awssdk:bom dependency-version: 2.32.25 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b869e470a89..f939b4804cf 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testImplementation platform("software.amazon.awssdk:bom:2.32.14") + testImplementation platform("software.amazon.awssdk:bom:2.32.29") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' testImplementation 'software.amazon.awssdk:cloudwatchlogs' From 844d7e4b54afbbe5686cc54971741143af935bdc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 09:56:33 +0000 Subject: [PATCH 0769/1224] Bump io.milvus:milvus-sdk-java from 2.6.1 to 2.6.2 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.6.1 to 2.6.2. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.6.1...v2.6.2) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-version: 2.6.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index e8a8939b813..6addaaabbd0 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'io.milvus:milvus-sdk-java:2.6.1' + testImplementation 'io.milvus:milvus-sdk-java:2.6.3' } From d39f5b99283e6bc8ed881ae27f46932e16a0dc21 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 19:29:58 +0000 Subject: [PATCH 0770/1224] Bump com.zaxxer:HikariCP from 7.0.0 to 7.0.2 in /modules/junit-jupiter Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 7.0.0 to 7.0.2. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-7.0.0...HikariCP-7.0.2) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-version: 7.0.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 312d41ee13f..fd06bba5bb7 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') - testImplementation 'com.zaxxer:HikariCP:7.0.0' + testImplementation 'com.zaxxer:HikariCP:7.0.2' testImplementation 'redis.clients:jedis:6.1.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From 45888471c931976190eef9b29dac3f196b0aa9dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:21:47 +0000 Subject: [PATCH 0771/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.42 to 3.2.43. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/3.2.43/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.42...3.2.43) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-version: 3.2.43 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 174342606fc..9973e1519d3 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,11 +3,11 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.42" + api "com.orientechnologies:orientdb-client:3.2.43" testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.3' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.42" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" } tasks.japicmp { From 46434dcb623de6f92542bc503fd13cecf13fe288 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Aug 2025 20:21:54 +0000 Subject: [PATCH 0772/1224] Bump com.orientechnologies:orientdb-gremlin in /modules/orientdb Bumps [com.orientechnologies:orientdb-gremlin](https://github.com/orientechnologies/orientdb-gremlin) from 3.2.42 to 3.2.43. - [Commits](https://github.com/orientechnologies/orientdb-gremlin/compare/3.2.42...3.2.43) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-gremlin dependency-version: 3.2.43 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 174342606fc..9973e1519d3 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,11 +3,11 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.42" + api "com.orientechnologies:orientdb-client:3.2.43" testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.3' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.42" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" } tasks.japicmp { From 19dcc5eb1219fc97dc5ccdc1946ef7e7a16dfd28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 1 Sep 2025 17:23:00 -0500 Subject: [PATCH 0773/1224] Move ActiveMQ tests to JUnit Jupiter (#10726) --- modules/activemq/build.gradle | 7 +++++++ .../testcontainers/activemq/ActiveMQContainerTest.java | 8 ++++---- .../testcontainers/activemq/ArtemisContainerTest.java | 10 +++++----- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 6ca5e6af78a..8c209d2dd49 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -3,7 +3,14 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation "org.apache.activemq:activemq-client:6.1.7" testImplementation "org.apache.activemq:artemis-jakarta-client:2.42.0" } + +test { + useJUnitPlatform() +} diff --git a/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java b/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java index 842701fa376..564ee5382e7 100644 --- a/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java +++ b/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java @@ -9,14 +9,14 @@ import jakarta.jms.TextMessage; import lombok.SneakyThrows; import org.apache.activemq.ActiveMQConnectionFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class ActiveMQContainerTest { +class ActiveMQContainerTest { @Test - public void test() { + void test() { try ( // container { ActiveMQContainer activemq = new ActiveMQContainer("apache/activemq-classic:5.18.3") // } @@ -30,7 +30,7 @@ public void test() { } @Test - public void customCredentials() { + void customCredentials() { try ( // settingCredentials { ActiveMQContainer activemq = new ActiveMQContainer("apache/activemq-classic:5.18.3") diff --git a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java index cce4b319afd..6a3c3ecc19c 100644 --- a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java +++ b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java @@ -8,14 +8,14 @@ import jakarta.jms.TextMessage; import lombok.SneakyThrows; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class ArtemisContainerTest { +class ArtemisContainerTest { @Test - public void defaultCredentials() { + void defaultCredentials() { try ( // container { ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.30.0-alpine") @@ -30,7 +30,7 @@ public void defaultCredentials() { } @Test - public void customCredentials() { + void customCredentials() { try ( // settingCredentials { ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.30.0-alpine") @@ -47,7 +47,7 @@ public void customCredentials() { } @Test - public void allowAnonymousLogin() { + void allowAnonymousLogin() { try ( // enableAnonymousLogin { ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.30.0-alpine") From 1cba0c5331a372ab445ecdb0da96a426c95fb4a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 1 Sep 2025 17:57:45 -0500 Subject: [PATCH 0774/1224] Move Azure tests to JUnit Jupiter (#10727) --- modules/azure/build.gradle | 7 + .../azure/AzuriteContainerTest.java | 34 ++--- .../azure/EventHubsEmulatorContainerTest.java | 51 +++---- .../ServiceBusEmulatorContainerTest.java | 142 +++++++++--------- .../CosmosDBEmulatorContainerTest.java | 92 ++++++------ 5 files changed, 159 insertions(+), 167 deletions(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 90770150162..226f668e954 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -6,7 +6,10 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform("com.azure:azure-sdk-bom:1.2.32") testImplementation 'com.azure:azure-cosmos' testImplementation 'com.azure:azure-storage-blob' @@ -16,3 +19,7 @@ dependencies { testImplementation 'com.azure:azure-messaging-servicebus' testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' } + +test { + useJUnitPlatform() +} diff --git a/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerTest.java index 2bf0ad856d3..5acf2fe5ad5 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerTest.java @@ -11,22 +11,22 @@ import com.azure.storage.queue.QueueClient; import com.azure.storage.queue.QueueServiceClient; import com.azure.storage.queue.QueueServiceClientBuilder; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.MountableFile; import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; -public class AzuriteContainerTest { +class AzuriteContainerTest { private static final String PASSWORD = "changeit"; private static Properties originalSystemProperties; - @BeforeClass + @BeforeAll public static void captureOriginalSystemProperties() { originalSystemProperties = (Properties) System.getProperties().clone(); System.setProperty( @@ -37,13 +37,13 @@ public static void captureOriginalSystemProperties() { System.setProperty("javax.net.ssl.trustStoreType", "PKCS12"); } - @AfterClass + @AfterAll public static void restoreOriginalSystemProperties() { System.setProperties(originalSystemProperties); } @Test - public void testWithBlobServiceClient() { + void testWithBlobServiceClient() { try ( // emulatorContainer { AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") @@ -56,7 +56,7 @@ public void testWithBlobServiceClient() { } @Test - public void testWithQueueServiceClient() { + void testWithQueueServiceClient() { try (AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0")) { emulator.start(); assertThat(emulator.getConnectionString()).contains("QueueEndpoint=http://"); @@ -65,7 +65,7 @@ public void testWithQueueServiceClient() { } @Test - public void testWithTableServiceClient() { + void testWithTableServiceClient() { try (AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0")) { emulator.start(); assertThat(emulator.getConnectionString()).contains("TableEndpoint=http://"); @@ -74,7 +74,7 @@ public void testWithTableServiceClient() { } @Test - public void testWithBlobServiceClientWithSslUsingPfx() { + void testWithBlobServiceClientWithSslUsingPfx() { try ( AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") .withSsl(MountableFile.forClasspathResource("/keystore.pfx"), PASSWORD) @@ -86,7 +86,7 @@ public void testWithBlobServiceClientWithSslUsingPfx() { } @Test - public void testWithQueueServiceClientWithSslUsingPfx() { + void testWithQueueServiceClientWithSslUsingPfx() { try ( AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") .withSsl(MountableFile.forClasspathResource("/keystore.pfx"), PASSWORD) @@ -98,7 +98,7 @@ public void testWithQueueServiceClientWithSslUsingPfx() { } @Test - public void testWithTableServiceClientWithSslUsingPfx() { + void testWithTableServiceClientWithSslUsingPfx() { try ( AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") .withSsl(MountableFile.forClasspathResource("/keystore.pfx"), PASSWORD) @@ -110,7 +110,7 @@ public void testWithTableServiceClientWithSslUsingPfx() { } @Test - public void testWithBlobServiceClientWithSslUsingPem() { + void testWithBlobServiceClientWithSslUsingPem() { try ( AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") .withSsl( @@ -125,7 +125,7 @@ public void testWithBlobServiceClientWithSslUsingPem() { } @Test - public void testWithQueueServiceClientWithSslUsingPem() { + void testWithQueueServiceClientWithSslUsingPem() { try ( AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") .withSsl( @@ -140,7 +140,7 @@ public void testWithQueueServiceClientWithSslUsingPem() { } @Test - public void testWithTableServiceClientWithSslUsingPem() { + void testWithTableServiceClientWithSslUsingPem() { try ( AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") .withSsl( @@ -155,7 +155,7 @@ public void testWithTableServiceClientWithSslUsingPem() { } @Test - public void testTwoAccountKeysWithBlobServiceClient() { + void testTwoAccountKeysWithBlobServiceClient() { try ( // withTwoAccountKeys { AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") @@ -194,7 +194,7 @@ public void testTwoAccountKeysWithBlobServiceClient() { } @Test - public void testMultipleAccountsWithBlobServiceClient() { + void testMultipleAccountsWithBlobServiceClient() { try ( // withMoreAccounts { AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") diff --git a/modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java index 58d1d7ad59c..1191c980edd 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/EventHubsEmulatorContainerTest.java @@ -7,8 +7,7 @@ import com.azure.messaging.eventhubs.EventHubProducerClient; import com.azure.messaging.eventhubs.models.EventPosition; import com.azure.messaging.eventhubs.models.PartitionEvent; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.Network; import org.testcontainers.utility.MountableFile; @@ -19,36 +18,29 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.waitAtMost; -public class EventHubsEmulatorContainerTest { - - @Rule - // network { - public Network network = Network.newNetwork(); - - // } - - @Rule - // azuriteContainer { - public AzuriteContainer azuriteContainer = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") - .withNetwork(network); - - // } - - @Rule - // emulatorContainer { - public EventHubsEmulatorContainer emulator = new EventHubsEmulatorContainer( - "mcr.microsoft.com/azure-messaging/eventhubs-emulator:2.0.1" - ) - .acceptLicense() - .withNetwork(network) - .withConfig(MountableFile.forClasspathResource("/eventhubs_config.json")) - .withAzuriteContainer(azuriteContainer); - - // } +class EventHubsEmulatorContainerTest { @Test public void testWithEventHubsClient() { try ( + // network { + Network network = Network.newNetwork(); + // } + // azuriteContainer { + AzuriteContainer azuriteContainer = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") + .withNetwork(network); + // } + // emulatorContainer { + EventHubsEmulatorContainer emulator = new EventHubsEmulatorContainer( + "mcr.microsoft.com/azure-messaging/eventhubs-emulator:2.0.1" + ) + .acceptLicense() + .withNetwork(network) + .withConfig(MountableFile.forClasspathResource("/eventhubs_config.json")) + .withAzuriteContainer(azuriteContainer); + // } + ) { + emulator.start(); // createProducerAndConsumer { EventHubProducerClient producer = new EventHubClientBuilder() .connectionString(emulator.getConnectionString()) @@ -60,9 +52,8 @@ public void testWithEventHubsClient() { .fullyQualifiedNamespace("emulatorNs1") .eventHubName("eh1") .consumerGroup("cg1") - .buildConsumerClient() + .buildConsumerClient(); // } - ) { producer.send(Collections.singletonList(new EventData("test"))); waitAtMost(Duration.ofSeconds(30)) diff --git a/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java index 4676e41784a..6bf6ac80fae 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java @@ -9,8 +9,7 @@ import com.azure.messaging.servicebus.ServiceBusSenderClient; import com.github.dockerjava.api.model.Capability; import org.assertj.core.api.Assertions; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.containers.Network; import org.testcontainers.utility.MountableFile; @@ -23,83 +22,78 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -public class ServiceBusEmulatorContainerTest { - - @Rule - // network { - public Network network = Network.newNetwork(); - - // } - - @Rule - // sqlContainer { - public MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>( - "mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04" - ) - .acceptLicense() - .withPassword("yourStrong(!)Password") - .withCreateContainerCmdModifier(cmd -> { - cmd.getHostConfig().withCapAdd(Capability.SYS_PTRACE); - }) - .withNetwork(network); - - // } - - @Rule - // emulatorContainer { - public ServiceBusEmulatorContainer emulator = new ServiceBusEmulatorContainer( - "mcr.microsoft.com/azure-messaging/servicebus-emulator:1.1.2" - ) - .acceptLicense() - .withConfig(MountableFile.forClasspathResource("/service-bus-config.json")) - .withNetwork(network) - .withMsSqlServerContainer(mssqlServerContainer); - - // } +class ServiceBusEmulatorContainerTest { @Test - public void testWithClient() { - assertThat(emulator.getConnectionString()).startsWith("Endpoint=sb://"); + void testWithClient() { + try ( + // network { + Network network = Network.newNetwork(); + // } + // sqlContainer { + MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>( + "mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04" + ) + .acceptLicense() + .withPassword("yourStrong(!)Password") + .withCreateContainerCmdModifier(cmd -> { + cmd.getHostConfig().withCapAdd(Capability.SYS_PTRACE); + }) + .withNetwork(network); + // } + // emulatorContainer { + ServiceBusEmulatorContainer emulator = new ServiceBusEmulatorContainer( + "mcr.microsoft.com/azure-messaging/servicebus-emulator:1.1.2" + ) + .acceptLicense() + .withConfig(MountableFile.forClasspathResource("/service-bus-config.json")) + .withNetwork(network) + .withMsSqlServerContainer(mssqlServerContainer); + // } + ) { + emulator.start(); + assertThat(emulator.getConnectionString()).startsWith("Endpoint=sb://"); - // senderClient { - ServiceBusSenderClient senderClient = new ServiceBusClientBuilder() - .connectionString(emulator.getConnectionString()) - .sender() - .queueName("queue.1") - .buildClient(); - // } + // senderClient { + ServiceBusSenderClient senderClient = new ServiceBusClientBuilder() + .connectionString(emulator.getConnectionString()) + .sender() + .queueName("queue.1") + .buildClient(); + // } - await() - .atMost(20, TimeUnit.SECONDS) - .ignoreException(ServiceBusException.class) - .until(() -> { - senderClient.sendMessage(new ServiceBusMessage("Hello, Testcontainers!")); - return true; - }); - senderClient.close(); + await() + .atMost(20, TimeUnit.SECONDS) + .ignoreException(ServiceBusException.class) + .until(() -> { + senderClient.sendMessage(new ServiceBusMessage("Hello, Testcontainers!")); + return true; + }); + senderClient.close(); - final List received = new CopyOnWriteArrayList<>(); - Consumer messageConsumer = m -> { - received.add(m.getMessage().getBody().toString()); - m.complete(); - }; - Consumer errorConsumer = e -> Assertions.fail("Unexpected error: " + e); - // processorClient { - ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder() - .connectionString(emulator.getConnectionString()) - .processor() - .queueName("queue.1") - .processMessage(messageConsumer) - .processError(errorConsumer) - .buildProcessorClient(); - // } - processorClient.start(); + final List received = new CopyOnWriteArrayList<>(); + Consumer messageConsumer = m -> { + received.add(m.getMessage().getBody().toString()); + m.complete(); + }; + Consumer errorConsumer = e -> Assertions.fail("Unexpected error: " + e); + // processorClient { + ServiceBusProcessorClient processorClient = new ServiceBusClientBuilder() + .connectionString(emulator.getConnectionString()) + .processor() + .queueName("queue.1") + .processMessage(messageConsumer) + .processError(errorConsumer) + .buildProcessorClient(); + // } + processorClient.start(); - await() - .atMost(20, TimeUnit.SECONDS) - .untilAsserted(() -> { - assertThat(received).hasSize(1).containsExactlyInAnyOrder("Hello, Testcontainers!"); - }); - processorClient.close(); + await() + .atMost(20, TimeUnit.SECONDS) + .untilAsserted(() -> { + assertThat(received).hasSize(1).containsExactlyInAnyOrder("Hello, Testcontainers!"); + }); + processorClient.close(); + } } } diff --git a/modules/azure/src/test/java/org/testcontainers/containers/CosmosDBEmulatorContainerTest.java b/modules/azure/src/test/java/org/testcontainers/containers/CosmosDBEmulatorContainerTest.java index 140bd64c39a..92b5814641e 100644 --- a/modules/azure/src/test/java/org/testcontainers/containers/CosmosDBEmulatorContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/containers/CosmosDBEmulatorContainerTest.java @@ -4,11 +4,10 @@ import com.azure.cosmos.CosmosClientBuilder; import com.azure.cosmos.models.CosmosContainerResponse; import com.azure.cosmos.models.CosmosDatabaseResponse; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.testcontainers.utility.DockerImageName; import java.io.FileOutputStream; @@ -18,59 +17,60 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CosmosDBEmulatorContainerTest { +class CosmosDBEmulatorContainerTest { private static Properties originalSystemProperties; - @BeforeClass + @BeforeAll public static void captureOriginalSystemProperties() { originalSystemProperties = (Properties) System.getProperties().clone(); } - @AfterClass + @AfterAll public static void restoreOriginalSystemProperties() { System.setProperties(originalSystemProperties); } - @Rule - public TemporaryFolder tempFolder = TemporaryFolder.builder().assureDeletion().build(); - - @Rule - // emulatorContainer { - public CosmosDBEmulatorContainer emulator = new CosmosDBEmulatorContainer( - DockerImageName.parse("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest") - ); - - // } + @TempDir + public Path tempFolder; @Test - public void testWithCosmosClient() throws Exception { - // buildAndSaveNewKeyStore { - Path keyStoreFile = tempFolder.newFile("azure-cosmos-emulator.keystore").toPath(); - KeyStore keyStore = emulator.buildNewKeyStore(); - keyStore.store(new FileOutputStream(keyStoreFile.toFile()), emulator.getEmulatorKey().toCharArray()); - // } - // setSystemTrustStoreParameters { - System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString()); - System.setProperty("javax.net.ssl.trustStorePassword", emulator.getEmulatorKey()); - System.setProperty("javax.net.ssl.trustStoreType", "PKCS12"); - // } - // buildClient { - CosmosAsyncClient client = new CosmosClientBuilder() - .gatewayMode() - .endpointDiscoveryEnabled(false) - .endpoint(emulator.getEmulatorEndpoint()) - .key(emulator.getEmulatorKey()) - .buildAsyncClient(); - // } - // testWithClientAgainstEmulatorContainer { - CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists("Azure").block(); - assertThat(databaseResponse.getStatusCode()).isEqualTo(201); - CosmosContainerResponse containerResponse = client - .getDatabase("Azure") - .createContainerIfNotExists("ServiceContainer", "/name") - .block(); - assertThat(containerResponse.getStatusCode()).isEqualTo(201); - // } + void testWithCosmosClient() throws Exception { + try ( + // emulatorContainer { + CosmosDBEmulatorContainer emulator = new CosmosDBEmulatorContainer( + DockerImageName.parse("mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:latest") + ); + // } + ) { + emulator.start(); + // buildAndSaveNewKeyStore { + Path keyStoreFile = tempFolder.resolve("azure-cosmos-emulator.keystore"); + KeyStore keyStore = emulator.buildNewKeyStore(); + keyStore.store(new FileOutputStream(keyStoreFile.toFile()), emulator.getEmulatorKey().toCharArray()); + // } + // setSystemTrustStoreParameters { + System.setProperty("javax.net.ssl.trustStore", keyStoreFile.toString()); + System.setProperty("javax.net.ssl.trustStorePassword", emulator.getEmulatorKey()); + System.setProperty("javax.net.ssl.trustStoreType", "PKCS12"); + // } + // buildClient { + CosmosAsyncClient client = new CosmosClientBuilder() + .gatewayMode() + .endpointDiscoveryEnabled(false) + .endpoint(emulator.getEmulatorEndpoint()) + .key(emulator.getEmulatorKey()) + .buildAsyncClient(); + // } + // testWithClientAgainstEmulatorContainer { + CosmosDatabaseResponse databaseResponse = client.createDatabaseIfNotExists("Azure").block(); + assertThat(databaseResponse.getStatusCode()).isEqualTo(201); + CosmosContainerResponse containerResponse = client + .getDatabase("Azure") + .createContainerIfNotExists("ServiceContainer", "/name") + .block(); + assertThat(containerResponse.getStatusCode()).isEqualTo(201); + // } + } } } From 17145606e17accfe1bb8e7d5a2b3c4503874ea29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 1 Sep 2025 18:46:08 -0500 Subject: [PATCH 0775/1224] Move Cassandra tests to JUnit Jupiter (#10728) --- modules/cassandra/build.gradle | 10 +++++- .../cassandra/CassandraContainerTest.java | 34 +++++++++---------- .../CompatibleCassandraImageTest.java | 19 ++++------- .../containers/CassandraContainerTest.java | 25 +++++++------- .../CompatibleCassandraImageTest.java | 17 ++++------ 5 files changed, 52 insertions(+), 53 deletions(-) diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index cc3b9e81df5..de228376595 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -10,6 +10,14 @@ dependencies { api project(":testcontainers-database-commons") api "com.datastax.cassandra:cassandra-driver-core:3.10.0" - testImplementation 'com.datastax.oss:java-driver-core:4.17.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' + testImplementation 'com.datastax.oss:java-driver-core:4.17.0' +} + +test { + useJUnitPlatform() } diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java index d156a28ef0c..c4368dc8065 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java @@ -3,14 +3,14 @@ import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.ResultSet; import com.datastax.oss.driver.api.core.cql.Row; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.catchThrowable; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class CassandraContainerTest { +class CassandraContainerTest { private static final String CASSANDRA_IMAGE = "cassandra:3.11.2"; @@ -19,7 +19,7 @@ public class CassandraContainerTest { private static final String BASIC_QUERY = "SELECT release_version FROM system.local"; @Test - public void testSimple() { + void testSimple() { try ( // container-definition { CassandraContainer cassandraContainer = new CassandraContainer("cassandra:3.11.2") // } @@ -32,7 +32,7 @@ public void testSimple() { } @Test - public void testSpecificVersion() { + void testSpecificVersion() { String cassandraVersion = "3.0.15"; try ( CassandraContainer cassandraContainer = new CassandraContainer( @@ -47,7 +47,7 @@ public void testSpecificVersion() { } @Test - public void testConfigurationOverride() { + void testConfigurationOverride() { try ( CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) .withConfigurationOverride("cassandra-test-configuration-example") @@ -61,18 +61,18 @@ public void testConfigurationOverride() { } } - @Test(expected = ContainerLaunchException.class) - public void testEmptyConfigurationOverride() { + @Test + void testEmptyConfigurationOverride() { try ( CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) .withConfigurationOverride("cassandra-empty-configuration") ) { - cassandraContainer.start(); + assertThatThrownBy(cassandraContainer::start).isInstanceOf(ContainerLaunchException.class); } } @Test - public void testInitScript() { + void testInitScript() { try ( CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) .withInitScript("initial.cql") @@ -83,17 +83,17 @@ public void testInitScript() { } @Test - public void testNonexistentInitScript() { + void testNonexistentInitScript() { try ( CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) .withInitScript("unknown_script.cql") ) { - assertThat(catchThrowable(cassandraContainer::start)).isInstanceOf(ContainerLaunchException.class); + assertThatThrownBy(cassandraContainer::start).isInstanceOf(ContainerLaunchException.class); } } @Test - public void testInitScriptWithRequiredAuthentication() { + void testInitScriptWithRequiredAuthentication() { try ( // init-with-auth { CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) @@ -106,18 +106,18 @@ public void testInitScriptWithRequiredAuthentication() { } } - @Test(expected = ContainerLaunchException.class) - public void testInitScriptWithError() { + @Test + void testInitScriptWithError() { try ( CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) .withInitScript("initial-with-error.cql") ) { - cassandraContainer.start(); + assertThatThrownBy(cassandraContainer::start).isInstanceOf(ContainerLaunchException.class); } } @Test - public void testInitScriptWithLegacyCassandra() { + void testInitScriptWithLegacyCassandra() { try ( CassandraContainer cassandraContainer = new CassandraContainer("cassandra:2.2.11") .withInitScript("initial.cql") diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java index 868e11c881e..15d8e209911 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CompatibleCassandraImageTest.java @@ -3,26 +3,21 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class CompatibleCassandraImageTest { +class CompatibleCassandraImageTest { - @Parameterized.Parameters(name = "{0}") public static String[] params() { return new String[] { "cassandra:3.11.2", "cassandra:4.1.1", "cassandra:5" }; } - @Parameterized.Parameter - public String imageName; - - @Test - public void testCassandraGetContactPoint() { - try (CassandraContainer cassandra = new CassandraContainer(this.imageName)) { + @ParameterizedTest + @MethodSource("params") + void testCassandraGetContactPoint(String imageName) { + try (CassandraContainer cassandra = new CassandraContainer(imageName)) { cassandra.start(); assertCassandraFunctionality(cassandra); } 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 eb3a8b068ea..2d534bccc81 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CassandraContainerTest.java @@ -5,14 +5,15 @@ import com.datastax.driver.core.Row; import com.datastax.driver.core.Session; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.wait.CassandraQueryWaitStrategy; import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; @Slf4j -public class CassandraContainerTest { +class CassandraContainerTest { private static final DockerImageName CASSANDRA_IMAGE = DockerImageName.parse("cassandra:3.11.2"); @@ -21,7 +22,7 @@ public class CassandraContainerTest { private static final String BASIC_QUERY = "SELECT release_version FROM system.local"; @Test - public void testSimple() { + void testSimple() { try (CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE)) { cassandraContainer.start(); ResultSet resultSet = performQuery(cassandraContainer, BASIC_QUERY); @@ -31,7 +32,7 @@ public void testSimple() { } @Test - public void testSpecificVersion() { + void testSpecificVersion() { String cassandraVersion = "3.0.15"; try ( CassandraContainer cassandraContainer = new CassandraContainer<>( @@ -46,7 +47,7 @@ public void testSpecificVersion() { } @Test - public void testConfigurationOverride() { + void testConfigurationOverride() { try ( CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE) .withConfigurationOverride("cassandra-test-configuration-example") @@ -60,18 +61,18 @@ public void testConfigurationOverride() { } } - @Test(expected = ContainerLaunchException.class) - public void testEmptyConfigurationOverride() { + @Test + void testEmptyConfigurationOverride() { try ( CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE) .withConfigurationOverride("cassandra-empty-configuration") ) { - cassandraContainer.start(); + assertThatThrownBy(cassandraContainer::start).isInstanceOf(ContainerLaunchException.class); } } @Test - public void testInitScript() { + void testInitScript() { try ( CassandraContainer cassandraContainer = new CassandraContainer<>(CASSANDRA_IMAGE) .withInitScript("initial.cql") @@ -82,7 +83,7 @@ public void testInitScript() { } @Test - public void testInitScriptWithLegacyCassandra() { + void testInitScriptWithLegacyCassandra() { try ( CassandraContainer cassandraContainer = new CassandraContainer<>( DockerImageName.parse("cassandra:2.2.11") @@ -96,7 +97,7 @@ public void testInitScriptWithLegacyCassandra() { @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test - public void testCassandraQueryWaitStrategy() { + void testCassandraQueryWaitStrategy() { try ( CassandraContainer cassandraContainer = new CassandraContainer<>() .waitingFor(new CassandraQueryWaitStrategy()) @@ -109,7 +110,7 @@ public void testCassandraQueryWaitStrategy() { @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test - public void testCassandraGetCluster() { + void testCassandraGetCluster() { try (CassandraContainer cassandraContainer = new CassandraContainer<>()) { cassandraContainer.start(); ResultSet resultSet = performQuery(cassandraContainer.getCluster(), BASIC_QUERY); diff --git a/modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java b/modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java index dc5e830f79a..aec27566beb 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/containers/CompatibleCassandraImageTest.java @@ -3,26 +3,21 @@ import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.metadata.schema.KeyspaceMetadata; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) public class CompatibleCassandraImageTest { - @Parameterized.Parameters(name = "{0}") public static String[] params() { return new String[] { "cassandra:3.11.2", "cassandra:4.1.1" }; } - @Parameterized.Parameter - public String imageName; - - @Test - public void testCassandraGetContactPoint() { - try (CassandraContainer cassandra = new CassandraContainer<>(this.imageName)) { + @ParameterizedTest + @MethodSource("params") + void testCassandraGetContactPoint(String imageName) { + try (CassandraContainer cassandra = new CassandraContainer<>(imageName)) { cassandra.start(); assertCassandraFunctionality(cassandra); } From 8c8da7a26ea0787fb43d40458098c423e85a63df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 2 Sep 2025 10:31:05 -0500 Subject: [PATCH 0776/1224] Move ChromaDB tests to JUnit Jupiter (#10730) --- modules/chromadb/build.gradle | 7 +++++++ .../testcontainers/chromadb/ChromaDBContainerTest.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index fca8a86e410..def6310b420 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: ChromaDB" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' } + +test { + useJUnitPlatform() +} diff --git a/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java b/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java index 0ec6b00601c..579c75f9f36 100644 --- a/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java +++ b/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java @@ -1,14 +1,14 @@ package org.testcontainers.chromadb; import io.restassured.http.ContentType; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static io.restassured.RestAssured.given; -public class ChromaDBContainerTest { +class ChromaDBContainerTest { @Test - public void test() { + void test() { try ( // container { ChromaDBContainer chroma = new ChromaDBContainer("chromadb/chroma:0.4.23") // } @@ -29,7 +29,7 @@ public void test() { } @Test - public void testVersion2() { + void testVersion2() { try (ChromaDBContainer chroma = new ChromaDBContainer("chromadb/chroma:1.0.0")) { chroma.start(); From 7836f169114b4113d4d09ec3b7a5c90833e76be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 2 Sep 2025 11:03:08 -0500 Subject: [PATCH 0777/1224] Move Consul tests to JUnit Jupiter (#10732) --- modules/consul/build.gradle | 7 ++++ .../consul/ConsulContainerTest.java | 39 ++++++++++--------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index b1e2b19c212..a3f6d93dbe2 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -3,7 +3,14 @@ description = "Testcontainers :: Consul" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.ecwid.consul:consul-api:1.4.5' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/consul/src/test/java/org/testcontainers/consul/ConsulContainerTest.java b/modules/consul/src/test/java/org/testcontainers/consul/ConsulContainerTest.java index 7f1c6d1c207..6e02bff51e8 100644 --- a/modules/consul/src/test/java/org/testcontainers/consul/ConsulContainerTest.java +++ b/modules/consul/src/test/java/org/testcontainers/consul/ConsulContainerTest.java @@ -4,8 +4,9 @@ import com.ecwid.consul.v1.Response; import com.ecwid.consul.v1.kv.model.GetValue; import io.restassured.RestAssured; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import java.io.IOException; @@ -16,25 +17,30 @@ import static org.assertj.core.api.Assertions.assertThat; -/** - * This test shows the pattern to use the ConsulContainer @ClassRule for a junit test. It also has tests that ensure - * the properties were added correctly by reading from Consul with the CLI and over HTTP. - */ -public class ConsulContainerTest { +class ConsulContainerTest { - @ClassRule - public static ConsulContainer consulContainer = new ConsulContainer("hashicorp/consul:1.15") + private static ConsulContainer consul = new ConsulContainer("hashicorp/consul:1.15") .withConsulCommand("kv put config/testing1 value123"); + @BeforeAll + static void setup() { + consul.start(); + } + + @AfterAll + static void teardown() { + consul.stop(); + } + @Test - public void readFirstPropertyPathWithCli() throws IOException, InterruptedException { - GenericContainer.ExecResult result = consulContainer.execInContainer("consul", "kv", "get", "config/testing1"); + void readFirstPropertyPathWithCli() throws IOException, InterruptedException { + GenericContainer.ExecResult result = consul.execInContainer("consul", "kv", "get", "config/testing1"); final String output = result.getStdout().replaceAll("\\r?\\n", ""); assertThat(output).contains("value123"); } @Test - public void readFirstSecretPathOverHttpApi() { + void readFirstSecretPathOverHttpApi() { io.restassured.response.Response response = RestAssured .given() .when() @@ -46,11 +52,8 @@ public void readFirstSecretPathOverHttpApi() { } @Test - public void writeAndReadMultipleValuesUsingClient() { - final ConsulClient consulClient = new ConsulClient( - consulContainer.getHost(), - consulContainer.getFirstMappedPort() - ); + void writeAndReadMultipleValuesUsingClient() { + final ConsulClient consulClient = new ConsulClient(consul.getHost(), consul.getFirstMappedPort()); final Map properties = new HashMap<>(); properties.put("value", "world"); @@ -70,6 +73,6 @@ public void writeAndReadMultipleValuesUsingClient() { } private String getHostAndPort() { - return consulContainer.getHost() + ":" + consulContainer.getMappedPort(8500); + return consul.getHost() + ":" + consul.getMappedPort(8500); } } From 32536adca8f03b6d03dee9bebea07a98f8c4c527 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 2 Sep 2025 11:27:58 -0500 Subject: [PATCH 0778/1224] Move Couchbase tests to JUnit Jupiter (#10734) --- modules/couchbase/build.gradle | 7 +++++++ .../couchbase/CouchbaseContainerTest.java | 18 +++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/modules/couchbase/build.gradle b/modules/couchbase/build.gradle index d4b481d41ec..b686c581dcf 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,6 +5,9 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.couchbase.client:java-client:3.9.0' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.assertj:assertj-core:3.27.4' @@ -15,3 +18,7 @@ tasks.japicmp { "org.testcontainers.couchbase.CouchbaseContainer" ] } + +test { + useJUnitPlatform() +} 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 b78e3666f31..b973d5eff2a 100644 --- a/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java +++ b/modules/couchbase/src/test/java/org/testcontainers/couchbase/CouchbaseContainerTest.java @@ -20,7 +20,7 @@ import com.couchbase.client.java.Cluster; import com.couchbase.client.java.Collection; import com.couchbase.client.java.json.JsonObject; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ContainerLaunchException; import java.time.Duration; @@ -30,7 +30,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.awaitility.Awaitility.await; -public class CouchbaseContainerTest { +class CouchbaseContainerTest { private static final String COUCHBASE_IMAGE_ENTERPRISE = "couchbase/server:enterprise-7.0.3"; @@ -41,22 +41,22 @@ public class CouchbaseContainerTest { private static final String COUCHBASE_IMAGE_COMMUNITY_RECENT = "couchbase/server:community-7.6.2"; @Test - public void testBasicContainerUsageForEnterpriseContainer() { + void testBasicContainerUsageForEnterpriseContainer() { testBasicContainerUsage(COUCHBASE_IMAGE_ENTERPRISE); } @Test - public void testBasicContainerUsageForEnterpriseContainerRecent() { + void testBasicContainerUsageForEnterpriseContainerRecent() { testBasicContainerUsage(COUCHBASE_IMAGE_ENTERPRISE_RECENT); } @Test - public void testBasicContainerUsageForCommunityContainer() { + void testBasicContainerUsageForCommunityContainer() { testBasicContainerUsage(COUCHBASE_IMAGE_COMMUNITY); } @Test - public void testBasicContainerUsageForCommunityContainerRecent() { + void testBasicContainerUsageForCommunityContainerRecent() { testBasicContainerUsage(COUCHBASE_IMAGE_COMMUNITY_RECENT); } @@ -89,7 +89,7 @@ private void testBasicContainerUsage(String couchbaseImage) { } @Test - public void testBucketIsFlushableIfEnabled() { + void testBucketIsFlushableIfEnabled() { BucketDefinition bucketDefinition = new BucketDefinition("mybucket").withFlushEnabled(true); try ( @@ -119,7 +119,7 @@ public void testBucketIsFlushableIfEnabled() { * edition which is not supported. */ @Test - public void testFailureIfCommunityUsedWithAnalytics() { + void testFailureIfCommunityUsedWithAnalytics() { try ( CouchbaseContainer container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY) .withEnabledServices(CouchbaseService.KV, CouchbaseService.ANALYTICS) @@ -136,7 +136,7 @@ public void testFailureIfCommunityUsedWithAnalytics() { * edition which is not supported. */ @Test - public void testFailureIfCommunityUsedWithEventing() { + void testFailureIfCommunityUsedWithEventing() { try ( CouchbaseContainer container = new CouchbaseContainer(COUCHBASE_IMAGE_COMMUNITY) .withEnabledServices(CouchbaseService.KV, CouchbaseService.EVENTING) From b22686663581849f7768214f9c2872ce1ded3e07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 2 Sep 2025 12:21:06 -0500 Subject: [PATCH 0779/1224] Move Elasticsearch tests to JUnit Jupiter (#10735) --- modules/elasticsearch/build.gradle | 8 ++++ .../ElasticsearchContainerTest.java | 48 +++++++++---------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle index 075e0e39533..31b7e66705f 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -2,6 +2,10 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.2" testImplementation "org.elasticsearch.client:transport:7.17.29" testImplementation 'org.assertj:assertj-core:3.27.4' @@ -12,3 +16,7 @@ tasks.japicmp { "org.testcontainers.elasticsearch.ElasticsearchContainer" ] } + +test { + useJUnitPlatform() +} 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 4c308169bc6..f0219713751 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java @@ -16,8 +16,8 @@ import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.transport.TransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; -import org.junit.After; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; @@ -34,7 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class ElasticsearchContainerTest { +class ElasticsearchContainerTest { /** * Elasticsearch version which should be used for the Tests @@ -59,7 +59,7 @@ public class ElasticsearchContainerTest { private RestClient anonymousClient = null; - @After + @AfterEach public void stopRestClient() throws IOException { if (client != null) { client.close(); @@ -74,7 +74,7 @@ public void stopRestClient() throws IOException { @SuppressWarnings("deprecation") // Using deprecated constructor for verification of backwards compatibility @Test @Deprecated // We will remove this test in the future - public void elasticsearchDeprecatedCtorTest() throws IOException { + void elasticsearchDeprecatedCtorTest() throws IOException { // Create the elasticsearch container. try ( ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE).withEnv("foo", "bar") // dummy env for compiler checking correct generics usage @@ -96,7 +96,7 @@ public void elasticsearchDeprecatedCtorTest() throws IOException { } @Test - public void elasticsearchDefaultTest() throws IOException { + void elasticsearchDefaultTest() throws IOException { // Create the elasticsearch container. try ( ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE).withEnv("foo", "bar") // dummy env for compiler checking correct generics usage @@ -118,7 +118,7 @@ public void elasticsearchDefaultTest() throws IOException { } @Test - public void elasticsearchSecuredTest() throws IOException { + void elasticsearchSecuredTest() throws IOException { try ( ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE) .withPassword(ELASTICSEARCH_PASSWORD) @@ -138,7 +138,7 @@ public void elasticsearchSecuredTest() throws IOException { } @Test - public void elasticsearchVersion() throws IOException { + void elasticsearchVersion() throws IOException { try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { container.start(); Response response = getClient(container).performRequest(new Request("GET", "/")); @@ -149,7 +149,7 @@ public void elasticsearchVersion() throws IOException { } @Test - public void elasticsearchVersion83() throws IOException { + void elasticsearchVersion83() throws IOException { try ( ElasticsearchContainer container = new ElasticsearchContainer( "docker.elastic.co/elasticsearch/elasticsearch:8.3.0" @@ -163,7 +163,7 @@ public void elasticsearchVersion83() throws IOException { } @Test - public void elasticsearchOssImage() throws IOException { + void elasticsearchOssImage() throws IOException { try ( // ossContainer { ElasticsearchContainer container = new ElasticsearchContainer( @@ -182,7 +182,7 @@ public void elasticsearchOssImage() throws IOException { } @Test - public void restClientClusterHealth() throws IOException { + void restClientClusterHealth() throws IOException { // httpClientContainer7 { // Create the elasticsearch container. try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { @@ -214,7 +214,7 @@ public void restClientClusterHealth() throws IOException { } @Test - public void restClientClusterHealthElasticsearch8() throws IOException { + void restClientClusterHealthElasticsearch8() throws IOException { // httpClientContainer8 { // Create the elasticsearch container. try ( @@ -254,7 +254,7 @@ public void restClientClusterHealthElasticsearch8() throws IOException { } @Test - public void restClientClusterHealthElasticsearch8WithoutSSL() throws IOException { + void restClientClusterHealthElasticsearch8WithoutSSL() throws IOException { // httpClientContainerNoSSL8 { // Create the elasticsearch container. try ( @@ -293,7 +293,7 @@ public void restClientClusterHealthElasticsearch8WithoutSSL() throws IOException } @Test - public void restClientSecuredClusterHealth() throws IOException { + void restClientSecuredClusterHealth() throws IOException { // httpClientSecuredContainer { // Create the elasticsearch container. try ( @@ -330,7 +330,7 @@ public void restClientSecuredClusterHealth() throws IOException { @SuppressWarnings("deprecation") // The TransportClient will be removed in Elasticsearch 8. @Test - public void transportClientClusterHealth() { + void transportClientClusterHealth() { // transportClientContainer { // Create the elasticsearch container. try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { @@ -356,7 +356,7 @@ public void transportClientClusterHealth() { } @Test - public void incompatibleSettingsTest() { + void incompatibleSettingsTest() { // The OSS image can not use security feature assertThat( catchThrowable(() -> { @@ -369,7 +369,7 @@ public void incompatibleSettingsTest() { } @Test - public void testDockerHubElasticsearch8ImageSecureByDefault() throws Exception { + void testDockerHubElasticsearch8ImageSecureByDefault() throws Exception { try (ElasticsearchContainer container = new ElasticsearchContainer("elasticsearch:8.1.2")) { container.start(); @@ -378,7 +378,7 @@ public void testDockerHubElasticsearch8ImageSecureByDefault() throws Exception { } @Test - public void testElasticsearch8SecureByDefaultCustomCaCertFails() throws Exception { + void testElasticsearch8SecureByDefaultCustomCaCertFails() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("http_ca.crt"); String caPath = "/tmp/http_ca.crt"; try ( @@ -400,7 +400,7 @@ public void testElasticsearch8SecureByDefaultCustomCaCertFails() throws Exceptio } @Test - public void testElasticsearch8SecureByDefaultHttpWaitStrategy() throws Exception { + void testElasticsearch8SecureByDefaultHttpWaitStrategy() throws Exception { final HttpWaitStrategy httpsWaitStrategy = Wait .forHttps("/") .forPort(9200) @@ -423,7 +423,7 @@ public void testElasticsearch8SecureByDefaultHttpWaitStrategy() throws Exception } @Test - public void testElasticsearch8SecureByDefaultFailsSilentlyOnLatestImages() throws Exception { + void testElasticsearch8SecureByDefaultFailsSilentlyOnLatestImages() throws Exception { // this test exists for custom images by users that use the `latest` tag // even though the version might be older than version 8 // this tags an old 7.x version as :latest @@ -442,7 +442,7 @@ public void testElasticsearch8SecureByDefaultFailsSilentlyOnLatestImages() throw } @Test - public void testElasticsearch7CanHaveSecurityEnabledAndUseSslContext() throws Exception { + void testElasticsearch7CanHaveSecurityEnabledAndUseSslContext() throws Exception { String customizedCertPath = "/usr/share/elasticsearch/config/certs/http_ca_customized.crt"; try ( ElasticsearchContainer container = new ElasticsearchContainer( @@ -485,7 +485,7 @@ public void testElasticsearch7CanHaveSecurityEnabledAndUseSslContext() throws Ex } @Test - public void testElasticsearchDefaultMaxHeapSize() throws Exception { + void testElasticsearchDefaultMaxHeapSize() throws Exception { long defaultHeapSize = 2147483648L; try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { @@ -495,7 +495,7 @@ public void testElasticsearchDefaultMaxHeapSize() throws Exception { } @Test - public void testElasticsearchCustomMaxHeapSizeInEnvironmentVariable() throws Exception { + void testElasticsearchCustomMaxHeapSizeInEnvironmentVariable() throws Exception { long customHeapSize = 1574961152; try ( @@ -508,7 +508,7 @@ public void testElasticsearchCustomMaxHeapSizeInEnvironmentVariable() throws Exc } @Test - public void testElasticsearchCustomMaxHeapSizeInJvmOptionsFile() throws Exception { + void testElasticsearchCustomMaxHeapSizeInJvmOptionsFile() throws Exception { long customHeapSize = 1574961152; try ( From 5b8fdbc1816ac99d665ffb601e7dd1cd893b9674 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 2 Sep 2025 15:35:42 -0500 Subject: [PATCH 0780/1224] Move GCloud tests to JUnit Jupiter (#10736) --- modules/gcloud/build.gradle | 7 ++ .../BigQueryEmulatorContainerTest.java | 6 +- .../BigtableEmulatorContainerTest.java | 73 +++++++------ .../DatastoreEmulatorContainerTest.java | 48 ++++----- .../FirestoreEmulatorContainerTest.java | 62 +++++------ .../PubSubEmulatorContainerTest.java | 101 +++++++++--------- .../SpannerEmulatorContainerTest.java | 86 +++++++-------- 7 files changed, 198 insertions(+), 185 deletions(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 4deec14af03..5fabdf773df 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,6 +3,9 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform("com.google.cloud:libraries-bom:26.66.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' @@ -12,3 +15,7 @@ dependencies { testImplementation 'com.google.cloud:google-cloud-bigtable' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java index 01fcbe137a6..7f06a67c26c 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java @@ -5,7 +5,7 @@ import com.google.cloud.bigquery.BigQueryOptions; import com.google.cloud.bigquery.QueryJobConfiguration; import com.google.cloud.bigquery.TableResult; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.math.BigDecimal; import java.util.List; @@ -13,10 +13,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class BigQueryEmulatorContainerTest { +class BigQueryEmulatorContainerTest { @Test - public void test() throws Exception { + void test() throws Exception { try ( // emulatorContainer { BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3") diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java index a532d5e70af..8c84cfa79db 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java @@ -19,8 +19,7 @@ import com.google.cloud.bigtable.data.v2.models.TableId; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.io.IOException; @@ -28,48 +27,52 @@ import static org.assertj.core.api.Assertions.assertThat; -public class BigtableEmulatorContainerTest { +class BigtableEmulatorContainerTest { - public static final String PROJECT_ID = "test-project"; + private static final String PROJECT_ID = "test-project"; - public static final String INSTANCE_ID = "test-instance"; - - @Rule - // emulatorContainer { - public BigtableEmulatorContainer emulator = new BigtableEmulatorContainer( - DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") - ); - - // } + private static final String INSTANCE_ID = "test-instance"; @Test // testWithEmulatorContainer { - public void testSimple() throws IOException { - ManagedChannel channel = ManagedChannelBuilder.forTarget(emulator.getEmulatorEndpoint()).usePlaintext().build(); - - TransportChannelProvider channelProvider = FixedTransportChannelProvider.create( - GrpcTransportChannel.create(channel) - ); - NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); - createTable(channelProvider, credentialsProvider, "test-table"); + void testSimple() throws IOException { try ( - BigtableDataClient client = BigtableDataClient.create( - BigtableDataSettings - .newBuilderForEmulator(emulator.getHost(), emulator.getEmulatorPort()) - .setProjectId(PROJECT_ID) - .setInstanceId(INSTANCE_ID) - .build() - ) + // emulatorContainer { + BigtableEmulatorContainer emulator = new BigtableEmulatorContainer( + DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") + ); + // } ) { - client.mutateRow(RowMutation.create(TableId.of("test-table"), "1").setCell("name", "firstName", "Ray")); + emulator.start(); + ManagedChannel channel = ManagedChannelBuilder + .forTarget(emulator.getEmulatorEndpoint()) + .usePlaintext() + .build(); + + TransportChannelProvider channelProvider = FixedTransportChannelProvider.create( + GrpcTransportChannel.create(channel) + ); + NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + createTable(channelProvider, credentialsProvider, "test-table"); + try ( + BigtableDataClient client = BigtableDataClient.create( + BigtableDataSettings + .newBuilderForEmulator(emulator.getHost(), emulator.getEmulatorPort()) + .setProjectId(PROJECT_ID) + .setInstanceId(INSTANCE_ID) + .build() + ) + ) { + client.mutateRow(RowMutation.create(TableId.of("test-table"), "1").setCell("name", "firstName", "Ray")); - Row row = client.readRow(TableId.of("test-table"), "1"); - List cells = row.getCells("name", "firstName"); + Row row = client.readRow(TableId.of("test-table"), "1"); + List cells = row.getCells("name", "firstName"); - assertThat(cells).isNotNull().hasSize(1); - assertThat(cells.get(0).getValue().toStringUtf8()).isEqualTo("Ray"); - } finally { - channel.shutdown(); + assertThat(cells).isNotNull().hasSize(1); + assertThat(cells.get(0).getValue().toStringUtf8()).isEqualTo("Ray"); + } finally { + channel.shutdown(); + } } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java index 7ea0ceb9a49..1b743f1e3cd 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -6,8 +6,7 @@ import com.google.cloud.datastore.DatastoreOptions; import com.google.cloud.datastore.Entity; import com.google.cloud.datastore.Key; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.io.IOException; @@ -16,37 +15,38 @@ public class DatastoreEmulatorContainerTest { - @Rule - // creatingDatastoreEmulatorContainer { - public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer( - DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") - ); - - // } - // startingDatastoreEmulatorContainer { @Test public void testSimple() { - DatastoreOptions options = DatastoreOptions - .newBuilder() - .setHost(emulator.getEmulatorEndpoint()) - .setCredentials(NoCredentials.getInstance()) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .setProjectId(emulator.getProjectId()) - .build(); - Datastore datastore = options.getService(); + try ( + // creatingDatastoreEmulatorContainer { + DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer( + DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") + ); + // } + ) { + emulator.start(); + DatastoreOptions options = DatastoreOptions + .newBuilder() + .setHost(emulator.getEmulatorEndpoint()) + .setCredentials(NoCredentials.getInstance()) + .setRetrySettings(ServiceOptions.getNoRetrySettings()) + .setProjectId(emulator.getProjectId()) + .build(); + Datastore datastore = options.getService(); - Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); - Entity entity = Entity.newBuilder(key).set("description", "my description").build(); - datastore.put(entity); + Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); + Entity entity = Entity.newBuilder(key).set("description", "my description").build(); + datastore.put(entity); - assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); + assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); + } } // } @Test - public void testWithFlags() throws IOException, InterruptedException { + void testWithFlags() throws IOException, InterruptedException { try ( DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer( "gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators" @@ -61,7 +61,7 @@ public void testWithFlags() throws IOException, InterruptedException { } @Test - public void testWithMultipleFlags() throws IOException, InterruptedException { + void testWithMultipleFlags() throws IOException, InterruptedException { try ( DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer( "gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators" diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java index 0d9773ce87a..57494ef5535 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java @@ -8,8 +8,7 @@ import com.google.cloud.firestore.FirestoreOptions; import com.google.cloud.firestore.QuerySnapshot; import com.google.cloud.firestore.WriteResult; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.util.HashMap; @@ -18,46 +17,47 @@ import static org.assertj.core.api.Assertions.assertThat; -public class FirestoreEmulatorContainerTest { - - @Rule - // emulatorContainer { - public FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer( - DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") - ); - - // } +class FirestoreEmulatorContainerTest { // testWithEmulatorContainer { @Test - public void testSimple() throws ExecutionException, InterruptedException { - FirestoreOptions options = FirestoreOptions - .getDefaultInstance() - .toBuilder() - .setHost(emulator.getEmulatorEndpoint()) - .setCredentials(NoCredentials.getInstance()) - .setProjectId("test-project") - .build(); - Firestore firestore = options.getService(); + void testSimple() throws ExecutionException, InterruptedException { + try ( + // emulatorContainer { + FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer( + DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") + ); + // } + ) { + emulator.start(); + FirestoreOptions options = FirestoreOptions + .getDefaultInstance() + .toBuilder() + .setHost(emulator.getEmulatorEndpoint()) + .setCredentials(NoCredentials.getInstance()) + .setProjectId("test-project") + .build(); + Firestore firestore = options.getService(); - CollectionReference users = firestore.collection("users"); - DocumentReference docRef = users.document("alovelace"); - Map data = new HashMap<>(); - data.put("first", "Ada"); - data.put("last", "Lovelace"); - ApiFuture result = docRef.set(data); - result.get(); + CollectionReference users = firestore.collection("users"); + DocumentReference docRef = users.document("alovelace"); + Map data = new HashMap<>(); + data.put("first", "Ada"); + data.put("last", "Lovelace"); + ApiFuture result = docRef.set(data); + result.get(); - ApiFuture query = users.get(); - QuerySnapshot querySnapshot = query.get(); + ApiFuture query = users.get(); + QuerySnapshot querySnapshot = query.get(); - assertThat(querySnapshot.getDocuments().get(0).getData()).containsEntry("first", "Ada"); + assertThat(querySnapshot.getDocuments().get(0).getData()).containsEntry("first", "Ada"); + } } // } @Test - public void testWithFlags() { + void testWithFlags() { try ( FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer( "gcr.io/google.com/cloudsdktool/google-cloud-cli:465.0.0-emulators" diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index b2f75f0f36a..7d92c50a775 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -22,70 +22,73 @@ import com.google.pubsub.v1.TopicName; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; -public class PubSubEmulatorContainerTest { +class PubSubEmulatorContainerTest { - public static final String PROJECT_ID = "my-project-id"; - - @Rule - // emulatorContainer { - public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer( - DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") - ); - - // } + private static final String PROJECT_ID = "my-project-id"; @Test // testWithEmulatorContainer { - public void testSimple() throws IOException { - String hostport = emulator.getEmulatorEndpoint(); - ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); - try { - TransportChannelProvider channelProvider = FixedTransportChannelProvider.create( - GrpcTransportChannel.create(channel) + void testSimple() throws IOException { + try ( + // emulatorContainer { + PubSubEmulatorContainer emulator = new PubSubEmulatorContainer( + DockerImageName.parse("gcr.io/google.com/cloudsdktool/google-cloud-cli:441.0.0-emulators") ); - NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); - - String topicId = "my-topic-id"; - createTopic(topicId, channelProvider, credentialsProvider); - - String subscriptionId = "my-subscription-id"; - createSubscription(subscriptionId, topicId, channelProvider, credentialsProvider); - - Publisher publisher = Publisher - .newBuilder(TopicName.of(PROJECT_ID, topicId)) - .setChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); - publisher.publish(message); - - SubscriberStubSettings subscriberStubSettings = SubscriberStubSettings - .newBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - try (SubscriberStub subscriber = GrpcSubscriberStub.create(subscriberStubSettings)) { - PullRequest pullRequest = PullRequest + // } + ) { + emulator.start(); + String hostport = emulator.getEmulatorEndpoint(); + ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); + try { + TransportChannelProvider channelProvider = FixedTransportChannelProvider.create( + GrpcTransportChannel.create(channel) + ); + NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + + String topicId = "my-topic-id"; + createTopic(topicId, channelProvider, credentialsProvider); + + String subscriptionId = "my-subscription-id"; + createSubscription(subscriptionId, topicId, channelProvider, credentialsProvider); + + Publisher publisher = Publisher + .newBuilder(TopicName.of(PROJECT_ID, topicId)) + .setChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + PubsubMessage message = PubsubMessage .newBuilder() - .setMaxMessages(1) - .setSubscription(ProjectSubscriptionName.format(PROJECT_ID, subscriptionId)) + .setData(ByteString.copyFromUtf8("test message")) .build(); - PullResponse pullResponse = subscriber.pullCallable().call(pullRequest); + publisher.publish(message); - assertThat(pullResponse.getReceivedMessagesList()).hasSize(1); - assertThat(pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8()) - .isEqualTo("test message"); + SubscriberStubSettings subscriberStubSettings = SubscriberStubSettings + .newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + try (SubscriberStub subscriber = GrpcSubscriberStub.create(subscriberStubSettings)) { + PullRequest pullRequest = PullRequest + .newBuilder() + .setMaxMessages(1) + .setSubscription(ProjectSubscriptionName.format(PROJECT_ID, subscriptionId)) + .build(); + PullResponse pullResponse = subscriber.pullCallable().call(pullRequest); + + assertThat(pullResponse.getReceivedMessagesList()).hasSize(1); + assertThat(pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8()) + .isEqualTo("test message"); + } + } finally { + channel.shutdown(); } - } finally { - channel.shutdown(); } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java index b246e7e1f0d..3d651ad6a53 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java @@ -14,8 +14,7 @@ import com.google.cloud.spanner.Spanner; import com.google.cloud.spanner.SpannerOptions; import com.google.cloud.spanner.Statement; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.util.Arrays; @@ -23,15 +22,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SpannerEmulatorContainerTest { - - @Rule - // emulatorContainer { - public SpannerEmulatorContainer emulator = new SpannerEmulatorContainer( - DockerImageName.parse("gcr.io/cloud-spanner-emulator/emulator:1.4.0") - ); - - // } +class SpannerEmulatorContainerTest { private static final String PROJECT_NAME = "test-project"; @@ -41,38 +32,47 @@ public class SpannerEmulatorContainerTest { // testWithEmulatorContainer { @Test - public void testSimple() throws ExecutionException, InterruptedException { - SpannerOptions options = SpannerOptions - .newBuilder() - .setEmulatorHost(emulator.getEmulatorGrpcEndpoint()) - .setCredentials(NoCredentials.getInstance()) - .setProjectId(PROJECT_NAME) - .build(); - - Spanner spanner = options.getService(); - - InstanceId instanceId = createInstance(spanner); - - createDatabase(spanner); - - DatabaseId databaseId = DatabaseId.of(instanceId, DATABASE_NAME); - DatabaseClient dbClient = spanner.getDatabaseClient(databaseId); - dbClient - .readWriteTransaction() - .run(tx -> { - String sql1 = "Delete from TestTable where 1=1"; - tx.executeUpdate(Statement.of(sql1)); - String sql = "INSERT INTO TestTable (Key, Value) VALUES (1, 'Java'), (2, 'Go')"; - tx.executeUpdate(Statement.of(sql)); - return null; - }); - - ResultSet resultSet = dbClient - .readOnlyTransaction() - .executeQuery(Statement.of("select * from TestTable order by Key")); - resultSet.next(); - assertThat(resultSet.getLong(0)).isEqualTo(1); - assertThat(resultSet.getString(1)).isEqualTo("Java"); + void testSimple() throws ExecutionException, InterruptedException { + try ( + // emulatorContainer { + SpannerEmulatorContainer emulator = new SpannerEmulatorContainer( + DockerImageName.parse("gcr.io/cloud-spanner-emulator/emulator:1.4.0") + ); + // } + ) { + emulator.start(); + SpannerOptions options = SpannerOptions + .newBuilder() + .setEmulatorHost(emulator.getEmulatorGrpcEndpoint()) + .setCredentials(NoCredentials.getInstance()) + .setProjectId(PROJECT_NAME) + .build(); + + Spanner spanner = options.getService(); + + InstanceId instanceId = createInstance(spanner); + + createDatabase(spanner); + + DatabaseId databaseId = DatabaseId.of(instanceId, DATABASE_NAME); + DatabaseClient dbClient = spanner.getDatabaseClient(databaseId); + dbClient + .readWriteTransaction() + .run(tx -> { + String sql1 = "Delete from TestTable where 1=1"; + tx.executeUpdate(Statement.of(sql1)); + String sql = "INSERT INTO TestTable (Key, Value) VALUES (1, 'Java'), (2, 'Go')"; + tx.executeUpdate(Statement.of(sql)); + return null; + }); + + ResultSet resultSet = dbClient + .readOnlyTransaction() + .executeQuery(Statement.of("select * from TestTable order by Key")); + resultSet.next(); + assertThat(resultSet.getLong(0)).isEqualTo(1); + assertThat(resultSet.getString(1)).isEqualTo("Java"); + } } // } From b5869ab0be991e2e389ae0c26c7d4d785aff7921 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 2 Sep 2025 16:05:01 -0500 Subject: [PATCH 0781/1224] Move Grafana tests to JUnit Jupiter (#10737) --- modules/grafana/build.gradle | 9 ++++++++- .../testcontainers/grafana/LgtmStackContainerTest.java | 6 +++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 1bb588498d8..bd69ea40170 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -3,13 +3,20 @@ description = "Testcontainers :: Grafana" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.3' - testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.8' + testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.53.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' } + +test { + useJUnitPlatform() +} diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java index ba4fb94856c..ff8d5cb6609 100644 --- a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -21,7 +21,7 @@ import io.restassured.RestAssured; import io.restassured.response.Response; import org.awaitility.Awaitility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import uk.org.webcompere.systemstubs.SystemStubs; import java.time.Duration; @@ -29,10 +29,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class LgtmStackContainerTest { +class LgtmStackContainerTest { @Test - public void shouldPublishMetricsTracesAndLogs() throws Exception { + void shouldPublishMetricsTracesAndLogs() throws Exception { try ( // container { LgtmStackContainer lgtm = new LgtmStackContainer("grafana/otel-lgtm:0.11.1") // } From ad84679a7463bcf34eb57630ec993251f06decf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 10:17:14 -0600 Subject: [PATCH 0782/1224] Move InfluxDB tests to JUnit Jupiter (#10738) --- modules/influxdb/build.gradle | 7 +++++++ .../containers/InfluxDBContainerTest.java | 12 ++++++------ .../containers/InfluxDBContainerV1Test.java | 12 ++++++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index 208ae171ec2..3fcb2925e13 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -5,6 +5,9 @@ dependencies { compileOnly 'org.influxdb:influxdb-java:2.25' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.influxdb:influxdb-java:2.25' testImplementation "com.influxdb:influxdb-client-java:7.3.0" @@ -15,3 +18,7 @@ tasks.japicmp { "org.testcontainers.containers.InfluxDBContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java index a3862fb7242..53678fa6dce 100644 --- a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java +++ b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerTest.java @@ -11,7 +11,7 @@ import com.influxdb.client.write.Point; import com.influxdb.query.FluxRecord; import com.influxdb.query.FluxTable; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.time.Instant; @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class InfluxDBContainerTest { +class InfluxDBContainerTest { private static final String USERNAME = "new-test-user"; @@ -37,7 +37,7 @@ public class InfluxDBContainerTest { private static final int SECONDS_IN_WEEK = 604800; @Test - public void getInfluxDBClient() { + void getInfluxDBClient() { try ( // constructorWithDefaultVariables { final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( @@ -55,7 +55,7 @@ public void getInfluxDBClient() { } @Test - public void getInfluxDBClientWithAdminToken() { + void getInfluxDBClientWithAdminToken() { try ( // constructorWithAdminToken { final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( @@ -81,7 +81,7 @@ public void getInfluxDBClientWithAdminToken() { } @Test - public void getBucket() { + void getBucket() { try ( // constructorWithCustomVariables { final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( @@ -111,7 +111,7 @@ public void getBucket() { } @Test - public void queryForWriteAndRead() { + void queryForWriteAndRead() { try ( final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( InfluxDBTestUtils.INFLUXDB_V2_TEST_IMAGE diff --git a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerV1Test.java b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerV1Test.java index c9e292c5675..ea074cee68e 100644 --- a/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerV1Test.java +++ b/modules/influxdb/src/test/java/org/testcontainers/containers/InfluxDBContainerV1Test.java @@ -5,14 +5,14 @@ import org.influxdb.dto.Point; import org.influxdb.dto.Query; import org.influxdb.dto.QueryResult; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; -public class InfluxDBContainerV1Test { +class InfluxDBContainerV1Test { private static final String TEST_VERSION = InfluxDBTestUtils.INFLUXDB_V1_TEST_IMAGE.getVersionPart(); @@ -23,7 +23,7 @@ public class InfluxDBContainerV1Test { private static final String PASSWORD = "new-test-password"; @Test - public void createInfluxDBOnlyWithUrlAndCorrectVersion() { + void createInfluxDBOnlyWithUrlAndCorrectVersion() { try ( // constructorWithDefaultVariables { final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( @@ -43,7 +43,7 @@ public void createInfluxDBOnlyWithUrlAndCorrectVersion() { } @Test - public void getNewInfluxDBWithCorrectVersion() { + void getNewInfluxDBWithCorrectVersion() { try ( final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( InfluxDBTestUtils.INFLUXDB_V1_TEST_IMAGE @@ -61,7 +61,7 @@ public void getNewInfluxDBWithCorrectVersion() { } @Test - public void describeDatabases() { + void describeDatabases() { try ( // constructorWithUserPassword { final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( @@ -82,7 +82,7 @@ public void describeDatabases() { } @Test - public void queryForWriteAndRead() { + void queryForWriteAndRead() { try ( final InfluxDBContainer influxDBContainer = new InfluxDBContainer<>( InfluxDBTestUtils.INFLUXDB_V1_TEST_IMAGE From 3f517a19d3626bbfe0db283d13f538b7db6c5b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 11:01:03 -0600 Subject: [PATCH 0783/1224] Move K3s tests to JUnit Jupiter (#10741) --- modules/k3s/build.gradle | 7 +++++ .../k3s/Fabric8K3sContainerTest.java | 6 ++-- .../k3s/KubectlContainerTest.java | 28 +++++++++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index ee5ed626dc1..88e3c2ffa44 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -6,7 +6,14 @@ dependencies { // Synchronize with the jackson version, must match major and minor version shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.fabric8:kubernetes-client:7.3.1' testImplementation 'io.kubernetes:client-java:24.0.0-legacy' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java b/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java index 42b08444555..50b2e17f1fc 100644 --- a/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java +++ b/modules/k3s/src/test/java/org/testcontainers/k3s/Fabric8K3sContainerTest.java @@ -12,7 +12,7 @@ import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.dsl.Resource; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.utility.DockerImageName; @@ -22,10 +22,10 @@ import static org.assertj.core.api.Assertions.assertThat; @Slf4j -public class Fabric8K3sContainerTest { +class Fabric8K3sContainerTest { @Test - public void shouldStartAndHaveListableNode() { + void shouldStartAndHaveListableNode() { try ( // starting_k3s { K3sContainer k3s = new K3sContainer(DockerImageName.parse("rancher/k3s:v1.21.3-k3s1")) diff --git a/modules/k3s/src/test/java/org/testcontainers/k3s/KubectlContainerTest.java b/modules/k3s/src/test/java/org/testcontainers/k3s/KubectlContainerTest.java index 5c0d44ff0f1..6dcd7421363 100644 --- a/modules/k3s/src/test/java/org/testcontainers/k3s/KubectlContainerTest.java +++ b/modules/k3s/src/test/java/org/testcontainers/k3s/KubectlContainerTest.java @@ -1,7 +1,8 @@ package org.testcontainers.k3s; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -11,16 +12,26 @@ import java.time.Duration; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class KubectlContainerTest { +class KubectlContainerTest { - public static Network network = Network.SHARED; + private static final Network network = Network.SHARED; - @ClassRule - public static K3sContainer k3s = new K3sContainer(DockerImageName.parse("rancher/k3s:v1.21.3-k3s1")) + private static final K3sContainer k3s = new K3sContainer(DockerImageName.parse("rancher/k3s:v1.21.3-k3s1")) .withNetwork(network) .withNetworkAliases("k3s"); + @BeforeAll + static void setup() { + k3s.start(); + } + + @AfterAll + static void teardown() { + k3s.stop(); + } + @Test public void shouldExposeKubeConfigForNetworkAlias() throws Exception { String kubeConfigYaml = k3s.generateInternalKubeConfigYaml("k3s"); @@ -38,8 +49,9 @@ public void shouldExposeKubeConfigForNetworkAlias() throws Exception { } } - @Test(expected = IllegalArgumentException.class) + @Test public void shouldThrowAnExceptionForUnknownNetworkAlias() { - k3s.generateInternalKubeConfigYaml("not-set-network-alias"); + assertThatThrownBy(() -> k3s.generateInternalKubeConfigYaml("not-set-network-alias")) + .isInstanceOf(IllegalArgumentException.class); } } From 1f8e37c989879bbf25e4db5cec313b81aac3190f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 11:26:09 -0600 Subject: [PATCH 0784/1224] Move K6 tests to JUnit Jupiter (#10742) --- modules/k6/build.gradle | 7 +++++++ .../test/java/org/testcontainers/k6/K6ContainerTests.java | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/k6/build.gradle b/modules/k6/build.gradle index 943208029c6..369f35a6c9a 100644 --- a/modules/k6/build.gradle +++ b/modules/k6/build.gradle @@ -3,5 +3,12 @@ description = "Testcontainers :: k6" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java b/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java index f912fcd7dcf..255cb376b4f 100644 --- a/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java +++ b/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java @@ -1,6 +1,6 @@ package org.testcontainers.k6; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.output.WaitingConsumer; import org.testcontainers.utility.MountableFile; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class K6ContainerTests { +class K6ContainerTests { @Test - public void k6StandardTest() throws Exception { + void k6StandardTest() throws Exception { try ( // standard_k6 { K6Container container = new K6Container("grafana/k6:0.49.0") From 899a2a84d3fdadf2429b7bed74e4c2b80b5b9c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 11:57:52 -0600 Subject: [PATCH 0785/1224] Move Kafka tests to JUnit Jupiter (#10743) --- modules/kafka/build.gradle | 8 ++++ .../containers/KafkaContainerTest.java | 40 +++++++++---------- .../kafka/CompatibleApacheKafkaImageTest.java | 17 +++----- .../kafka/ConfluentKafkaContainerTest.java | 14 +++---- .../kafka/KafkaContainerTest.java | 10 ++--- 5 files changed, 46 insertions(+), 43 deletions(-) diff --git a/modules/kafka/build.gradle b/modules/kafka/build.gradle index ebfcca345a4..baee466d59e 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -3,8 +3,16 @@ description = "Testcontainers :: Kafka" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'org.apache.kafka:kafka-clients:3.8.0' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.google.guava:guava:23.0' testImplementation 'org.awaitility:awaitility:4.3.0' } + +test { + useJUnitPlatform() +} diff --git a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java index 49b21108da8..e244d7a2e26 100644 --- a/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/containers/KafkaContainerTest.java @@ -9,7 +9,7 @@ import org.apache.kafka.common.errors.SaslAuthenticationException; import org.apache.kafka.common.errors.TopicAuthorizationException; import org.awaitility.Awaitility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.AbstractKafka; import org.testcontainers.Testcontainers; import org.testcontainers.images.builder.Transferable; @@ -24,7 +24,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class KafkaContainerTest extends AbstractKafka { +class KafkaContainerTest extends AbstractKafka { private static final DockerImageName KAFKA_TEST_IMAGE = DockerImageName.parse("confluentinc/cp-kafka:6.2.1"); @@ -35,7 +35,7 @@ public class KafkaContainerTest extends AbstractKafka { ); @Test - public void testUsage() throws Exception { + void testUsage() throws Exception { try (KafkaContainer kafka = new KafkaContainer(KAFKA_TEST_IMAGE)) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); @@ -43,7 +43,7 @@ public void testUsage() throws Exception { } @Test - public void testUsageWithSpecificImage() throws Exception { + void testUsageWithSpecificImage() throws Exception { try ( // constructorWithVersion { KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.1")) @@ -59,7 +59,7 @@ public void testUsageWithSpecificImage() throws Exception { } @Test - public void testUsageWithVersion() throws Exception { + void testUsageWithVersion() throws Exception { try (KafkaContainer kafka = new KafkaContainer("6.2.1")) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); @@ -67,7 +67,7 @@ public void testUsageWithVersion() throws Exception { } @Test - public void testExternalZookeeperWithExternalNetwork() throws Exception { + void testExternalZookeeperWithExternalNetwork() throws Exception { try ( Network network = Network.newNetwork(); // withExternalZookeeper { @@ -89,7 +89,7 @@ public void testExternalZookeeperWithExternalNetwork() throws Exception { } @Test - public void testConfluentPlatformVersion7() throws Exception { + void testConfluentPlatformVersion7() throws Exception { try (KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.2.2"))) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); @@ -97,7 +97,7 @@ public void testConfluentPlatformVersion7() throws Exception { } @Test - public void testConfluentPlatformVersion5() throws Exception { + void testConfluentPlatformVersion5() throws Exception { try (KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:5.4.3"))) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); @@ -105,7 +105,7 @@ public void testConfluentPlatformVersion5() throws Exception { } @Test - public void testWithHostExposedPort() throws Exception { + void testWithHostExposedPort() throws Exception { Testcontainers.exposeHostPorts(12345); try (KafkaContainer kafka = new KafkaContainer(KAFKA_TEST_IMAGE)) { kafka.start(); @@ -114,7 +114,7 @@ public void testWithHostExposedPort() throws Exception { } @Test - public void testWithHostExposedPortAndExternalNetwork() throws Exception { + void testWithHostExposedPortAndExternalNetwork() throws Exception { Testcontainers.exposeHostPorts(12345); try (KafkaContainer kafka = new KafkaContainer(KAFKA_TEST_IMAGE).withNetwork(Network.newNetwork())) { kafka.start(); @@ -123,7 +123,7 @@ public void testWithHostExposedPortAndExternalNetwork() throws Exception { } @Test - public void testUsageKraftBeforeConfluentPlatformVersion74() throws Exception { + void testUsageKraftBeforeConfluentPlatformVersion74() throws Exception { try ( KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.0.1")).withKraft() ) { @@ -133,7 +133,7 @@ public void testUsageKraftBeforeConfluentPlatformVersion74() throws Exception { } @Test - public void testUsageKraftAfterConfluentPlatformVersion74() throws Exception { + void testUsageKraftAfterConfluentPlatformVersion74() throws Exception { try ( // withKraftMode { KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.4.0")).withKraft() @@ -145,7 +145,7 @@ public void testUsageKraftAfterConfluentPlatformVersion74() throws Exception { } @Test - public void testNotSupportedKraftVersion() { + void testNotSupportedKraftVersion() { try ( KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.1")).withKraft() ) {} catch (IllegalArgumentException e) { @@ -157,7 +157,7 @@ public void testNotSupportedKraftVersion() { } @Test - public void testKraftZookeeperMutualExclusion() { + void testKraftZookeeperMutualExclusion() { try ( KafkaContainer kafka = new KafkaContainer(KAFKA_KRAFT_TEST_IMAGE).withKraft().withExternalZookeeper("") ) {} catch (IllegalStateException e) { @@ -178,7 +178,7 @@ public void testKraftZookeeperMutualExclusion() { } @Test - public void testKraftPrecedenceOverEmbeddedZookeeper() throws Exception { + void testKraftPrecedenceOverEmbeddedZookeeper() throws Exception { try (KafkaContainer kafka = new KafkaContainer(KAFKA_KRAFT_TEST_IMAGE).withEmbeddedZookeeper().withKraft()) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); @@ -186,7 +186,7 @@ public void testKraftPrecedenceOverEmbeddedZookeeper() throws Exception { } @Test - public void testUsageWithListener() throws Exception { + void testUsageWithListener() throws Exception { try ( Network network = Network.newNetwork(); KafkaContainer kafka = new KafkaContainer(KAFKA_KRAFT_TEST_IMAGE) @@ -216,7 +216,7 @@ public void testUsageWithListener() throws Exception { @SneakyThrows @Test - public void shouldConfigureAuthenticationWithSaslUsingJaas() { + void shouldConfigureAuthenticationWithSaslUsingJaas() { try ( KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.1")) .withEnv("KAFKA_LISTENER_SECURITY_PROTOCOL_MAP", "PLAINTEXT:SASL_PLAINTEXT,BROKER:SASL_PLAINTEXT") @@ -234,7 +234,7 @@ public void shouldConfigureAuthenticationWithSaslUsingJaas() { @SneakyThrows @Test - public void shouldConfigureAuthenticationWithSaslScramUsingJaas() { + void shouldConfigureAuthenticationWithSaslScramUsingJaas() { try ( KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:7.7.0")) { protected String commandKraft() { @@ -265,7 +265,7 @@ protected String commandKraft() { @SneakyThrows @Test - public void enableSaslWithUnsuccessfulTopicCreation() { + void enableSaslWithUnsuccessfulTopicCreation() { try ( KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.1")) .withEnv("KAFKA_LISTENER_SECURITY_PROTOCOL_MAP", "PLAINTEXT:SASL_PLAINTEXT,BROKER:SASL_PLAINTEXT") @@ -306,7 +306,7 @@ public void enableSaslWithUnsuccessfulTopicCreation() { @SneakyThrows @Test - public void enableSaslAndWithAuthenticationError() { + void enableSaslAndWithAuthenticationError() { String jaasConfig = getJaasConfig(); try ( KafkaContainer kafka = new KafkaContainer(DockerImageName.parse("confluentinc/cp-kafka:6.2.1")) diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java index b2bb31ae502..33916978acf 100644 --- a/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/CompatibleApacheKafkaImageTest.java @@ -1,24 +1,19 @@ package org.testcontainers.kafka; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.AbstractKafka; -@RunWith(Parameterized.class) public class CompatibleApacheKafkaImageTest extends AbstractKafka { - @Parameterized.Parameters(name = "{0}") public static String[] params() { return new String[] { "apache/kafka:3.8.0", "apache/kafka-native:3.8.0" }; } - @Parameterized.Parameter - public String imageName; - - @Test - public void testUsage() throws Exception { - try (KafkaContainer kafka = new KafkaContainer(this.imageName)) { + @ParameterizedTest + @MethodSource("params") + public void testUsage(String imageName) throws Exception { + try (KafkaContainer kafka = new KafkaContainer(imageName)) { kafka.start(); testKafkaFunctionality(kafka.getBootstrapServers()); } diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java index 725dc2d2a62..1c95bf95e02 100644 --- a/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/ConfluentKafkaContainerTest.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import lombok.SneakyThrows; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.AbstractKafka; import org.testcontainers.KCatContainer; import org.testcontainers.containers.Network; @@ -11,10 +11,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ConfluentKafkaContainerTest extends AbstractKafka { +class ConfluentKafkaContainerTest extends AbstractKafka { @Test - public void testUsage() throws Exception { + void testUsage() throws Exception { try ( // constructorWithVersion { ConfluentKafkaContainer kafka = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.4.0") // } @@ -25,7 +25,7 @@ public void testUsage() throws Exception { } @Test - public void testUsageWithListener() throws Exception { + void testUsageWithListener() throws Exception { try ( Network network = Network.newNetwork(); // registerListener { @@ -48,7 +48,7 @@ public void testUsageWithListener() throws Exception { } @Test - public void testUsageWithListenerFromProxy() throws Exception { + void testUsageWithListenerFromProxy() throws Exception { try ( Network network = Network.newNetwork(); // registerListenerFromProxy { @@ -68,7 +68,7 @@ public void testUsageWithListenerFromProxy() throws Exception { @SneakyThrows @Test - public void shouldConfigureAuthenticationWithSaslUsingJaas() { + void shouldConfigureAuthenticationWithSaslUsingJaas() { try ( ConfluentKafkaContainer kafka = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.7.0") .withEnv( @@ -89,7 +89,7 @@ public void shouldConfigureAuthenticationWithSaslUsingJaas() { @SneakyThrows @Test - public void shouldConfigureAuthenticationWithSaslScramUsingJaas() { + void shouldConfigureAuthenticationWithSaslScramUsingJaas() { try ( ConfluentKafkaContainer kafka = new ConfluentKafkaContainer("confluentinc/cp-kafka:7.7.0") { @SneakyThrows diff --git a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java index e81b52574ef..34af2e1784d 100644 --- a/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java +++ b/modules/kafka/src/test/java/org/testcontainers/kafka/KafkaContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.kafka; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.AbstractKafka; import org.testcontainers.KCatContainer; import org.testcontainers.containers.Network; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class KafkaContainerTest extends AbstractKafka { +class KafkaContainerTest extends AbstractKafka { @Test - public void testUsage() throws Exception { + void testUsage() throws Exception { try ( // constructorWithVersion { KafkaContainer kafka = new KafkaContainer("apache/kafka-native:3.8.0") // } @@ -22,7 +22,7 @@ public void testUsage() throws Exception { } @Test - public void testUsageWithListener() throws Exception { + void testUsageWithListener() throws Exception { try ( Network network = Network.newNetwork(); // registerListener { @@ -45,7 +45,7 @@ public void testUsageWithListener() throws Exception { } @Test - public void testUsageWithListenerFromProxy() throws Exception { + void testUsageWithListenerFromProxy() throws Exception { try ( Network network = Network.newNetwork(); SocatContainer socat = new SocatContainer().withNetwork(network).withTarget(2000, "kafka", 19092); From 56c39bd09c4aef4d03ff9f80c2c48e525e034346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 12:22:14 -0600 Subject: [PATCH 0786/1224] Move LDAP tests to JUnit Jupiter (#10744) --- modules/ldap/build.gradle | 8 ++++++++ .../org/testcontainers/ldap/LLdapContainerTest.java | 12 ++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/modules/ldap/build.gradle b/modules/ldap/build.gradle index fa255990be8..4722de4d317 100644 --- a/modules/ldap/build.gradle +++ b/modules/ldap/build.gradle @@ -3,6 +3,14 @@ description = "Testcontainers :: LDAP" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.3' } + +test { + useJUnitPlatform() +} + diff --git a/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java b/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java index d8914c793c2..96e77c9a3f0 100644 --- a/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java +++ b/modules/ldap/src/test/java/org/testcontainers/ldap/LLdapContainerTest.java @@ -4,14 +4,14 @@ import com.unboundid.ldap.sdk.LDAPConnection; import com.unboundid.ldap.sdk.LDAPException; import com.unboundid.ldap.sdk.LDAPURL; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class LLdapContainerTest { +class LLdapContainerTest { @Test - public void test() throws LDAPException { + void test() throws LDAPException { try ( // container { LLdapContainer lldap = new LLdapContainer("lldap/lldap:v0.6.1-alpine") // } @@ -24,7 +24,7 @@ public void test() throws LDAPException { } @Test - public void testUsingLdapUrl() throws LDAPException { + void testUsingLdapUrl() throws LDAPException { try (LLdapContainer lldap = new LLdapContainer("lldap/lldap:v0.6.1-alpine")) { lldap.start(); @@ -36,7 +36,7 @@ public void testUsingLdapUrl() throws LDAPException { } @Test - public void testWithCustomBaseDn() throws LDAPException { + void testWithCustomBaseDn() throws LDAPException { try ( LLdapContainer lldap = new LLdapContainer("lldap/lldap:v0.6.1-alpine") .withBaseDn("dc=testcontainers,dc=org") @@ -53,7 +53,7 @@ public void testWithCustomBaseDn() throws LDAPException { } @Test - public void testWithCustomUserPass() throws LDAPException { + void testWithCustomUserPass() throws LDAPException { try (LLdapContainer lldap = new LLdapContainer("lldap/lldap:v0.6.1-alpine").withUserPass("adminPas$word")) { lldap.start(); From 00ad686028ca66b4044055929eccb13acc3a5672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 13:01:14 -0600 Subject: [PATCH 0787/1224] Update ryuk version to 0.13.0 (#10745) --- .../src/main/java/org/testcontainers/utility/RyukContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/utility/RyukContainer.java b/core/src/main/java/org/testcontainers/utility/RyukContainer.java index 7c75a12b109..475a957f344 100644 --- a/core/src/main/java/org/testcontainers/utility/RyukContainer.java +++ b/core/src/main/java/org/testcontainers/utility/RyukContainer.java @@ -9,7 +9,7 @@ class RyukContainer extends GenericContainer { RyukContainer() { - super("testcontainers/ryuk:0.12.0"); + super("testcontainers/ryuk:0.13.0"); withExposedPorts(8080); withCreateContainerCmdModifier(cmd -> { cmd.withName("testcontainers-ryuk-" + DockerClientFactory.SESSION_ID); From c41e9f5395d1e36536a94c7a652721369a73deed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 19:18:33 -0600 Subject: [PATCH 0788/1224] Move LocalStack tests to JUnit Jupiter (#10746) --- modules/localstack/build.gradle | 7 + .../containers/localstack/LegacyModeTest.java | 218 +++--- .../localstack/LocalstackContainerTest.java | 673 +++++++++--------- 3 files changed, 445 insertions(+), 453 deletions(-) diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle index f939b4804cf..f4f827faccc 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,6 +3,9 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform("software.amazon.awssdk:bom:2.32.29") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' @@ -17,3 +20,7 @@ tasks.japicmp { "org.testcontainers.containers.localstack.LocalStackContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java index f888c53afeb..b2537d70b77 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LegacyModeTest.java @@ -1,154 +1,118 @@ package org.testcontainers.containers.localstack; import com.github.dockerjava.api.DockerClient; -import lombok.AllArgsConstructor; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.localstack.LocalStackContainer.Service; import org.testcontainers.images.RemoteDockerImage; import org.testcontainers.utility.DockerImageName; -import java.util.Arrays; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Enclosed.class) -public class LegacyModeTest { +class LegacyModeTest { - private static DockerImageName LOCALSTACK_CUSTOM_TAG = DockerImageName + private static final DockerImageName LOCALSTACK_CUSTOM_TAG = DockerImageName .parse("localstack/localstack:0.12.8") .withTag("custom"); - @RunWith(Parameterized.class) - @AllArgsConstructor - public static class Off { - - private final String description; - - private final LocalStackContainer localstack; - - @Parameterized.Parameters(name = "{0}") - public static Iterable constructors() { - return Arrays.asList( - new Object[][] { - { "0.12", new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_12_IMAGE) }, - { "0.11", new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_11_IMAGE) }, - { - "0.11 with legacy = off", - new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_11_IMAGE, false), - }, - } - ); - } - - @Test - public void samePortIsExposedForAllServices() { - localstack.withServices(Service.S3, Service.SQS); - localstack.start(); - - try { - assertThat(localstack.getExposedPorts()).as("A single port is exposed").hasSize(1); - assertThat(localstack.getEndpointOverride(Service.SQS).toString()) - .as("Endpoint overrides are different") - .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - assertThat(localstack.getEndpointOverride(Service.SQS).toString()) - .as("Endpoint configuration have different endpoints") - .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - } finally { - localstack.stop(); - } - } + @BeforeAll + static void setup() { + DockerClient dockerClient = DockerClientFactory.instance().client(); + dockerClient + .tagImageCmd( + new RemoteDockerImage(LocalstackTestImages.LOCALSTACK_0_12_IMAGE).get(), + LOCALSTACK_CUSTOM_TAG.getRepository(), + LOCALSTACK_CUSTOM_TAG.getVersionPart() + ) + .exec(); } - @RunWith(Parameterized.class) - @AllArgsConstructor - public static class On { - - private final String description; - - private final LocalStackContainer localstack; - - @BeforeClass - public static void createCustomTag() { - DockerClient dockerClient = DockerClientFactory.instance().client(); - dockerClient - .tagImageCmd( - new RemoteDockerImage(LocalstackTestImages.LOCALSTACK_0_12_IMAGE).get(), - LOCALSTACK_CUSTOM_TAG.getRepository(), - LOCALSTACK_CUSTOM_TAG.getVersionPart() - ) - .exec(); - } + static Stream localstackVersionWithLegacyOff() { + return Stream.of( + Arguments.arguments("0.12", new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_12_IMAGE)), + Arguments.arguments("0.11", new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_11_IMAGE)), + Arguments.arguments( + "0.11 with legacy = off", + new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_11_IMAGE, false) + ) + ); + } - @Parameterized.Parameters(name = "{0}") - public static Iterable constructors() { - return Arrays.asList( - new Object[][] { - { "0.10", new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_10_IMAGE) }, - { "custom", new LocalStackContainer(LOCALSTACK_CUSTOM_TAG) }, - { - "0.11 with legacy = on", - new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_11_IMAGE, true), - }, - } - ); + @ParameterizedTest(name = "{0}") + @MethodSource("localstackVersionWithLegacyOff") + void samePortIsExposedForAllServices(String description, LocalStackContainer localstack) { + localstack.withServices(Service.S3, Service.SQS); + localstack.start(); + + try { + assertThat(localstack.getExposedPorts()).as("A single port is exposed").hasSize(1); + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) + .as("Endpoint overrides are different") + .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) + .as("Endpoint configuration have different endpoints") + .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + } finally { + localstack.stop(); } + } - @Test - public void differentPortsAreExposed() { - localstack.withServices(Service.S3, Service.SQS); - localstack.start(); + public static Stream localstackVersionWithLegacyOn() { + return Stream.of( + Arguments.arguments("0.10", new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_10_IMAGE)), + Arguments.arguments("custom", new LocalStackContainer(LOCALSTACK_CUSTOM_TAG)), + Arguments.arguments( + "0.11 with legacy = on", + new LocalStackContainer(LocalstackTestImages.LOCALSTACK_0_11_IMAGE, true) + ) + ); + } - try { - assertThat(localstack.getExposedPorts()).as("Multiple ports are exposed").hasSizeGreaterThan(1); - assertThat(localstack.getEndpointOverride(Service.SQS).toString()) - .as("Endpoint overrides are different") - .isNotEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - assertThat(localstack.getEndpointOverride(Service.SQS).toString()) - .as("Endpoint configuration have different endpoints") - .isNotEqualTo(localstack.getEndpointOverride(Service.S3).toString()); - } finally { - localstack.stop(); - } + @ParameterizedTest(name = "{0}") + @MethodSource("localstackVersionWithLegacyOn") + void differentPortsAreExposed(String description, LocalStackContainer localstack) { + localstack.withServices(Service.S3, Service.SQS); + localstack.start(); + + try { + assertThat(localstack.getExposedPorts()).as("Multiple ports are exposed").hasSizeGreaterThan(1); + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) + .as("Endpoint overrides are different") + .isNotEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) + .as("Endpoint configuration have different endpoints") + .isNotEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + } finally { + localstack.stop(); } } - @RunWith(Parameterized.class) - @AllArgsConstructor - public static class LegacyModeUnitTest { - - private final String version; - - private final boolean shouldUseLegacyMode; - - @Parameterized.Parameters(name = "{0} - {1}") - public static Iterable constructors() { - return Arrays.asList( - new Object[][] { - { "latest", false }, - { "s3-latest", false }, - { "latest-bigdata", false }, - { "3.4.0-bigdata", false }, - { "3.4.0@sha256:54fcf172f6ff70909e1e26652c3bb4587282890aff0d02c20aa7695469476ac0", false }, - { "1.4@sha256:7badf31c550f81151c485980e17542592942d7f05acc09723c5f276d41b5927d", false }, - { "3.4.0", false }, - { "0.12", false }, - { "0.11", false }, - { "sha256:8bf0d744fea26603f2b11ef7206edb38375ef954258afaeda96532a6c9c1ab8b", false }, - { "0.10.7@sha256:45ef287e29af7285c6e4013fafea1e3567c167cd22d12282f0a5f9c7894b1c5f", true }, - { "0.10.7", true }, - { "0.9.6", true }, - } - ); - } + public static Stream constructors() { + return Stream.of( + Arguments.arguments("latest", false), + Arguments.arguments("s3-latest", false), + Arguments.arguments("latest-bigdata", false), + Arguments.arguments("3.4.0-bigdata", false), + Arguments.arguments("3.4.0@sha256:54fcf172f6ff70909e1e26652c3bb4587282890aff0d02c20aa7695469476ac0", false), + Arguments.arguments("1.4@sha256:7badf31c550f81151c485980e17542592942d7f05acc09723c5f276d41b5927d", false), + Arguments.arguments("3.4.0", false), + Arguments.arguments("0.12", false), + Arguments.arguments("0.11", false), + Arguments.arguments("sha256:8bf0d744fea26603f2b11ef7206edb38375ef954258afaeda96532a6c9c1ab8b", false), + Arguments.arguments("0.10.7@sha256:45ef287e29af7285c6e4013fafea1e3567c167cd22d12282f0a5f9c7894b1c5f", true), + Arguments.arguments("0.10.7", true), + Arguments.arguments("0.9.6", true) + ); + } - @Test - public void samePortIsExposedForAllServices() { - assertThat(LocalStackContainer.shouldRunInLegacyMode(version)).isEqualTo(shouldUseLegacyMode); - } + @ParameterizedTest + @MethodSource("constructors") + void testLegacyMode(String version, boolean shouldUseLegacyMode) { + assertThat(LocalStackContainer.shouldRunInLegacyMode(version)).isEqualTo(shouldUseLegacyMode); } } 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 cf729a48a32..fa102bbc13d 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 @@ -3,10 +3,10 @@ import com.github.dockerjava.api.DockerClient; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; @@ -63,192 +63,186 @@ import static org.assertj.core.api.Assertions.assertThat; -/** - * Tests for Localstack Container, used both in bridge network (exposed to host) and docker network modes. - *

    - * These tests attempt simple interactions with the container to verify behaviour. The bridge network tests use the - * Java AWS SDK, whereas the docker network tests use an AWS CLI container within the network, to simulate usage of - * Localstack from within a Docker network. - */ @Slf4j -@RunWith(Enclosed.class) -public class LocalstackContainerTest { - - public static class WithoutNetwork { - - // without_network { - @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) - .withEnv("SQS_ENDPOINT_STRATEGY", "dynamic") - .withServices( - Service.S3, - Service.SQS, - Service.CLOUDWATCHLOGS, - Service.KMS, - LocalStackContainer.EnabledService.named("events") - ); +class LocalstackContainerTest { - // } + @Nested + class WithoutNetwork { @Test - public void s3TestOverBridgeNetwork() throws IOException { - S3Client s3 = S3Client - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + void s3TestOverBridgeNetwork() throws IOException { + try ( + // without_network { + LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withServices(Service.S3) + // } + ) { + localstack.start(); + + // with_aws_sdk_v2 { + S3Client s3 = S3Client + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); - - final String bucketName = "foo"; - s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); - s3.putObject( - PutObjectRequest.builder().bucket(bucketName).key("bar").build(), - software.amazon.awssdk.core.sync.RequestBody.fromString("baz") - ); + .region(Region.of(localstack.getRegion())) + .build(); + // } + + final String bucketName = "foo"; + s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); + s3.putObject( + PutObjectRequest.builder().bucket(bucketName).key("bar").build(), + software.amazon.awssdk.core.sync.RequestBody.fromString("baz") + ); - final List buckets = s3.listBuckets().buckets(); - final Optional maybeBucket = buckets.stream().filter(b -> b.name().equals(bucketName)).findFirst(); - assertThat(maybeBucket).as("The created bucket is present").isPresent(); - final Bucket bucket = maybeBucket.get(); + final List buckets = s3.listBuckets().buckets(); + final Optional maybeBucket = buckets + .stream() + .filter(b -> b.name().equals(bucketName)) + .findFirst(); + assertThat(maybeBucket).as("The created bucket is present").isPresent(); + final Bucket bucket = maybeBucket.get(); - assertThat(bucket.name()).as("The created bucket has the right name").isEqualTo(bucketName); + assertThat(bucket.name()).as("The created bucket has the right name").isEqualTo(bucketName); - final ListObjectsV2Response objectListing = s3.listObjectsV2( - ListObjectsV2Request.builder().bucket(bucketName).build() - ); - assertThat(objectListing.contents()).as("The created bucket has 1 item in it").hasSize(1); + final ListObjectsV2Response objectListing = s3.listObjectsV2( + ListObjectsV2Request.builder().bucket(bucketName).build() + ); + assertThat(objectListing.contents()).as("The created bucket has 1 item in it").hasSize(1); - final String content = s3 - .getObjectAsBytes(GetObjectRequest.builder().bucket(bucketName).key("bar").build()) - .asString(StandardCharsets.UTF_8); - assertThat(content).as("The object can be retrieved").isEqualTo("baz"); + final String content = s3 + .getObjectAsBytes(GetObjectRequest.builder().bucket(bucketName).key("bar").build()) + .asString(StandardCharsets.UTF_8); + assertThat(content).as("The object can be retrieved").isEqualTo("baz"); + } } @Test - public void s3TestUsingAwsSdkV2() { - // with_aws_sdk_v2 { - S3Client s3 = S3Client - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) - ) - ) - .region(Region.of(localstack.getRegion())) - .build(); - // } - - final String bucketName = "foov2"; - s3.createBucket(b -> b.bucket(bucketName)); - assertThat(s3.listBuckets().buckets().stream().anyMatch(b -> b.name().equals(bucketName))) - .as("New bucket was created") - .isTrue(); - } + void sqsTestOverBridgeNetwork() { + try ( + LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withEnv("SQS_ENDPOINT_STRATEGY", "dynamic") + .withServices(Service.SQS) + ) { + localstack.start(); - @Test - public void sqsTestOverBridgeNetwork() { - SqsClient sqs = SqsClient - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + SqsClient sqs = SqsClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); - - CreateQueueResponse queueResult = sqs.createQueue(CreateQueueRequest.builder().queueName("baz").build()); - String fooQueueUrl = queueResult.queueUrl(); - - sqs.sendMessage(SendMessageRequest.builder().queueUrl(fooQueueUrl).messageBody("test").build()); - final long messageCount = sqs - .receiveMessage(ReceiveMessageRequest.builder().queueUrl(fooQueueUrl).build()) - .messages() - .stream() - .filter(message -> message.body().equals("test")) - .count(); - assertThat(messageCount).as("the sent message can be received").isEqualTo(1L); + .region(Region.of(localstack.getRegion())) + .build(); + + CreateQueueResponse queueResult = sqs.createQueue( + CreateQueueRequest.builder().queueName("baz").build() + ); + String fooQueueUrl = queueResult.queueUrl(); + + sqs.sendMessage(SendMessageRequest.builder().queueUrl(fooQueueUrl).messageBody("test").build()); + final long messageCount = sqs + .receiveMessage(ReceiveMessageRequest.builder().queueUrl(fooQueueUrl).build()) + .messages() + .stream() + .filter(message -> message.body().equals("test")) + .count(); + assertThat(messageCount).as("the sent message can be received").isEqualTo(1L); + } } @Test - public void cloudWatchLogsTestOverBridgeNetwork() { - CloudWatchLogsClient logs = CloudWatchLogsClient - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + void cloudWatchLogsTestOverBridgeNetwork() { + try ( + LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withServices(Service.CLOUDWATCHLOGS) + ) { + localstack.start(); + + CloudWatchLogsClient logs = CloudWatchLogsClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); + .region(Region.of(localstack.getRegion())) + .build(); - logs.createLogGroup(CreateLogGroupRequest.builder().logGroupName("foo").build()); + logs.createLogGroup(CreateLogGroupRequest.builder().logGroupName("foo").build()); - DescribeLogGroupsResponse response = logs.describeLogGroups(); - assertThat(response.logGroups()).as("One log group should be created").hasSize(1); - assertThat(response.logGroups().get(0).logGroupName()) - .as("Name of created log group is [foo]") - .isEqualTo("foo"); + DescribeLogGroupsResponse response = logs.describeLogGroups(); + assertThat(response.logGroups()).as("One log group should be created").hasSize(1); + assertThat(response.logGroups().get(0).logGroupName()) + .as("Name of created log group is [foo]") + .isEqualTo("foo"); + } } @Test - public void kmsKeyCreationTest() { - KmsClient kms = KmsClient - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + void kmsKeyCreationTest() { + try ( + LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withServices(Service.KMS) + ) { + localstack.start(); + KmsClient kms = KmsClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); + .region(Region.of(localstack.getRegion())) + .build(); - String desc = "AWS CMK Description"; - Tag createdByTag = Tag.builder().tagKey("CreatedBy").tagValue("StorageService").build(); - CreateKeyRequest req = CreateKeyRequest.builder().description(desc).tags(createdByTag).build(); - CreateKeyResponse key = kms.createKey(req); + String desc = "AWS CMK Description"; + Tag createdByTag = Tag.builder().tagKey("CreatedBy").tagValue("StorageService").build(); + CreateKeyRequest req = CreateKeyRequest.builder().description(desc).tags(createdByTag).build(); + CreateKeyResponse key = kms.createKey(req); - assertThat(desc) - .as("AWS KMS Customer Managed Key should be created ") - .isEqualTo(key.keyMetadata().description()); + assertThat(desc) + .as("AWS KMS Customer Managed Key should be created ") + .isEqualTo(key.keyMetadata().description()); + } } @Test - public void samePortIsExposedForAllServices() { - assertThat(localstack.getExposedPorts()).as("A single port is exposed").hasSize(1); - assertThat(localstack.getEndpointOverride(Service.SQS).toString()) - .as("Endpoint overrides are different") - .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + void samePortIsExposedForAllServices() { + try (LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE)) { + localstack.start(); + + assertThat(localstack.getExposedPorts()).as("A single port is exposed").hasSize(1); + assertThat(localstack.getEndpointOverride(Service.SQS).toString()) + .as("Endpoint overrides are different") + .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + } } } - public static class WithNetwork { + @Nested + class WithNetwork { // with_network { - private static Network network = Network.newNetwork(); + Network network = Network.newNetwork(); - @ClassRule - public static LocalStackContainer localstackInDockerNetwork = new LocalStackContainer( + LocalStackContainer localstackInDockerNetwork = new LocalStackContainer( DockerImageName.parse("localstack/localstack:0.12.8") ) .withNetwork(network) .withNetworkAliases("notthis", "localstack") // the last alias is used for HOSTNAME_EXTERNAL .withServices(Service.S3, Service.SQS, Service.CLOUDWATCHLOGS); - // } - @ClassRule - public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>( - LocalstackTestImages.AWS_CLI_IMAGE - ) + GenericContainer awsCliInDockerNetwork = new GenericContainer<>(LocalstackTestImages.AWS_CLI_IMAGE) .withNetwork(network) .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("tail")) .withCommand(" -f /dev/null") @@ -256,13 +250,28 @@ public static class WithNetwork { .withEnv("AWS_SECRET_ACCESS_KEY", "secretkey") .withEnv("AWS_REGION", "eu-west-1"); + @BeforeEach + void setup() { + localstackInDockerNetwork.start(); + awsCliInDockerNetwork.start(); + } + + @AfterEach + void tearDown() { + awsCliInDockerNetwork.stop(); + localstackInDockerNetwork.stop(); + } + @Test - public void localstackHostEnVarIsSet() { + void localstackHostEnVarIsSet() { + localstackInDockerNetwork.start(); + awsCliInDockerNetwork.start(); + assertThat(localstackInDockerNetwork.getEnvMap().get("HOSTNAME_EXTERNAL")).isEqualTo("localstack"); } @Test - public void s3TestOverDockerNetwork() throws Exception { + void s3TestOverDockerNetwork() throws Exception { runAwsCliAgainstDockerNetworkContainer( "s3api create-bucket --bucket foo --create-bucket-configuration LocationConstraint=eu-west-1" ); @@ -271,7 +280,7 @@ public void s3TestOverDockerNetwork() throws Exception { } @Test - public void sqsTestOverDockerNetwork() throws Exception { + void sqsTestOverDockerNetwork() throws Exception { final String queueCreationResponse = runAwsCliAgainstDockerNetworkContainer( "sqs create-queue --queue-name baz" ); @@ -299,7 +308,7 @@ public void sqsTestOverDockerNetwork() throws Exception { } @Test - public void cloudWatchLogsTestOverDockerNetwork() throws Exception { + void cloudWatchLogsTestOverDockerNetwork() throws Exception { runAwsCliAgainstDockerNetworkContainer("logs create-log-group --log-group-name foo"); } @@ -320,32 +329,34 @@ private String runAwsCliAgainstDockerNetworkContainer(String command) throws Exc } } - public static class WithRegion { - - // with_region { - private static String region = "eu-west-1"; - - @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) - .withEnv("DEFAULT_REGION", region) - .withServices(Service.S3); - - // } + @Nested + class WithRegion { @Test - public void s3EndpointHasProperRegion() { - assertThat(localstack.getRegion()).as("The endpoint configuration has right region").isEqualTo(region); + void s3EndpointHasProperRegion() { + try ( + // with_region { + LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withEnv("DEFAULT_REGION", "eu-west-1") + .withServices(Service.S3); + // } + ) { + localstack.start(); + assertThat(localstack.getRegion()) + .as("The endpoint configuration has right region") + .isEqualTo("eu-west-1"); + } } } - public static class WithoutServices { - - @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE); + @Nested + class WithoutServices { @Test - public void s3ServiceStartLazily() { - try ( + void s3ServiceStartLazily() { + try (LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE);) { + localstack.start(); + S3Client s3 = S3Client .builder() .endpointOverride(localstack.getEndpoint()) @@ -355,69 +366,67 @@ public void s3ServiceStartLazily() { ) ) .region(Region.of(localstack.getRegion())) - .build() - ) { + .build(); assertThat(s3.listBuckets().buckets()).as("S3 Service is started lazily").isEmpty(); } } - } - - public static class WithVersion2 { - - private static Network network = Network.newNetwork(); - - @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer( - DockerImageName.parse("localstack/localstack:2.0") - ) - .withNetwork(network) - .withNetworkAliases("localstack"); - - @ClassRule - public static GenericContainer awsCliInDockerNetwork = new GenericContainer<>( - LocalstackTestImages.AWS_CLI_IMAGE - ) - .withNetwork(network) - .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("tail")) - .withCommand(" -f /dev/null") - .withEnv("AWS_ACCESS_KEY_ID", "accesskey") - .withEnv("AWS_SECRET_ACCESS_KEY", "secretkey") - .withEnv("AWS_REGION", "eu-west-1"); @Test - public void localstackHostEnVarIsSet() { - assertThat(localstack.getEnvMap().get("LOCALSTACK_HOST")).isEqualTo("localstack"); - } + void sqsTestOverDockerNetwork() throws Exception { + try ( + Network network = Network.newNetwork(); + LocalStackContainer localstack = new LocalStackContainer( + DockerImageName.parse("localstack/localstack:2.0") + ) + .withNetwork(network) + .withNetworkAliases("localstack"); + GenericContainer awsCliInDockerNetwork = new GenericContainer<>(LocalstackTestImages.AWS_CLI_IMAGE) + .withNetwork(network) + .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("tail")) + .withCommand(" -f /dev/null") + .withEnv("AWS_ACCESS_KEY_ID", "accesskey") + .withEnv("AWS_SECRET_ACCESS_KEY", "secretkey") + .withEnv("AWS_REGION", "eu-west-1") + ) { + localstack.start(); + awsCliInDockerNetwork.start(); - @Test - public void sqsTestOverDockerNetwork() throws Exception { - final String queueCreationResponse = runAwsCliAgainstDockerNetworkContainer( - "sqs create-queue --queue-name baz" - ); + assertThat(localstack.getEnvMap().get("LOCALSTACK_HOST")).isEqualTo("localstack"); - assertThat(queueCreationResponse) - .as("Created queue has external hostname URL") - .contains("http://localstack:" + LocalStackContainer.PORT); + final String queueCreationResponse = runAwsCliAgainstDockerNetworkContainer( + "sqs create-queue --queue-name baz", + awsCliInDockerNetwork + ); - runAwsCliAgainstDockerNetworkContainer( - String.format( - "sqs send-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz --message-body test", - LocalStackContainer.PORT, - LocalStackContainer.PORT - ) - ); - final String message = runAwsCliAgainstDockerNetworkContainer( - String.format( - "sqs receive-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz", - LocalStackContainer.PORT, - LocalStackContainer.PORT - ) - ); + assertThat(queueCreationResponse) + .as("Created queue has external hostname URL") + .contains("http://localstack:" + LocalStackContainer.PORT); + + runAwsCliAgainstDockerNetworkContainer( + String.format( + "sqs send-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz --message-body test", + LocalStackContainer.PORT, + LocalStackContainer.PORT + ), + awsCliInDockerNetwork + ); + final String message = runAwsCliAgainstDockerNetworkContainer( + String.format( + "sqs receive-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz", + LocalStackContainer.PORT, + LocalStackContainer.PORT + ), + awsCliInDockerNetwork + ); - assertThat(message).as("the sent message can be received").contains("\"Body\": \"test\""); + assertThat(message).as("the sent message can be received").contains("\"Body\": \"test\""); + } } - private String runAwsCliAgainstDockerNetworkContainer(String command) throws Exception { + private String runAwsCliAgainstDockerNetworkContainer( + String command, + GenericContainer awsCliInDockerNetwork + ) throws Exception { final String[] commandParts = String .format( "/usr/local/bin/aws --region eu-west-1 %s --endpoint-url http://localstack:%d --no-verify-ssl", @@ -434,69 +443,74 @@ private String runAwsCliAgainstDockerNetworkContainer(String command) throws Exc } } - public static class S3SkipSignatureValidation { - - @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) - .withEnv("S3_SKIP_SIGNATURE_VALIDATION", "0"); + @Nested + class S3SkipSignatureValidation { @Test - public void shouldBeAccessibleWithCredentials() throws IOException { - S3Client s3 = S3Client - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + void shouldBeAccessibleWithCredentials() throws IOException { + try ( + LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) + .withEnv("S3_SKIP_SIGNATURE_VALIDATION", "0") + ) { + localstack.start(); + + S3Client s3 = S3Client + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); + .region(Region.of(localstack.getRegion())) + .build(); - final String bucketName = "foo"; + final String bucketName = "foo"; - s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); + s3.createBucket(CreateBucketRequest.builder().bucket(bucketName).build()); - s3.putObject( - PutObjectRequest.builder().bucket(bucketName).key("bar").build(), - software.amazon.awssdk.core.sync.RequestBody.fromString("baz") - ); + s3.putObject( + PutObjectRequest.builder().bucket(bucketName).key("bar").build(), + software.amazon.awssdk.core.sync.RequestBody.fromString("baz") + ); - final List buckets = s3.listBuckets().buckets(); - final Optional maybeBucket = buckets.stream().filter(b -> b.name().equals(bucketName)).findFirst(); - assertThat(maybeBucket).as("The created bucket is present").isPresent(); + final List buckets = s3.listBuckets().buckets(); + final Optional maybeBucket = buckets + .stream() + .filter(b -> b.name().equals(bucketName)) + .findFirst(); + assertThat(maybeBucket).as("The created bucket is present").isPresent(); - S3Presigner presigner = S3Presigner - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + S3Presigner presigner = S3Presigner + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); + .region(Region.of(localstack.getRegion())) + .build(); - GetObjectPresignRequest presignRequest = GetObjectPresignRequest - .builder() - .signatureDuration(Duration.ofMinutes(5)) - .getObjectRequest(GetObjectRequest.builder().bucket(bucketName).key("bar").build()) - .build(); + GetObjectPresignRequest presignRequest = GetObjectPresignRequest + .builder() + .signatureDuration(Duration.ofMinutes(5)) + .getObjectRequest(GetObjectRequest.builder().bucket(bucketName).key("bar").build()) + .build(); - URL presignedUrl = presigner.presignGetObject(presignRequest).url(); + URL presignedUrl = presigner.presignGetObject(presignRequest).url(); - assertThat(presignedUrl).as("The presigned url is valid").isNotNull(); - final String content = IOUtils.toString(presignedUrl, StandardCharsets.UTF_8); - assertThat(content).as("The object can be retrieved").isEqualTo("baz"); + assertThat(presignedUrl).as("The presigned url is valid").isNotNull(); + final String content = IOUtils.toString(presignedUrl, StandardCharsets.UTF_8); + assertThat(content).as("The object can be retrieved").isEqualTo("baz"); + } } } - public static class LambdaContainerLabels { + @Nested + class LambdaContainerLabels { - @ClassRule - public static LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE); - - private static byte[] createLambdaHandlerZipFile() throws IOException { + private byte[] createLambdaHandlerZipFile() throws IOException { StringBuilder sb = new StringBuilder(); sb.append("def handler(event, context):\n"); sb.append(" return event"); @@ -514,64 +528,71 @@ private static byte[] createLambdaHandlerZipFile() throws IOException { } @Test - public void shouldLabelLambdaContainers() throws IOException { - LambdaClient lambda = LambdaClient - .builder() - .endpointOverride(localstack.getEndpoint()) - .credentialsProvider( - StaticCredentialsProvider.create( - AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + void shouldLabelLambdaContainers() throws IOException { + try (LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE)) { + localstack.start(); + + LambdaClient lambda = LambdaClient + .builder() + .endpointOverride(localstack.getEndpoint()) + .credentialsProvider( + StaticCredentialsProvider.create( + AwsBasicCredentials.create(localstack.getAccessKey(), localstack.getSecretKey()) + ) ) - ) - .region(Region.of(localstack.getRegion())) - .build(); - - // create function - byte[] handlerFile = createLambdaHandlerZipFile(); - CreateFunctionRequest createFunctionRequest = CreateFunctionRequest - .builder() - .functionName("test-function") - .runtime(Runtime.PYTHON3_11) - .handler("handler.handler") - .role("arn:aws:iam::000000000000:role/test-role") - .code(FunctionCode.builder().zipFile(SdkBytes.fromByteArray(handlerFile)).build()) - .build(); - CreateFunctionResponse createFunctionResult = lambda.createFunction(createFunctionRequest); - - try (LambdaWaiter waiter = lambda.waiter()) { - waiter.waitUntilFunctionActive( - GetFunctionConfigurationRequest.builder().functionName(createFunctionResult.functionName()).build() - ); - } + .region(Region.of(localstack.getRegion())) + .build(); - // invoke function once - String payload = "{\"test\": \"payload\"}"; - InvokeRequest invokeRequest = InvokeRequest - .builder() - .functionName(createFunctionResult.functionName()) - .payload(SdkBytes.fromUtf8String(payload)) - .build(); - InvokeResponse invokeResult = lambda.invoke(invokeRequest); - assertThat(invokeResult.payload().asUtf8String()) - .as("Invoke result not matching expected output") - .isEqualTo(payload); - - // assert that the spawned lambda containers has the testcontainers labels set - DockerClient dockerClient = DockerClientFactory.instance().client(); - Collection nameFilter = Collections.singleton(localstack.getContainerName().replace("_", "-")); - com.github.dockerjava.api.model.Container lambdaContainer = dockerClient - .listContainersCmd() - .withNameFilter(nameFilter) - .exec() - .stream() - .findFirst() - .orElse(null); - assertThat(lambdaContainer).as("Lambda container not found").isNotNull(); - Map labels = lambdaContainer.getLabels(); - assertThat(labels.get("org.testcontainers")).as("TestContainers label not present").isEqualTo("true"); - assertThat(labels.get("org.testcontainers.sessionId")) - .as("TestContainers session id not present") - .isNotNull(); + // create function + byte[] handlerFile = createLambdaHandlerZipFile(); + CreateFunctionRequest createFunctionRequest = CreateFunctionRequest + .builder() + .functionName("test-function") + .runtime(Runtime.PYTHON3_11) + .handler("handler.handler") + .role("arn:aws:iam::000000000000:role/test-role") + .code(FunctionCode.builder().zipFile(SdkBytes.fromByteArray(handlerFile)).build()) + .build(); + CreateFunctionResponse createFunctionResult = lambda.createFunction(createFunctionRequest); + + try (LambdaWaiter waiter = lambda.waiter()) { + waiter.waitUntilFunctionActive( + GetFunctionConfigurationRequest + .builder() + .functionName(createFunctionResult.functionName()) + .build() + ); + } + + // invoke function once + String payload = "{\"test\": \"payload\"}"; + InvokeRequest invokeRequest = InvokeRequest + .builder() + .functionName(createFunctionResult.functionName()) + .payload(SdkBytes.fromUtf8String(payload)) + .build(); + InvokeResponse invokeResult = lambda.invoke(invokeRequest); + assertThat(invokeResult.payload().asUtf8String()) + .as("Invoke result not matching expected output") + .isEqualTo(payload); + + // assert that the spawned lambda containers has the testcontainers labels set + DockerClient dockerClient = DockerClientFactory.instance().client(); + Collection nameFilter = Collections.singleton(localstack.getContainerName().replace("_", "-")); + com.github.dockerjava.api.model.Container lambdaContainer = dockerClient + .listContainersCmd() + .withNameFilter(nameFilter) + .exec() + .stream() + .findFirst() + .orElse(null); + assertThat(lambdaContainer).as("Lambda container not found").isNotNull(); + Map labels = lambdaContainer.getLabels(); + assertThat(labels.get("org.testcontainers")).as("TestContainers label not present").isEqualTo("true"); + assertThat(labels.get("org.testcontainers.sessionId")) + .as("TestContainers session id not present") + .isNotNull(); + } } } } From fee54cd5d95af2ea4c4daa67b48f4f11384474ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 19:23:03 -0600 Subject: [PATCH 0789/1224] Move Milvus tests to JUnit Jupiter (#10747) --- modules/milvus/build.gradle | 7 +++++++ .../org/testcontainers/milvus/MilvusContainerTest.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 6addaaabbd0..ed176e3394d 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.milvus:milvus-sdk-java:2.6.3' } + +test { + useJUnitPlatform() +} diff --git a/modules/milvus/src/test/java/org/testcontainers/milvus/MilvusContainerTest.java b/modules/milvus/src/test/java/org/testcontainers/milvus/MilvusContainerTest.java index 3a6d6275ec2..71ce05655f2 100644 --- a/modules/milvus/src/test/java/org/testcontainers/milvus/MilvusContainerTest.java +++ b/modules/milvus/src/test/java/org/testcontainers/milvus/MilvusContainerTest.java @@ -2,17 +2,17 @@ import io.milvus.client.MilvusServiceClient; import io.milvus.param.ConnectParam; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.Wait; import static org.assertj.core.api.Assertions.assertThat; -public class MilvusContainerTest { +class MilvusContainerTest { @Test - public void withDefaultConfig() { + void withDefaultConfig() { try ( // milvusContainer { MilvusContainer milvus = new MilvusContainer("milvusdb/milvus:v2.3.9") @@ -26,7 +26,7 @@ public void withDefaultConfig() { } @Test - public void withExternalEtcd() { + void withExternalEtcd() { try ( // externalEtcd { Network network = Network.newNetwork(); From a3cff711d4120077ed1b4c8c641b71ccbe7368e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 19:23:26 -0600 Subject: [PATCH 0790/1224] Move MinIO tests to JUnit Jupiter (#10748) --- modules/minio/build.gradle | 7 +++++++ .../testcontainers/containers/MinIOContainerTest.java | 10 +++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index cf0798d879a..45ef78d7315 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation("io.minio:minio:8.5.17") testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/minio/src/test/java/org/testcontainers/containers/MinIOContainerTest.java b/modules/minio/src/test/java/org/testcontainers/containers/MinIOContainerTest.java index 563a77852c5..0998243de8e 100644 --- a/modules/minio/src/test/java/org/testcontainers/containers/MinIOContainerTest.java +++ b/modules/minio/src/test/java/org/testcontainers/containers/MinIOContainerTest.java @@ -6,16 +6,16 @@ import io.minio.StatObjectArgs; import io.minio.StatObjectResponse; import io.minio.UploadObjectArgs; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.net.URL; import static org.assertj.core.api.Assertions.assertThat; -public class MinIOContainerTest { +class MinIOContainerTest { @Test - public void testBasicUsage() throws Exception { + void testBasicUsage() throws Exception { try ( // minioContainer { MinIOContainer container = new MinIOContainer("minio/minio:RELEASE.2023-09-04T19-57-37Z"); @@ -57,7 +57,7 @@ public void testBasicUsage() throws Exception { } @Test - public void testDefaultUserPassword() { + void testDefaultUserPassword() { try (MinIOContainer container = new MinIOContainer("minio/minio:RELEASE.2023-09-04T19-57-37Z")) { container.start(); assertThat(container.getUserName()).isEqualTo("minioadmin"); @@ -66,7 +66,7 @@ public void testDefaultUserPassword() { } @Test - public void testOverwriteUserPassword() { + void testOverwriteUserPassword() { try ( // minioOverrides { MinIOContainer container = new MinIOContainer("minio/minio:RELEASE.2023-09-04T19-57-37Z") From aae4f643a99ed3b0bcf01c680728b08c96cf0f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 3 Sep 2025 20:42:23 -0600 Subject: [PATCH 0791/1224] Move MockServer tests to JUnit Jupiter (#10749) --- modules/mockserver/build.gradle | 7 ++++++ .../MockServerContainerRuleTest.java | 24 +++++++++++++------ .../containers/MockServerContainerTest.java | 12 +++++----- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index 49aad5f08a1..032d4a79e0a 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -3,6 +3,9 @@ description = "Testcontainers :: MockServer" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.mock-server:mockserver-client-java:5.15.0' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' @@ -13,3 +16,7 @@ tasks.japicmp { "org.testcontainers.containers.MockServerContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java index 066b86b05fd..c01cad49479 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java @@ -1,7 +1,8 @@ package org.testcontainers.containers; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.mockserver.client.MockServerClient; import org.testcontainers.utility.DockerImageName; @@ -10,20 +11,29 @@ import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; -public class MockServerContainerRuleTest { +class MockServerContainerRuleTest { // creatingProxy { - public static final DockerImageName MOCKSERVER_IMAGE = DockerImageName + private static final DockerImageName MOCKSERVER_IMAGE = DockerImageName .parse("mockserver/mockserver") .withTag("mockserver-" + MockServerClient.class.getPackage().getImplementationVersion()); - @Rule - public MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE); + private static MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE); // } + @BeforeAll + static void setup() { + mockServer.start(); + } + + @AfterAll + static void tearDown() { + mockServer.stop(); + } + @Test - public void shouldReturnExpectation() throws Exception { + void shouldReturnExpectation() { // testSimpleExpectation { try ( MockServerClient mockServerClient = new MockServerClient(mockServer.getHost(), mockServer.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 a06ea3e7e63..b1fca9ce514 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java @@ -3,7 +3,7 @@ import io.restassured.config.RestAssuredConfig; import io.restassured.config.SSLConfig; import org.apache.http.conn.ssl.SSLSocketFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockserver.client.MockServerClient; import org.mockserver.configuration.Configuration; import org.mockserver.logging.MockServerLogger; @@ -15,14 +15,14 @@ import static org.mockserver.model.HttpRequest.request; import static org.mockserver.model.HttpResponse.response; -public class MockServerContainerTest { +class MockServerContainerTest { public static final DockerImageName MOCKSERVER_IMAGE = DockerImageName .parse("mockserver/mockserver") .withTag("mockserver-" + MockServerClient.class.getPackage().getImplementationVersion()); @Test - public void shouldCallActualMockserverVersion() throws Exception { + void shouldCallActualMockserverVersion() throws Exception { try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) { mockServer.start(); @@ -41,7 +41,7 @@ public void shouldCallActualMockserverVersion() throws Exception { } @Test - public void shouldCallMockserverUsingTlsProtocol() throws Exception { + void shouldCallMockserverUsingTlsProtocol() throws Exception { try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) { mockServer.start(); @@ -63,7 +63,7 @@ public void shouldCallMockserverUsingTlsProtocol() throws Exception { } @Test - public void shouldCallMockserverUsingMutualTlsProtocol() throws Exception { + void shouldCallMockserverUsingMutualTlsProtocol() throws Exception { try ( MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE) .withEnv("MOCKSERVER_TLS_MUTUAL_AUTHENTICATION_REQUIRED", "true") @@ -88,7 +88,7 @@ public void shouldCallMockserverUsingMutualTlsProtocol() throws Exception { } @Test - public void newVersionStartsWithDefaultWaitStrategy() { + void newVersionStartsWithDefaultWaitStrategy() { try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) { mockServer.start(); } From 67a4701315c449deb54655a1d771397cf2cb3aee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 09:42:56 -0600 Subject: [PATCH 0792/1224] Move MongoDB tests to JUnit Jupiter (#10750) --- modules/mongodb/build.gradle | 8 ++++++ .../containers/CompatibleImageTest.java | 27 +++++++------------ .../containers/MongoDBContainerTest.java | 10 +++---- .../MongoDBAtlasLocalContainerTest.java | 10 +++---- 4 files changed, 28 insertions(+), 27 deletions(-) diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index d7af71b9f75..813b1c60890 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -3,6 +3,10 @@ description = "Testcontainers :: MongoDB" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation("org.mongodb:mongodb-driver-sync:5.1.4") testImplementation 'org.assertj:assertj-core:3.27.4' } @@ -12,3 +16,7 @@ tasks.japicmp { "org.testcontainers.containers.MongoDBContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java index 8113e508aee..7cd7296c14a 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java @@ -3,23 +3,15 @@ import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; import org.bson.Document; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class CompatibleImageTest extends AbstractMongo { +class CompatibleImageTest extends AbstractMongo { - private final String image; - - public CompatibleImageTest(String image) { - this.image = image; - } - - @Parameterized.Parameters(name = "{0}") - public static String[] image() { + static String[] image() { return new String[] { "mongo:7", "mongodb/mongodb-community-server:7.0.2-ubi8", @@ -28,7 +20,7 @@ public static String[] image() { } @Test - public void shouldExecuteTransactions() { + void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10") @@ -41,9 +33,10 @@ public void shouldExecuteTransactions() { } } - @Test - public void shouldSupportSharding() { - try (final MongoDBContainer mongoDBContainer = new MongoDBContainer(this.image).withSharding()) { + @ParameterizedTest + @MethodSource("image") + void shouldSupportSharding(String image) { + try (final MongoDBContainer mongoDBContainer = new MongoDBContainer(image).withSharding()) { mongoDBContainer.start(); final MongoClient mongoClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl()); diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java index 8952c6802e6..29d75f80640 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java @@ -1,16 +1,16 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class MongoDBContainerTest extends AbstractMongo { +class MongoDBContainerTest extends AbstractMongo { /** * Taken from https://docs.mongodb.com */ @Test - public void shouldExecuteTransactions() { + void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10") @@ -24,14 +24,14 @@ public void shouldExecuteTransactions() { } @Test - public void supportsMongoDB_7_0() { + void supportsMongoDB_7_0() { try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0")) { mongoDBContainer.start(); } } @Test - public void shouldTestDatabaseName() { + void shouldTestDatabaseName() { try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10")) { mongoDBContainer.start(); final String databaseName = "my-db"; diff --git a/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java index 720629d214c..7bc7a39808b 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBAtlasLocalContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.mongodb; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,12 +12,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -public class MongoDBAtlasLocalContainerTest { +class MongoDBAtlasLocalContainerTest { private static final Logger log = LoggerFactory.getLogger(MongoDBAtlasLocalContainerTest.class); @Test - public void getConnectionString() { + void getConnectionString() { try ( MongoDBAtlasLocalContainer container = new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9") ) { @@ -37,7 +37,7 @@ public void getConnectionString() { } @Test - public void getDatabaseConnectionString() { + void getDatabaseConnectionString() { try ( MongoDBAtlasLocalContainer container = new MongoDBAtlasLocalContainer("mongodb/mongodb-atlas-local:7.0.9") ) { @@ -57,7 +57,7 @@ public void getDatabaseConnectionString() { } @Test - public void createAtlasIndexAndSearchIt() throws Exception { + void createAtlasIndexAndSearchIt() throws Exception { try ( // creatingAtlasLocalContainer { MongoDBAtlasLocalContainer atlasLocalContainer = new MongoDBAtlasLocalContainer( From dbf1f40a910465b2b4c3fde42a3b902207351e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 10:02:34 -0600 Subject: [PATCH 0793/1224] Move Neo4j tests to JUnit Jupiter (#10751) --- modules/neo4j/build.gradle | 7 +++ .../Neo4jContainerJUnitIntegrationTest.java | 54 ------------------- .../containers/Neo4jContainerTest.java | 53 +++++++++--------- 3 files changed, 32 insertions(+), 82 deletions(-) delete mode 100644 modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java diff --git a/modules/neo4j/build.gradle b/modules/neo4j/build.gradle index 9f347a9e34b..a1b49eac532 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -33,6 +33,9 @@ dependencies { api project(":testcontainers") + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' testImplementation 'org.assertj:assertj-core:3.27.4' } @@ -43,3 +46,7 @@ tasks.japicmp { "org.testcontainers.containers.Neo4jLabsPlugin" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java deleted file mode 100644 index 868d7e29f2d..00000000000 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerJUnitIntegrationTest.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.ClassRule; -import org.junit.Test; -import org.neo4j.driver.AuthTokens; -import org.neo4j.driver.Driver; -import org.neo4j.driver.GraphDatabase; -import org.neo4j.driver.Session; - -import java.util.Collections; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; - -/** - * Test for basic functionality when used as a @ClassRule. - */ -public class Neo4jContainerJUnitIntegrationTest { - - @ClassRule - public static Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4"); - - @Test - public void shouldStart() { - boolean actual = neo4jContainer.isRunning(); - assertThat(actual).isTrue(); - - try ( - Driver driver = GraphDatabase.driver(neo4jContainer.getBoltUrl(), AuthTokens.basic("neo4j", "password")); - Session session = driver.session() - ) { - long one = session.run("RETURN 1", Collections.emptyMap()).next().get(0).asLong(); - assertThat(one).isEqualTo(1L); - } catch (Exception e) { - fail(e.getMessage()); - } - } - - @Test - public void shouldReturnBoltUrl() { - String actual = neo4jContainer.getBoltUrl(); - - assertThat(actual).isNotNull(); - assertThat(actual).startsWith("bolt://"); - } - - @Test - public void shouldReturnHttpUrl() { - String actual = neo4jContainer.getHttpUrl(); - - assertThat(actual).isNotNull(); - assertThat(actual).startsWith("http://"); - } -} diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java index 9827eb09900..997e90c4788 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java @@ -4,7 +4,7 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.AppenderBase; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.neo4j.driver.AuthToken; import org.neo4j.driver.AuthTokens; import org.neo4j.driver.Driver; @@ -26,16 +26,13 @@ import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assumptions.assumeThat; -/** - * Tests of functionality special to the Neo4jContainer. - */ -public class Neo4jContainerTest { +class Neo4jContainerTest { // See org.testcontainers.utility.LicenseAcceptance#ACCEPTANCE_FILE_NAME private static final String ACCEPTANCE_FILE_LOCATION = "/container-license-acceptance.txt"; @Test - public void shouldDisableAuthentication() { + void shouldDisableAuthentication() { try ( // spotless:off // withoutAuthentication { @@ -53,7 +50,7 @@ public void shouldDisableAuthentication() { } @Test - public void shouldCopyDatabase() { + void shouldCopyDatabase() { // no aarch64 image available for Neo4j 3.5 assumeThat(DockerClientFactory.instance().getInfo().getArchitecture()).isNotEqualTo("aarch64"); try ( @@ -72,7 +69,7 @@ public void shouldCopyDatabase() { } @Test - public void shouldFailOnCopyDatabaseForDefaultNeo4j4Image() { + void shouldFailOnCopyDatabaseForDefaultNeo4j4Image() { assertThatIllegalArgumentException() .isThrownBy(() -> { new Neo4jContainer("neo4j:4.4.1").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); @@ -81,7 +78,7 @@ public void shouldFailOnCopyDatabaseForDefaultNeo4j4Image() { } @Test - public void shouldFailOnCopyDatabaseForCustomNeo4j4Image() { + void shouldFailOnCopyDatabaseForCustomNeo4j4Image() { assertThatIllegalArgumentException() .isThrownBy(() -> { new Neo4jContainer("neo4j:4.4.1").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); @@ -90,7 +87,7 @@ public void shouldFailOnCopyDatabaseForCustomNeo4j4Image() { } @Test - public void shouldFailOnCopyDatabaseForCustomNonSemverNeo4j4Image() { + void shouldFailOnCopyDatabaseForCustomNonSemverNeo4j4Image() { assertThatIllegalArgumentException() .isThrownBy(() -> { new Neo4jContainer("neo4j:latest").withDatabase(MountableFile.forClasspathResource("/test-graph.db")); @@ -99,7 +96,7 @@ public void shouldFailOnCopyDatabaseForCustomNonSemverNeo4j4Image() { } @Test - public void shouldCopyPlugins() { + void shouldCopyPlugins() { try ( // registerPluginsPath { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") @@ -114,7 +111,7 @@ public void shouldCopyPlugins() { } @Test - public void shouldCopyPlugin() { + void shouldCopyPlugin() { try ( // registerPluginsJar { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") @@ -136,7 +133,7 @@ private static void assertThatCustomPluginWasCopied(Session session) { } @Test - public void shouldCheckEnterpriseLicense() { + void shouldCheckEnterpriseLicense() { assumeThat(Neo4jContainerTest.class.getResource(ACCEPTANCE_FILE_LOCATION)).isNull(); String expectedImageName = "neo4j:4.4-enterprise"; @@ -147,7 +144,7 @@ public void shouldCheckEnterpriseLicense() { } @Test - public void shouldRunEnterprise() { + void shouldRunEnterprise() { assumeThat(Neo4jContainerTest.class.getResource(ACCEPTANCE_FILE_LOCATION)).isNotNull(); try ( @@ -170,7 +167,7 @@ public void shouldRunEnterprise() { } @Test - public void shouldAddConfigToEnvironment() { + void shouldAddConfigToEnvironment() { // neo4jConfiguration { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withNeo4jConfig("dbms.security.procedures.unrestricted", "apoc.*,algo.*") @@ -183,7 +180,7 @@ public void shouldAddConfigToEnvironment() { } @Test - public void shouldRespectEnvironmentAuth() { + void shouldRespectEnvironmentAuth() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withEnv("NEO4J_AUTH", "neo4j/secret"); neo4jContainer.configure(); @@ -192,7 +189,7 @@ public void shouldRespectEnvironmentAuth() { } @Test - public void shouldSetCustomPasswordCorrectly() { + void shouldSetCustomPasswordCorrectly() { // withAdminPassword { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withAdminPassword("verySecret"); // } @@ -203,7 +200,7 @@ public void shouldSetCustomPasswordCorrectly() { } @Test - public void containerAdminPasswordOverrulesEnvironmentAuth() { + void containerAdminPasswordOverrulesEnvironmentAuth() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withEnv("NEO4J_AUTH", "neo4j/secret") .withAdminPassword("anotherSecret"); @@ -214,7 +211,7 @@ public void containerAdminPasswordOverrulesEnvironmentAuth() { } @Test - public void containerWithoutAuthenticationOverrulesEnvironmentAuth() { + void containerWithoutAuthenticationOverrulesEnvironmentAuth() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") .withEnv("NEO4J_AUTH", "neo4j/secret") .withoutAuthentication(); @@ -225,7 +222,7 @@ public void containerWithoutAuthenticationOverrulesEnvironmentAuth() { } @Test - public void shouldRespectAlreadyDefinedPortMappingsBolt() { + void shouldRespectAlreadyDefinedPortMappingsBolt() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687); neo4jContainer.configure(); @@ -234,7 +231,7 @@ public void shouldRespectAlreadyDefinedPortMappingsBolt() { } @Test - public void shouldRespectAlreadyDefinedPortMappingsHttp() { + void shouldRespectAlreadyDefinedPortMappingsHttp() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7474); neo4jContainer.configure(); @@ -243,7 +240,7 @@ public void shouldRespectAlreadyDefinedPortMappingsHttp() { } @Test - public void shouldRespectAlreadyDefinedPortMappingsWithoutHttps() { + void shouldRespectAlreadyDefinedPortMappingsWithoutHttps() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687, 7474); neo4jContainer.configure(); @@ -252,7 +249,7 @@ public void shouldRespectAlreadyDefinedPortMappingsWithoutHttps() { } @Test - public void shouldDefaultExportBoltHttpAndHttps() { + void shouldDefaultExportBoltHttpAndHttps() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4"); neo4jContainer.configure(); @@ -261,7 +258,7 @@ public void shouldDefaultExportBoltHttpAndHttps() { } @Test - public void shouldRespectCustomWaitStrategy() { + void shouldRespectCustomWaitStrategy() { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").waitingFor(new CustomDummyWaitStrategy()); neo4jContainer.configure(); @@ -270,7 +267,7 @@ public void shouldRespectCustomWaitStrategy() { } @Test - public void shouldConfigureSinglePluginByName() { + void shouldConfigureSinglePluginByName() { try (Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withPlugins("apoc")) { // needs to get called explicitly for setup neo4jContainer.configure(); @@ -280,7 +277,7 @@ public void shouldConfigureSinglePluginByName() { } @Test - public void shouldConfigureMultiplePluginsByName() { + void shouldConfigureMultiplePluginsByName() { try ( // configureLabsPlugins { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") // @@ -296,7 +293,7 @@ public void shouldConfigureMultiplePluginsByName() { } @Test - public void shouldCreateRandomUuidBasedPasswords() { + void shouldCreateRandomUuidBasedPasswords() { try ( // withRandomPassword { Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withRandomPassword(); @@ -311,7 +308,7 @@ public void shouldCreateRandomUuidBasedPasswords() { } @Test - public void shouldWarnOnPasswordTooShort() { + void shouldWarnOnPasswordTooShort() { try (Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4");) { Logger logger = (Logger) DockerLoggerFactory.getLogger("neo4j:4.4"); TestLogAppender testLogAppender = new TestLogAppender(); From a8c52686c3774cdbe8fd6ede10550dd2f98ca401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 10:55:51 -0600 Subject: [PATCH 0794/1224] Move Nginx tests to JUnit Jupiter (#10752) --- modules/nginx/build.gradle | 8 ++++ .../testcontainers/junit/SimpleNginxTest.java | 44 +++++++++---------- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index f4c5280d4c2..b179ad33845 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -3,6 +3,10 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') compileOnly 'org.jetbrains:annotations:26.0.2' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' } @@ -11,3 +15,7 @@ tasks.japicmp { "org.testcontainers.containers.NginxContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java b/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java index 05a5f5767f1..1c527c27a63 100644 --- a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java +++ b/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java @@ -1,9 +1,8 @@ package org.testcontainers.junit; import lombok.Cleanup; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.NginxContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.utility.DockerImageName; @@ -20,23 +19,15 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SimpleNginxTest { +class SimpleNginxTest { private static final DockerImageName NGINX_IMAGE = DockerImageName.parse("nginx:1.27.0-alpine3.19-slim"); private static String tmpDirectory = System.getProperty("user.home") + "/.tmp-test-container"; - // creatingContainer { - @Rule - public NginxContainer nginx = new NginxContainer(NGINX_IMAGE) - .withCopyFileToContainer(MountableFile.forHostPath(tmpDirectory), "/usr/share/nginx/html") - .waitingFor(new HttpWaitStrategy()); - - // } - @SuppressWarnings({ "Duplicates", "ResultOfMethodCallIgnored" }) - @BeforeClass - public static void setupContent() throws Exception { + @BeforeAll + static void setupContent() throws Exception { // addCustomContent { // Create a temporary dir File contentFolder = new File(tmpDirectory); @@ -53,15 +44,24 @@ public static void setupContent() throws Exception { } @Test - public void testSimple() throws Exception { - // getFromNginxServer { - URL baseUrl = nginx.getBaseUrl("http", 80); + void testSimple() throws Exception { + try ( + // creatingContainer { + NginxContainer nginx = new NginxContainer(NGINX_IMAGE) + .withCopyFileToContainer(MountableFile.forHostPath(tmpDirectory), "/usr/share/nginx/html") + .waitingFor(new HttpWaitStrategy()); + // } + ) { + nginx.start(); + // getFromNginxServer { + URL baseUrl = nginx.getBaseUrl("http", 80); - assertThat(responseFromNginx(baseUrl)) - .as("An HTTP GET from the Nginx server returns the index.html from the custom content directory") - .contains("Hello World!"); - // } - assertHasCorrectExposedAndLivenessCheckPorts(nginx); + assertThat(responseFromNginx(baseUrl)) + .as("An HTTP GET from the Nginx server returns the index.html from the custom content directory") + .contains("Hello World!"); + // } + assertHasCorrectExposedAndLivenessCheckPorts(nginx); + } } private void assertHasCorrectExposedAndLivenessCheckPorts(NginxContainer nginxContainer) { From a2d4965d7bc58d6f342ad4402bd9c40aabe74325 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 10:56:12 -0600 Subject: [PATCH 0795/1224] Move Ollama tests to JUnit Jupiter (#10753) --- modules/ollama/build.gradle | 7 +++++++ .../org/testcontainers/ollama/OllamaContainerTest.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index a0256ba7150..62a34a0f05a 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: Ollama" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' } + +test { + useJUnitPlatform() +} diff --git a/modules/ollama/src/test/java/org/testcontainers/ollama/OllamaContainerTest.java b/modules/ollama/src/test/java/org/testcontainers/ollama/OllamaContainerTest.java index e4a1d61b790..dcd61cad9c4 100644 --- a/modules/ollama/src/test/java/org/testcontainers/ollama/OllamaContainerTest.java +++ b/modules/ollama/src/test/java/org/testcontainers/ollama/OllamaContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.ollama; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.Base58; import org.testcontainers.utility.DockerImageName; @@ -9,10 +9,10 @@ import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; -public class OllamaContainerTest { +class OllamaContainerTest { @Test - public void withDefaultConfig() { + void withDefaultConfig() { try ( // container { OllamaContainer ollama = new OllamaContainer("ollama/ollama:0.1.26") // } @@ -25,7 +25,7 @@ public void withDefaultConfig() { } @Test - public void downloadModelAndCommitToImage() throws IOException, InterruptedException { + void downloadModelAndCommitToImage() throws IOException, InterruptedException { String newImageName = "tc-ollama-allminilm-" + Base58.randomString(4).toLowerCase(); try (OllamaContainer ollama = new OllamaContainer("ollama/ollama:0.1.26")) { ollama.start(); From f2f12b9cdc598f27ef49cbc3016fe93387a7cccd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 10:56:30 -0600 Subject: [PATCH 0796/1224] Move OpenFGA tests to JUnit Jupiter (#10754) --- modules/openfga/build.gradle | 4 ++++ .../org/testcontainers/openfga/OpenFGAContainerTest.java | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 5d1addfbe9a..628d940826f 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,11 +3,15 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'dev.openfga:openfga-sdk:0.9.0' } test { + useJUnitPlatform() javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(17) } diff --git a/modules/openfga/src/test/java/org/testcontainers/openfga/OpenFGAContainerTest.java b/modules/openfga/src/test/java/org/testcontainers/openfga/OpenFGAContainerTest.java index 6f444b697f0..be68bdee71a 100644 --- a/modules/openfga/src/test/java/org/testcontainers/openfga/OpenFGAContainerTest.java +++ b/modules/openfga/src/test/java/org/testcontainers/openfga/OpenFGAContainerTest.java @@ -5,16 +5,16 @@ import dev.openfga.sdk.api.configuration.ClientConfiguration; import dev.openfga.sdk.api.model.CreateStoreRequest; import dev.openfga.sdk.errors.FgaInvalidParameterException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.concurrent.ExecutionException; import static org.assertj.core.api.Assertions.assertThat; -public class OpenFGAContainerTest { +class OpenFGAContainerTest { @Test - public void withDefaultConfig() throws FgaInvalidParameterException, ExecutionException, InterruptedException { + void withDefaultConfig() throws FgaInvalidParameterException, ExecutionException, InterruptedException { try ( // container { OpenFGAContainer openfga = new OpenFGAContainer("openfga/openfga:v1.4.3") // } From b54170b9030b88ab7333dbd7e242ae71e45eeecd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 10:56:57 -0600 Subject: [PATCH 0797/1224] Move OrientDB tests to JUnit Jupiter (#10755) --- modules/orientdb/build.gradle | 7 +++++++ .../containers/OrientDBContainerTest.java | 12 ++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 9973e1519d3..ea70b65c3b3 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -5,6 +5,9 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.43" + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.3' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" @@ -15,3 +18,7 @@ tasks.japicmp { "org.testcontainers.containers.OrientDBContainer" ] } + +test { + useJUnitPlatform() +} 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 ca520983e71..af6778505ec 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java @@ -1,18 +1,18 @@ package org.testcontainers.containers; import com.orientechnologies.orient.core.db.ODatabaseSession; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; import static org.assertj.core.api.Assertions.assertThat; -public class OrientDBContainerTest { +class OrientDBContainerTest { private static final DockerImageName ORIENTDB_IMAGE = DockerImageName.parse("orientdb:3.2.0-tp3"); @Test - public void shouldReturnTheSameSession() { + void shouldReturnTheSameSession() { try ( // container { OrientDBContainer orientdb = new OrientDBContainer("orientdb:3.2.0-tp3") // } @@ -27,7 +27,7 @@ public void shouldReturnTheSameSession() { } @Test - public void shouldInitializeWithCommands() { + void shouldInitializeWithCommands() { try (OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE)) { orientdb.start(); @@ -42,7 +42,7 @@ public void shouldInitializeWithCommands() { } @Test - public void shouldQueryWithGremlin() { + void shouldQueryWithGremlin() { try ( OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE) .withCopyFileToContainer( @@ -63,7 +63,7 @@ public void shouldQueryWithGremlin() { } @Test - public void shouldInitializeDatabaseFromScript() { + void shouldInitializeDatabaseFromScript() { try ( OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE) .withScriptPath("initscript.osql") From 3e033709df2293fc605e53f915ccafbf10dc3cdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 16:58:21 +0000 Subject: [PATCH 0798/1224] Bump org.apache.tinkerpop:gremlin-driver in /modules/orientdb Bumps [org.apache.tinkerpop:gremlin-driver](https://github.com/apache/tinkerpop) from 3.7.3 to 3.7.4. - [Changelog](https://github.com/apache/tinkerpop/blob/master/CHANGELOG.asciidoc) - [Commits](https://github.com/apache/tinkerpop/compare/3.7.3...3.7.4) --- updated-dependencies: - dependency-name: org.apache.tinkerpop:gremlin-driver dependency-version: 3.7.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index ea70b65c3b3..a6ab87a0d03 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.3' + testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" } From d8c9f9ff539a9ba18361d68b3c13a2ec5dc1d593 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 12:05:25 -0600 Subject: [PATCH 0799/1224] Move Pinecone tests to JUnit Jupiter (#10758) --- modules/pinecone/build.gradle | 7 +++++++ .../pinecone/PineconeLocalContainerTest.java | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/modules/pinecone/build.gradle b/modules/pinecone/build.gradle index d293456d91a..4c2f15e4682 100644 --- a/modules/pinecone/build.gradle +++ b/modules/pinecone/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.pinecone:pinecone-client:3.1.0' } + +test { + useJUnitPlatform() +} diff --git a/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java b/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java index 5843dfef81c..6303e069423 100644 --- a/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java +++ b/modules/pinecone/src/test/java/org/testcontainers/pinecone/PineconeLocalContainerTest.java @@ -1,16 +1,16 @@ package org.testcontainers.pinecone; import io.pinecone.clients.Pinecone; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.openapitools.db_control.client.model.DeletionProtection; import org.openapitools.db_control.client.model.IndexModel; import static org.assertj.core.api.Assertions.assertThat; -public class PineconeLocalContainerTest { +class PineconeLocalContainerTest { @Test - public void testSimple() { + void testSimple() { try ( // container { PineconeLocalContainer container = new PineconeLocalContainer("ghcr.io/pinecone-io/pinecone-local:v0.7.0") // } From 2d2c1bd05813ad2bec98fa05c2709fb7b807babb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Sep 2025 18:06:27 +0000 Subject: [PATCH 0800/1224] Bump org.assertj:assertj-core from 3.27.3 to 3.27.4 in /modules/pinecone Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.3 to 3.27.4. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.3...assertj-build-3.27.4) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/pinecone/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/pinecone/build.gradle b/modules/pinecone/build.gradle index 4c2f15e4682..20101b9b5d9 100644 --- a/modules/pinecone/build.gradle +++ b/modules/pinecone/build.gradle @@ -6,7 +6,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.3' + testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.pinecone:pinecone-client:3.1.0' } From 9e7aa3cd49da8f9e1f28b43f365b010789302544 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 12:43:35 -0600 Subject: [PATCH 0801/1224] Move Pulsar tests to JUnit Jupiter (#10759) --- modules/pulsar/build.gradle | 8 ++++++ .../CompatibleApachePulsarImageTest.java | 26 ++++++++----------- .../containers/PulsarContainerTest.java | 22 ++++++++-------- 3 files changed, 30 insertions(+), 26 deletions(-) diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle index 957b210ec86..c9309daa24a 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,6 +3,10 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation platform("org.apache.pulsar:pulsar-bom:4.0.5") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' @@ -14,3 +18,7 @@ tasks.japicmp { "org.testcontainers.containers.PulsarContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java b/modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java index b7a9cd3ff4c..702a7223151 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java +++ b/modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java @@ -1,25 +1,20 @@ package org.testcontainers.containers; import org.apache.pulsar.client.admin.PulsarAdmin; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.utility.DockerImageName; -@RunWith(Parameterized.class) -public class CompatibleApachePulsarImageTest extends AbstractPulsar { +class CompatibleApachePulsarImageTest extends AbstractPulsar { - @Parameterized.Parameters(name = "{0}") public static String[] params() { return new String[] { "apachepulsar/pulsar:3.0.0", "apachepulsar/pulsar-all:3.0.0" }; } - @Parameterized.Parameter - public String imageName; - - @Test - public void testUsage() throws Exception { - try (PulsarContainer pulsar = new PulsarContainer(DockerImageName.parse(this.imageName));) { + @ParameterizedTest + @MethodSource("params") + void testUsage(String imageName) throws Exception { + try (PulsarContainer pulsar = new PulsarContainer(DockerImageName.parse(imageName));) { pulsar.start(); final String pulsarBrokerUrl = pulsar.getPulsarBrokerUrl(); @@ -27,9 +22,10 @@ public void testUsage() throws Exception { } } - @Test - public void testTransactions() throws Exception { - try (PulsarContainer pulsar = new PulsarContainer(DockerImageName.parse(this.imageName)).withTransactions();) { + @ParameterizedTest + @MethodSource("params") + void testTransactions(String imageName) throws Exception { + try (PulsarContainer pulsar = new PulsarContainer(DockerImageName.parse(imageName)).withTransactions();) { pulsar.start(); try (PulsarAdmin pulsarAdmin = PulsarAdmin.builder().serviceHttpUrl(pulsar.getHttpServiceUrl()).build()) { diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java b/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java index 779a3a6114a..93e9410ada8 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java +++ b/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java @@ -2,7 +2,7 @@ import org.apache.pulsar.client.admin.PulsarAdmin; import org.apache.pulsar.client.admin.PulsarAdminException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.time.Duration; @@ -10,12 +10,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class PulsarContainerTest extends AbstractPulsar { +class PulsarContainerTest extends AbstractPulsar { private static final DockerImageName PULSAR_IMAGE = DockerImageName.parse("apachepulsar/pulsar:3.0.0"); @Test - public void testUsage() throws Exception { + void testUsage() throws Exception { try ( // do not use PULSAR_IMAGE to make the doc looks easier // constructorWithVersion { @@ -32,7 +32,7 @@ public void testUsage() throws Exception { } @Test - public void envVarsUsage() throws Exception { + void envVarsUsage() throws Exception { try ( // constructorWithEnv { PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE) @@ -45,7 +45,7 @@ public void envVarsUsage() throws Exception { } @Test - public void customClusterName() throws Exception { + void customClusterName() throws Exception { try ( PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE) .withEnv("PULSAR_PREFIX_clusterName", "tc-cluster"); @@ -56,7 +56,7 @@ public void customClusterName() throws Exception { } @Test - public void shouldNotEnableFunctionsWorkerByDefault() throws Exception { + void shouldNotEnableFunctionsWorkerByDefault() throws Exception { try (PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE)) { pulsar.start(); @@ -68,7 +68,7 @@ public void shouldNotEnableFunctionsWorkerByDefault() throws Exception { } @Test - public void shouldWaitForFunctionsWorkerStarted() throws Exception { + void shouldWaitForFunctionsWorkerStarted() throws Exception { try ( // constructorWithFunctionsWorker { PulsarContainer pulsar = new PulsarContainer(DockerImageName.parse("apachepulsar/pulsar:3.0.0")) @@ -84,7 +84,7 @@ public void shouldWaitForFunctionsWorkerStarted() throws Exception { } @Test - public void testTransactions() throws Exception { + void testTransactions() throws Exception { try ( // constructorWithTransactions { PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE).withTransactions(); @@ -100,7 +100,7 @@ public void testTransactions() throws Exception { } @Test - public void testTransactionsAndFunctionsWorker() throws Exception { + void testTransactionsAndFunctionsWorker() throws Exception { try (PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE).withTransactions().withFunctionsWorker()) { pulsar.start(); @@ -113,7 +113,7 @@ public void testTransactionsAndFunctionsWorker() throws Exception { } @Test - public void testClusterFullyInitialized() throws Exception { + void testClusterFullyInitialized() throws Exception { try (PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE)) { pulsar.start(); @@ -124,7 +124,7 @@ public void testClusterFullyInitialized() throws Exception { } @Test - public void testStartupTimeoutIsHonored() { + void testStartupTimeoutIsHonored() { try (PulsarContainer pulsar = new PulsarContainer(PULSAR_IMAGE).withStartupTimeout(Duration.ZERO)) { assertThatThrownBy(pulsar::start) .hasRootCauseMessage("Precondition failed: timeout must be greater than zero"); From 8822b9187995977ba78b93738a7d7be5fde9d23b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 12:51:52 -0600 Subject: [PATCH 0802/1224] Move Qdrant tests to JUnit Jupiter (#10760) --- modules/qdrant/build.gradle | 7 +++++++ .../org/testcontainers/qdrant/QdrantContainerTest.java | 10 +++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 0507698069a..4148f09d50a 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -3,6 +3,9 @@ description = "Testcontainers :: Qdrant" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.qdrant:client:1.15.0' testImplementation platform('io.grpc:grpc-bom:1.73.0') @@ -10,3 +13,7 @@ dependencies { testImplementation 'io.grpc:grpc-protobuf' testImplementation 'io.grpc:grpc-netty-shaded' } + +test { + useJUnitPlatform() +} diff --git a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java index d313a873d26..724edf8555c 100644 --- a/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java +++ b/modules/qdrant/src/test/java/org/testcontainers/qdrant/QdrantContainerTest.java @@ -3,7 +3,7 @@ import io.qdrant.client.QdrantClient; import io.qdrant.client.QdrantGrpcClient; import io.qdrant.client.grpc.QdrantOuterClass; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.images.builder.Transferable; import java.util.UUID; @@ -12,10 +12,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class QdrantContainerTest { +class QdrantContainerTest { @Test - public void shouldReturnVersion() throws ExecutionException, InterruptedException { + void shouldReturnVersion() throws ExecutionException, InterruptedException { try ( // qdrantContainer { QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4") @@ -34,7 +34,7 @@ public void shouldReturnVersion() throws ExecutionException, InterruptedExceptio } @Test - public void shouldSetApiKey() throws ExecutionException, InterruptedException { + void shouldSetApiKey() throws ExecutionException, InterruptedException { String apiKey = UUID.randomUUID().toString(); try (QdrantContainer qdrant = new QdrantContainer("qdrant/qdrant:v1.7.4").withApiKey(apiKey)) { qdrant.start(); @@ -59,7 +59,7 @@ public void shouldSetApiKey() throws ExecutionException, InterruptedException { } @Test - public void shouldSetApiKeyUsingConfigFile() throws ExecutionException, InterruptedException { + void shouldSetApiKeyUsingConfigFile() throws ExecutionException, InterruptedException { String apiKey = UUID.randomUUID().toString(); String configFile = "service:\n api_key: " + apiKey; try ( From d697dae5f4e7da039f747abf277f22c2020ae7f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 14:15:17 -0600 Subject: [PATCH 0803/1224] Move Redpanda tests to JUnit Jupiter (#10762) --- modules/redpanda/build.gradle | 8 +++++ .../redpanda/CompatibleImageTest.java | 22 ++++--------- .../redpanda/RedpandaContainerTest.java | 32 +++++++++---------- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index ec254add76f..d930155291e 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,8 +4,16 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.34' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.awaitility:awaitility:4.3.0' } + +test { + useJUnitPlatform() +} diff --git a/modules/redpanda/src/test/java/org/testcontainers/redpanda/CompatibleImageTest.java b/modules/redpanda/src/test/java/org/testcontainers/redpanda/CompatibleImageTest.java index 478d6e7efbc..1167642615f 100644 --- a/modules/redpanda/src/test/java/org/testcontainers/redpanda/CompatibleImageTest.java +++ b/modules/redpanda/src/test/java/org/testcontainers/redpanda/CompatibleImageTest.java @@ -1,26 +1,18 @@ package org.testcontainers.redpanda; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; -@RunWith(Parameterized.class) -public class CompatibleImageTest extends AbstractRedpanda { +class CompatibleImageTest extends AbstractRedpanda { - private final String image; - - public CompatibleImageTest(String image) { - this.image = image; - } - - @Parameterized.Parameters(name = "{0}") public static String[] image() { return new String[] { "docker.redpanda.com/redpandadata/redpanda:v22.2.1", "redpandadata/redpanda:v22.2.1" }; } - @Test - public void shouldProduceAndConsumeMessage() throws Exception { - try (RedpandaContainer container = new RedpandaContainer(this.image)) { + @ParameterizedTest + @MethodSource("image") + void shouldProduceAndConsumeMessage(String image) throws Exception { + try (RedpandaContainer container = new RedpandaContainer(image)) { container.start(); testKafkaFunctionality(container.getBootstrapServers()); } diff --git a/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java b/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java index d07f33d8b00..6d1f35da0f2 100644 --- a/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java +++ b/modules/redpanda/src/test/java/org/testcontainers/redpanda/RedpandaContainerTest.java @@ -12,7 +12,7 @@ import org.apache.kafka.common.errors.SaslAuthenticationException; import org.apache.kafka.common.errors.TopicAuthorizationException; import org.awaitility.Awaitility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.SocatContainer; @@ -30,14 +30,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class RedpandaContainerTest extends AbstractRedpanda { +class RedpandaContainerTest extends AbstractRedpanda { private static final String REDPANDA_IMAGE = "docker.redpanda.com/redpandadata/redpanda:v22.2.1"; private static final DockerImageName REDPANDA_DOCKER_IMAGE = DockerImageName.parse(REDPANDA_IMAGE); @Test - public void testUsage() throws Exception { + void testUsage() throws Exception { try (RedpandaContainer container = new RedpandaContainer(REDPANDA_DOCKER_IMAGE)) { container.start(); testKafkaFunctionality(container.getBootstrapServers()); @@ -45,7 +45,7 @@ public void testUsage() throws Exception { } @Test - public void testUsageWithStringImage() throws Exception { + void testUsageWithStringImage() throws Exception { try ( // constructorWithVersion { RedpandaContainer container = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.2") @@ -61,21 +61,21 @@ public void testUsageWithStringImage() throws Exception { } @Test - public void testNotCompatibleVersion() { + void testNotCompatibleVersion() { assertThatThrownBy(() -> new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v21.11.19")) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Redpanda version must be >= v22.2.1"); } @Test - public void redpandadataRedpandaImageVersion2221ShouldNotBeCompatible() { + void redpandadataRedpandaImageVersion2221ShouldNotBeCompatible() { assertThatThrownBy(() -> new RedpandaContainer("redpandadata/redpanda:v21.11.19")) .isInstanceOf(IllegalArgumentException.class) .hasMessageContaining("Redpanda version must be >= v22.2.1"); } @Test - public void testSchemaRegistry() { + void testSchemaRegistry() { try (RedpandaContainer container = new RedpandaContainer(REDPANDA_DOCKER_IMAGE)) { container.start(); @@ -105,7 +105,7 @@ public void testSchemaRegistry() { } @Test - public void testUsageWithListener() throws Exception { + void testUsageWithListener() throws Exception { try ( Network network = Network.newNetwork(); RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") @@ -132,7 +132,7 @@ public void testUsageWithListener() throws Exception { } @Test - public void testUsageWithListenerInTheSameNetwork() throws Exception { + void testUsageWithListenerInTheSameNetwork() throws Exception { try ( Network network = Network.newNetwork(); // registerListener { @@ -165,7 +165,7 @@ public void testUsageWithListenerInTheSameNetwork() throws Exception { } @Test - public void testUsageWithListenerFromProxy() throws Exception { + void testUsageWithListenerFromProxy() throws Exception { try ( Network network = Network.newNetwork(); // createProxy { @@ -187,7 +187,7 @@ public void testUsageWithListenerFromProxy() throws Exception { } @Test - public void testUsageWithListenerAndSasl() throws Exception { + void testUsageWithListenerAndSasl() throws Exception { final String username = "panda"; final String password = "pandapass"; final String algorithm = "SCRAM-SHA-256"; @@ -266,7 +266,7 @@ public void testUsageWithListenerAndSasl() throws Exception { @SneakyThrows @Test - public void enableSaslWithSuccessfulTopicCreation() { + void enableSaslWithSuccessfulTopicCreation() { try ( // security { RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") @@ -289,7 +289,7 @@ public void enableSaslWithSuccessfulTopicCreation() { } @Test - public void enableSaslWithUnsuccessfulTopicCreation() { + void enableSaslWithUnsuccessfulTopicCreation() { try ( RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") .enableAuthorization() @@ -313,7 +313,7 @@ public void enableSaslWithUnsuccessfulTopicCreation() { } @Test - public void enableSaslAndWithAuthenticationError() { + void enableSaslAndWithAuthenticationError() { try ( RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") .enableAuthorization() @@ -335,7 +335,7 @@ public void enableSaslAndWithAuthenticationError() { } @Test - public void schemaRegistryWithHttpBasic() { + void schemaRegistryWithHttpBasic() { try ( RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7") .enableSchemaRegistryHttpBasicAuth() @@ -362,7 +362,7 @@ public void schemaRegistryWithHttpBasic() { @SneakyThrows @Test - public void testRestProxy() { + void testRestProxy() { try (RedpandaContainer redpanda = new RedpandaContainer("docker.redpanda.com/redpandadata/redpanda:v23.1.7")) { redpanda.start(); From dc008e3e4532df2305795eb870bf4033c99438b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 14:26:56 -0600 Subject: [PATCH 0804/1224] Move RabbitMQ tests to JUnit Jupiter (#10761) --- modules/rabbitmq/build.gradle | 8 ++++++ ...RabbitMQContainerJUnitIntegrationTest.java | 20 -------------- .../containers/RabbitMQContainerTest.java | 26 +++++++++---------- 3 files changed, 21 insertions(+), 33 deletions(-) delete mode 100644 modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 0b6d8f90487..7e9b2587709 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -2,6 +2,10 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.rabbitmq:amqp-client:5.26.0' testImplementation 'org.assertj:assertj-core:3.27.3' compileOnly 'org.jetbrains:annotations:26.0.2' @@ -12,3 +16,7 @@ tasks.japicmp { "org.testcontainers.containers.RabbitMQContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java deleted file mode 100644 index e04ab616e66..00000000000 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerJUnitIntegrationTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.ClassRule; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Test for basic functionality when used as a @ClassRule. - */ -public class RabbitMQContainerJUnitIntegrationTest { - - @ClassRule - public static RabbitMQContainer rabbitMQContainer = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE); - - @Test - public void shouldStart() { - assertThat(rabbitMQContainer.isRunning()).isTrue(); - } -} 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 728b2622b17..2893e812f09 100644 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java +++ b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java @@ -6,7 +6,7 @@ import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.DeliverCallback; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.RabbitMQContainer.SslVerification; import org.testcontainers.utility.MountableFile; @@ -30,7 +30,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; -public class RabbitMQContainerTest { +class RabbitMQContainerTest { public static final int DEFAULT_AMQPS_PORT = 5671; @@ -41,7 +41,7 @@ public class RabbitMQContainerTest { public static final int DEFAULT_HTTP_PORT = 15672; @Test - public void shouldCreateRabbitMQContainer() { + void shouldCreateRabbitMQContainer() { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.start(); @@ -70,7 +70,7 @@ public void shouldCreateRabbitMQContainer() { } @Test - public void shouldCreateRabbitMQContainerWithCustomCredentials() { + void shouldCreateRabbitMQContainerWithCustomCredentials() { try ( RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE) .withAdminUser("admin") @@ -86,7 +86,7 @@ public void shouldCreateRabbitMQContainerWithCustomCredentials() { } @Test - public void shouldCreateRabbitMQContainerWithExchange() throws IOException, InterruptedException { + void shouldCreateRabbitMQContainerWithExchange() throws IOException, InterruptedException { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withExchange("test-exchange", "direct"); @@ -98,7 +98,7 @@ public void shouldCreateRabbitMQContainerWithExchange() throws IOException, Inte } @Test - public void shouldCreateRabbitMQContainerWithExchangeInVhost() throws IOException, InterruptedException { + void shouldCreateRabbitMQContainerWithExchangeInVhost() throws IOException, InterruptedException { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withVhost("test-vhost"); container.withExchange( @@ -119,7 +119,7 @@ public void shouldCreateRabbitMQContainerWithExchangeInVhost() throws IOExceptio } @Test - public void shouldCreateRabbitMQContainerWithQueues() throws IOException, InterruptedException { + void shouldCreateRabbitMQContainerWithQueues() throws IOException, InterruptedException { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container .withQueue("queue-one") @@ -135,7 +135,7 @@ public void shouldCreateRabbitMQContainerWithQueues() throws IOException, Interr } @Test - public void shouldMountConfigurationFile() { + void shouldMountConfigurationFile() { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withRabbitMQConfig(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); container.start(); @@ -145,7 +145,7 @@ public void shouldMountConfigurationFile() { } @Test - public void shouldMountConfigurationFileErlang() { + void shouldMountConfigurationFileErlang() { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withRabbitMQConfigErlang(MountableFile.forClasspathResource("/rabbitmq-custom.config")); container.start(); @@ -155,7 +155,7 @@ public void shouldMountConfigurationFileErlang() { } @Test - public void shouldMountConfigurationFileSysctl() { + void shouldMountConfigurationFileSysctl() { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withRabbitMQConfigSysctl(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); container.start(); @@ -165,7 +165,7 @@ public void shouldMountConfigurationFileSysctl() { } @Test - public void shouldStartTheWholeEnchilada() throws IOException, InterruptedException { + void shouldStartTheWholeEnchilada() throws IOException, InterruptedException { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container .withVhost("vhost1") @@ -240,7 +240,7 @@ public void shouldStartTheWholeEnchilada() throws IOException, InterruptedExcept } @Test - public void shouldThrowExceptionForDodgyJson() { + void shouldThrowExceptionForDodgyJson() { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { assertThatCode(() -> container.withQueue("queue2", true, false, ImmutableMap.of("x-message-ttl", container)) ) @@ -249,7 +249,7 @@ public void shouldThrowExceptionForDodgyJson() { } @Test - public void shouldWorkWithSSL() { + void shouldWorkWithSSL() { try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { container.withSSL( MountableFile.forClasspathResource("/certs/server_key.pem", 0644), From 7593a30391e8e5b8e4a3c95a8d6fc0dffa260720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 15:00:58 -0600 Subject: [PATCH 0805/1224] Move ScyllaDB tests to JUnit Jupiter (#10763) --- modules/scylladb/build.gradle | 7 +++++++ .../scylladb/ScyllaDBContainerTest.java | 16 ++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index 7aa6376fd54..b0551714a3a 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -3,7 +3,14 @@ description = "Testcontainers :: ScyllaDB" dependencies { api project(":testcontainers") + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.scylladb:java-driver-core:4.19.0.1' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'software.amazon.awssdk:dynamodb:2.32.30' } + +test { + useJUnitPlatform() +} diff --git a/modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java b/modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java index d151424fd20..d500aa74868 100644 --- a/modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java +++ b/modules/scylladb/src/test/java/org/testcontainers/scylladb/ScyllaDBContainerTest.java @@ -2,7 +2,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.ResultSet; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.Container; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; @@ -35,14 +35,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class ScyllaDBContainerTest { +class ScyllaDBContainerTest { private static final DockerImageName SCYLLADB_IMAGE = DockerImageName.parse("scylladb/scylla:6.2"); private static final String BASIC_QUERY = "SELECT release_version FROM system.local"; @Test - public void testSimple() { + void testSimple() { try ( // container { ScyllaDBContainer scylladb = new ScyllaDBContainer("scylladb/scylla:6.2") // } @@ -63,7 +63,7 @@ public void testSimple() { } @Test - public void testSimpleSsl() + void testSimpleSsl() throws NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException, UnrecoverableKeyException, KeyManagementException { try ( // customConfiguration { @@ -121,7 +121,7 @@ public void testSimpleSsl() } @Test - public void testSimpleSslCqlsh() throws IllegalStateException, InterruptedException, IOException { + void testSimpleSslCqlsh() throws IllegalStateException, InterruptedException, IOException { try ( ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE) .withConfigurationOverride("scylla-test-ssl") @@ -144,7 +144,7 @@ public void testSimpleSslCqlsh() throws IllegalStateException, InterruptedExcept } @Test - public void testShardAwareness() { + void testShardAwareness() { try (ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE)) { scylladb.start(); // shardAwarenessSession { @@ -161,7 +161,7 @@ public void testShardAwareness() { } @Test - public void testAlternator() { + void testAlternator() { try ( // alternator { ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE).withAlternator() // } @@ -192,7 +192,7 @@ public void testAlternator() { } @Test - public void throwExceptionWhenAlternatorDisabled() { + void throwExceptionWhenAlternatorDisabled() { try (ScyllaDBContainer scylladb = new ScyllaDBContainer(SCYLLADB_IMAGE)) { scylladb.start(); assertThatThrownBy(scylladb::getAlternatorEndpoint) From 64ccba8c7e842278f536fde0f2cf1b60ad498fa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 16:16:05 -0600 Subject: [PATCH 0806/1224] Move Solace tests to JUnit Jupiter (#10764) --- modules/solace/build.gradle | 7 +++++++ .../testcontainers/solace/SolaceContainerAMQPTest.java | 6 +++--- .../testcontainers/solace/SolaceContainerMQTTTest.java | 6 +++--- .../testcontainers/solace/SolaceContainerRESTTest.java | 6 +++--- .../testcontainers/solace/SolaceContainerSMFTest.java | 10 +++++----- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 5e023b07a67..8dd48e68f28 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,6 +5,9 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.solacesystems:sol-jcsmp:10.27.3' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' @@ -12,3 +15,7 @@ dependencies { testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' } + +test { + useJUnitPlatform() +} diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java index f7266fe8212..bb32b8abb57 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java @@ -2,7 +2,7 @@ import org.apache.qpid.jms.JmsConnectionFactory; import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,7 +20,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SolaceContainerAMQPTest { +class SolaceContainerAMQPTest { private static final Logger LOGGER = LoggerFactory.getLogger(SolaceContainerAMQPTest.class); @@ -29,7 +29,7 @@ public class SolaceContainerAMQPTest { private static final String TOPIC_NAME = "Topic/ActualTopic"; @Test - public void testSolaceContainer() throws JMSException { + void testSolaceContainer() throws JMSException { try ( SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withTopic(TOPIC_NAME, Service.AMQP) diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java index 07c08d32416..a9990ab24f0 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java @@ -7,7 +7,7 @@ import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SolaceContainerMQTTTest { +class SolaceContainerMQTTTest { private static final Logger LOGGER = LoggerFactory.getLogger(SolaceContainerMQTTTest.class); @@ -25,7 +25,7 @@ public class SolaceContainerMQTTTest { private static final String TOPIC_NAME = "Topic/ActualTopic"; @Test - public void testSolaceContainer() { + void testSolaceContainer() { try ( SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withTopic(TOPIC_NAME, Service.MQTT) diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java index 7f54cec3f74..b23c24aa65d 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java @@ -13,20 +13,20 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; -public class SolaceContainerRESTTest { +class SolaceContainerRESTTest { private static final String MESSAGE = "HelloWorld"; private static final String TOPIC_NAME = "Topic/ActualTopic"; @Test - public void testSolaceContainer() throws IOException { + void testSolaceContainer() throws IOException { try ( SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withTopic(TOPIC_NAME, Service.REST) diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java index d7e0e8ea981..1036e8efb0a 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java @@ -15,7 +15,7 @@ import com.solacesystems.jcsmp.XMLMessageListener; import com.solacesystems.jcsmp.XMLMessageProducer; import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.utility.MountableFile; @@ -25,7 +25,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SolaceContainerSMFTest { +class SolaceContainerSMFTest { private static final Logger LOGGER = LoggerFactory.getLogger(SolaceContainerSMFTest.class); @@ -36,7 +36,7 @@ public class SolaceContainerSMFTest { private static final Queue QUEUE = JCSMPFactory.onlyInstance().createQueue("Queue"); @Test - public void testSolaceContainerWithSimpleAuthentication() { + void testSolaceContainerWithSimpleAuthentication() { try ( // solaceContainerSetup { SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") @@ -54,7 +54,7 @@ public void testSolaceContainerWithSimpleAuthentication() { } @Test - public void testSolaceContainerWithCreateFlow() { + void testSolaceContainerWithCreateFlow() { try ( SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") .withCredentials("user", "pass") @@ -87,7 +87,7 @@ private static void testCreateFlow(JCSMPSession session) { } @Test - public void testSolaceContainerWithCertificates() { + void testSolaceContainerWithCertificates() { try ( // solaceContainerUsageSSL { SolaceContainer solaceContainer = new SolaceContainer("solace/solace-pubsub-standard:10.25.0") From 69b368954748439b57ac4b10182030ebd8bce743 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 16:41:58 -0600 Subject: [PATCH 0807/1224] Move Solace assertions to assertj (#10765) --- .../org/testcontainers/solace/SolaceContainerAMQPTest.java | 4 ++-- .../org/testcontainers/solace/SolaceContainerMQTTTest.java | 4 ++-- .../org/testcontainers/solace/SolaceContainerRESTTest.java | 4 ++-- .../org/testcontainers/solace/SolaceContainerSMFTest.java | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java index bb32b8abb57..e120534559b 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerAMQPTest.java @@ -1,7 +1,6 @@ package org.testcontainers.solace; import org.apache.qpid.jms.JmsConnectionFactory; -import org.junit.Assert; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -19,6 +18,7 @@ import javax.jms.Topic; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; class SolaceContainerAMQPTest { @@ -57,7 +57,7 @@ private static Session createSession(String username, String password, String ho connection.start(); return session; } catch (Exception e) { - Assert.fail("Error connecting and setting up session! " + e.getMessage()); + fail("Error connecting and setting up session! " + e.getMessage()); return null; } } diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java index a9990ab24f0..652f216f6d2 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerMQTTTest.java @@ -6,7 +6,6 @@ import org.eclipse.paho.client.mqttv3.MqttConnectOptions; import org.eclipse.paho.client.mqttv3.MqttException; import org.eclipse.paho.client.mqttv3.MqttMessage; -import org.junit.Assert; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -15,6 +14,7 @@ import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; class SolaceContainerMQTTTest { @@ -52,7 +52,7 @@ private static MqttClient createClient(String username, String password, String mqttClient.connect(connOpts); return mqttClient; } catch (Exception e) { - Assert.fail("Error connecting and setting up session! " + e.getMessage()); + fail("Error connecting and setting up session! " + e.getMessage()); return null; } } diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java index b23c24aa65d..3d6914027c1 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerRESTTest.java @@ -12,12 +12,12 @@ import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; -import org.junit.Assert; import org.junit.jupiter.api.Test; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; class SolaceContainerRESTTest { @@ -44,7 +44,7 @@ private void testPublishMessageToSolace(SolaceContainer solaceContainer, Service request.addHeader(HttpHeaders.CONTENT_TYPE, "text/plain"); HttpResponse response = client.execute(request); if (response.getStatusLine().getStatusCode() != HttpStatus.SC_OK) { - Assert.fail("Cannot send message to solace - " + EntityUtils.toString(response.getEntity())); + fail("Cannot send message to solace - " + EntityUtils.toString(response.getEntity())); } assertThat(EntityUtils.toString(response.getEntity())).isEmpty(); } diff --git a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java index 1036e8efb0a..f4d73ea08f0 100644 --- a/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java +++ b/modules/solace/src/test/java/org/testcontainers/solace/SolaceContainerSMFTest.java @@ -14,7 +14,6 @@ import com.solacesystems.jcsmp.XMLMessageConsumer; import com.solacesystems.jcsmp.XMLMessageListener; import com.solacesystems.jcsmp.XMLMessageProducer; -import org.junit.Assert; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,6 +23,7 @@ import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; class SolaceContainerSMFTest { @@ -145,7 +145,7 @@ private static JCSMPSession createSession(JCSMPProperties properties) { session.connect(); return session; } catch (Exception e) { - Assert.fail("Error connecting and setting up session! " + e.getMessage()); + fail("Error connecting and setting up session! " + e.getMessage()); return null; } } From f37f2633d1f1d990876c85782a3cddb2755960ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 17:13:15 -0600 Subject: [PATCH 0808/1224] Move Solr tests to JUnit Jupiter (#10766) --- modules/solr/build.gradle | 8 +++++ .../containers/SolrContainerTest.java | 35 +++++++++---------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index d2cdc0083eb..30fc1d9b833 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -5,6 +5,10 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'org.apache.solr:solr-solrj:8.11.4' testImplementation 'org.assertj:assertj-core:3.27.3' } @@ -14,3 +18,7 @@ tasks.japicmp { "org.testcontainers.containers.SolrContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java index f678155b3c1..0e463d11111 100644 --- a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java +++ b/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java @@ -4,38 +4,33 @@ import org.apache.solr.client.solrj.SolrServerException; import org.apache.solr.client.solrj.impl.Http2SolrClient; import org.apache.solr.client.solrj.response.SolrPingResponse; -import org.junit.After; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) public class SolrContainerTest { - @Parameterized.Parameters(name = "{0}") + private SolrClient client = null; + public static String[] getVersionsToTest() { return new String[] { "solr:8.11.4", "solr:9.8.0" }; } - @Parameterized.Parameter - public String solrImage; - - private SolrClient client = null; - - @After - public void stopRestClient() throws IOException { + @AfterEach + void stopRestClient() throws IOException { if (client != null) { client.close(); client = null; } } - @Test - public void solrCloudTest() throws IOException, SolrServerException { + @ParameterizedTest + @MethodSource("getVersionsToTest") + void solrCloudTest(String solrImage) throws IOException, SolrServerException { try (SolrContainer container = new SolrContainer(solrImage)) { container.start(); SolrPingResponse response = getClient(container).ping("dummy"); @@ -44,8 +39,9 @@ public void solrCloudTest() throws IOException, SolrServerException { } } - @Test - public void solrStandaloneTest() throws IOException, SolrServerException { + @ParameterizedTest + @MethodSource("getVersionsToTest") + void solrStandaloneTest(String solrImage) throws IOException, SolrServerException { try (SolrContainer container = new SolrContainer(solrImage).withZookeeper(false)) { container.start(); SolrPingResponse response = getClient(container).ping("dummy"); @@ -54,8 +50,9 @@ public void solrStandaloneTest() throws IOException, SolrServerException { } } - @Test - public void solrCloudPingTest() throws IOException, SolrServerException { + @ParameterizedTest + @MethodSource("getVersionsToTest") + void solrCloudPingTest(String solrImage) throws IOException, SolrServerException { // solrContainerUsage { // Create the solr container. SolrContainer container = new SolrContainer(solrImage); From 13d688b352c5731cd75f8abf3167593b2c949ab6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 4 Sep 2025 17:39:36 -0600 Subject: [PATCH 0809/1224] Move Typesense assertions to assertj (#10767) --- modules/typesense/build.gradle | 7 +++++++ .../testcontainers/typesense/TypesenseContainerTest.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/typesense/build.gradle b/modules/typesense/build.gradle index 41bb4322a9a..ded834121f0 100644 --- a/modules/typesense/build.gradle +++ b/modules/typesense/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: Typesense" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.typesense:typesense-java:1.3.0' } + +test { + useJUnitPlatform() +} diff --git a/modules/typesense/src/test/java/org/testcontainers/typesense/TypesenseContainerTest.java b/modules/typesense/src/test/java/org/testcontainers/typesense/TypesenseContainerTest.java index 8f39a05dd33..f833814a077 100644 --- a/modules/typesense/src/test/java/org/testcontainers/typesense/TypesenseContainerTest.java +++ b/modules/typesense/src/test/java/org/testcontainers/typesense/TypesenseContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.typesense; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.typesense.api.Client; import org.typesense.api.Configuration; import org.typesense.resources.Node; @@ -11,10 +11,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TypesenseContainerTest { +class TypesenseContainerTest { @Test - public void query() throws Exception { + void query() throws Exception { try ( // container { TypesenseContainer typesense = new TypesenseContainer("typesense/typesense:27.1") // } @@ -33,7 +33,7 @@ public void query() throws Exception { } @Test - public void withCustomApiKey() throws Exception { + void withCustomApiKey() throws Exception { try (TypesenseContainer typesense = new TypesenseContainer("typesense/typesense:27.1").withApiKey("s3cr3t")) { typesense.start(); List nodes = Collections.singletonList( From 65255671b4395d145d293b15618cf1d83c6a225a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 5 Sep 2025 11:11:21 -0600 Subject: [PATCH 0810/1224] Move Vault tests to JUnit Jupiter (#10768) --- modules/vault/build.gradle | 7 ++++ .../testcontainers/vault/VaultClientTest.java | 6 ++-- .../vault/VaultContainerTest.java | 34 ++++++++++++------- 3 files changed, 32 insertions(+), 15 deletions(-) diff --git a/modules/vault/build.gradle b/modules/vault/build.gradle index 84d02ebfa9a..f492962b964 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -3,8 +3,15 @@ description = "Testcontainers :: Vault" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.bettercloud:vault-java-driver:5.1.0' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} 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 eebf73a5e62..92f4a6632b9 100644 --- a/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java +++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultClientTest.java @@ -4,19 +4,19 @@ import com.bettercloud.vault.VaultConfig; import com.bettercloud.vault.VaultException; import com.bettercloud.vault.response.LogicalResponse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; import static org.assertj.core.api.Assertions.assertThat; -public class VaultClientTest { +class VaultClientTest { private static final String VAULT_TOKEN = "my-root-token"; @Test - public void writeAndReadMultipleValues() throws VaultException { + void writeAndReadMultipleValues() throws VaultException { try (VaultContainer vaultContainer = new VaultContainer<>("vault:1.1.3").withVaultToken(VAULT_TOKEN)) { vaultContainer.start(); 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 fe578bfe83b..cc2d8b37d73 100644 --- a/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java +++ b/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java @@ -4,8 +4,9 @@ import com.bettercloud.vault.VaultConfig; import com.bettercloud.vault.response.LogicalResponse; import io.restassured.response.Response; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import java.util.HashMap; @@ -18,11 +19,10 @@ * This test shows the pattern to use the VaultContainer @ClassRule for a junit test. It also has tests that ensure * the secrets were added correctly by reading from Vault with the CLI, over HTTP and over Client Library. */ -public class VaultContainerTest { +class VaultContainerTest { private static final String VAULT_TOKEN = "my-root-token"; - @ClassRule // vaultContainer { public static VaultContainer vaultContainer = new VaultContainer<>("hashicorp/vault:1.13") .withVaultToken(VAULT_TOKEN) @@ -35,8 +35,18 @@ public class VaultContainerTest { // } + @BeforeAll + static void setUp() { + vaultContainer.start(); + } + + @AfterAll + static void tearDown() { + vaultContainer.stop(); + } + @Test - public void readFirstSecretPathWithCli() throws Exception { + void readFirstSecretPathWithCli() throws Exception { GenericContainer.ExecResult result = vaultContainer.execInContainer( "vault", "kv", @@ -48,7 +58,7 @@ public void readFirstSecretPathWithCli() throws Exception { } @Test - public void readSecondSecretPathWithCli() throws Exception { + void readSecondSecretPathWithCli() throws Exception { GenericContainer.ExecResult result = vaultContainer.execInContainer( "vault", "kv", @@ -66,7 +76,7 @@ public void readSecondSecretPathWithCli() throws Exception { } @Test - public void readFirstSecretPathOverHttpApi() { + void readFirstSecretPathOverHttpApi() { Response response = given() .header("X-Vault-Token", VAULT_TOKEN) .when() @@ -76,7 +86,7 @@ public void readFirstSecretPathOverHttpApi() { } @Test - public void readSecondSecretPathOverHttpApi() throws InterruptedException { + void readSecondSecretPathOverHttpApi() throws InterruptedException { Response response = given() .header("X-Vault-Token", VAULT_TOKEN) .when() @@ -90,7 +100,7 @@ public void readSecondSecretPathOverHttpApi() throws InterruptedException { } @Test - public void readTransitKeyOverHttpApi() throws InterruptedException { + void readTransitKeyOverHttpApi() throws InterruptedException { Response response = given() .header("X-Vault-Token", VAULT_TOKEN) .when() @@ -102,7 +112,7 @@ public void readTransitKeyOverHttpApi() throws InterruptedException { @Test // readWithLibrary { - public void readFirstSecretPathOverClientLibrary() throws Exception { + void readFirstSecretPathOverClientLibrary() throws Exception { final VaultConfig config = new VaultConfig() .address(vaultContainer.getHttpHostAddress()) .token(VAULT_TOKEN) @@ -118,7 +128,7 @@ public void readFirstSecretPathOverClientLibrary() throws Exception { // } @Test - public void readSecondSecretPathOverClientLibrary() throws Exception { + void readSecondSecretPathOverClientLibrary() throws Exception { final VaultConfig config = new VaultConfig() .address(vaultContainer.getHttpHostAddress()) .token(VAULT_TOKEN) @@ -135,7 +145,7 @@ public void readSecondSecretPathOverClientLibrary() throws Exception { } @Test - public void writeSecretOverClientLibrary() throws Exception { + void writeSecretOverClientLibrary() throws Exception { final VaultConfig config = new VaultConfig() .address(vaultContainer.getHttpHostAddress()) .token(VAULT_TOKEN) From 33018cfd3926ec94699d9f45b477940d7e2eeccf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 5 Sep 2025 13:01:28 -0600 Subject: [PATCH 0811/1224] Move Weaviate tests to JUnit Jupiter (#10769) --- modules/weaviate/build.gradle | 7 +++++++ .../testcontainers/weaviate/WeaviateContainerTest.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 6c0140a64d1..04235749e3b 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: Weaviate" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.weaviate:client:5.4.0' } + +test { + useJUnitPlatform() +} diff --git a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java index 535b81126fd..9a1ad47d5af 100644 --- a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java +++ b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java @@ -5,7 +5,7 @@ import io.weaviate.client.base.Result; import io.weaviate.client.v1.misc.model.Meta; import org.assertj.core.api.InstanceOfAssertFactories; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Arrays; import java.util.HashMap; @@ -14,10 +14,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class WeaviateContainerTest { +class WeaviateContainerTest { @Test - public void testWeaviate() { + void testWeaviate() { try ( // container { WeaviateContainer weaviate = new WeaviateContainer("cr.weaviate.io/semitechnologies/weaviate:1.29.0") // } @@ -32,7 +32,7 @@ public void testWeaviate() { } @Test - public void testWeaviateWithModules() { + void testWeaviateWithModules() { List enableModules = Arrays.asList( "backup-filesystem", "text2vec-openai", From 60309387e1c180540aea628ae04383cc88d3b1f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 5 Sep 2025 14:02:59 -0600 Subject: [PATCH 0812/1224] Move JDBC tests to JUnit Jupiter (#10770) --- modules/jdbc/build.gradle | 7 + .../containers/JdbcDatabaseContainerTest.java | 6 +- .../jdbc/ConnectionUrlDriversTests.java | 219 +++++++++--------- .../jdbc/ConnectionUrlTest.java | 33 ++- .../jdbc/ContainerDatabaseDriverTest.java | 21 +- .../jdbc/JdbcDatabaseDelegateTest.java | 10 +- .../jdbc/MissingJdbcDriverTest.java | 6 +- 7 files changed, 150 insertions(+), 152 deletions(-) diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle index 30d2cb539c4..f1deb59c41d 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -3,6 +3,9 @@ description = "Testcontainers :: JDBC" dependencies { api project(':testcontainers-database-commons') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' @@ -13,3 +16,7 @@ dependencies { exclude(module: 'hamcrest-core') } } + +test { + useJUnitPlatform() +} diff --git a/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java b/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java index 1dc6646bd17..ca41c3f5d1c 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/containers/JdbcDatabaseContainerTest.java @@ -1,7 +1,7 @@ package org.testcontainers.containers; import lombok.NonNull; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import java.sql.Connection; @@ -10,10 +10,10 @@ import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.mockito.Mockito.mock; -public class JdbcDatabaseContainerTest { +class JdbcDatabaseContainerTest { @Test - public void anExceptionIsThrownIfJdbcIsNotAvailable() { + void anExceptionIsThrownIfJdbcIsNotAvailable() { JdbcDatabaseContainer jdbcContainer = new JdbcDatabaseContainerStub("mysql:latest") .withStartupTimeoutSeconds(1); diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlDriversTests.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlDriversTests.java index 394451bc6a9..5797ee0083c 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlDriversTests.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlDriversTests.java @@ -1,127 +1,126 @@ package org.testcontainers.jdbc; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameter; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; -import java.util.Arrays; import java.util.Optional; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; /** * This Test class validates that all supported JDBC URL's can be parsed by ConnectionUrl class. */ -@RunWith(Parameterized.class) -public class ConnectionUrlDriversTests { +class ConnectionUrlDriversTests { - @Parameter - public String jdbcUrl; - - @Parameter(1) - public String databaseType; - - @Parameter(2) - public Optional tag; - - @Parameter(3) - public String dbHostString; - - @Parameter(4) - public String databaseName; - - @Parameterized.Parameters(name = "{index} - {0}") - public static Iterable data() { - return Arrays.asList( - new Object[][] { - { "jdbc:tc:mysql:8.0.36://hostname/test", "mysql", Optional.of("8.0.36"), "hostname/test", "test" }, - { "jdbc:tc:mysql://hostname/test", "mysql", Optional.empty(), "hostname/test", "test" }, - { - "jdbc:tc:postgresql:1.2.3://hostname/test", - "postgresql", - Optional.of("1.2.3"), - "hostname/test", - "test", - }, - { "jdbc:tc:postgresql://hostname/test", "postgresql", Optional.empty(), "hostname/test", "test" }, - { - "jdbc:tc:sqlserver:1.2.3://localhost;instance=SQLEXPRESS:1433;databaseName=test", - "sqlserver", - Optional.of("1.2.3"), - "localhost;instance=SQLEXPRESS:1433;databaseName=test", - "test", - }, - { - "jdbc:tc:sqlserver://localhost;instance=SQLEXPRESS:1433;databaseName=test", - "sqlserver", - Optional.empty(), - "localhost;instance=SQLEXPRESS:1433;databaseName=test", - "test", - }, - { - "jdbc:tc:mariadb:1.2.3://localhost:3306/test", - "mariadb", - Optional.of("1.2.3"), - "localhost:3306/test", - "test", - }, - { "jdbc:tc:mariadb://localhost:3306/test", "mariadb", Optional.empty(), "localhost:3306/test", "test" }, - { - "jdbc:tc:oracle:1.2.3:thin://@localhost:1521/test", - "oracle", - Optional.of("1.2.3"), - "localhost:1521/test", - "test", - }, - { - "jdbc:tc:oracle:1.2.3:thin:@localhost:1521/test", - "oracle", - Optional.of("1.2.3"), - "localhost:1521/test", - "test", - }, - { - "jdbc:tc:oracle:thin:@localhost:1521/test", - "oracle", - Optional.empty(), - "localhost:1521/test", - "test", - }, - { - "jdbc:tc:oracle:1.2.3:thin:@localhost:1521:test", - "oracle", - Optional.of("1.2.3"), - "localhost:1521:test", - "test", - }, - { - "jdbc:tc:oracle:1.2.3:thin://@localhost:1521:test", - "oracle", - Optional.of("1.2.3"), - "localhost:1521:test", - "test", - }, - { - "jdbc:tc:oracle:1.2.3-anything:thin://@localhost:1521:test", - "oracle", - Optional.of("1.2.3-anything"), - "localhost:1521:test", - "test", - }, - { - "jdbc:tc:oracle:thin:@localhost:1521:test", - "oracle", - Optional.empty(), - "localhost:1521:test", - "test", - }, - } + public static Stream data() { + return Stream.of( + Arguments.arguments( + "jdbc:tc:mysql:8.0.36://hostname/test", + "mysql", + Optional.of("8.0.36"), + "hostname/test", + "test" + ), + Arguments.arguments("jdbc:tc:mysql://hostname/test", "mysql", Optional.empty(), "hostname/test", "test"), + Arguments.arguments( + "jdbc:tc:postgresql:1.2.3://hostname/test", + "postgresql", + Optional.of("1.2.3"), + "hostname/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:postgresql://hostname/test", + "postgresql", + Optional.empty(), + "hostname/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:sqlserver:1.2.3://localhost;instance=SQLEXPRESS:1433;databaseName=test", + "sqlserver", + Optional.of("1.2.3"), + "localhost;instance=SQLEXPRESS:1433;databaseName=test", + "test" + ), + Arguments.arguments( + "jdbc:tc:sqlserver://localhost;instance=SQLEXPRESS:1433;databaseName=test", + "sqlserver", + Optional.empty(), + "localhost;instance=SQLEXPRESS:1433;databaseName=test", + "test" + ), + Arguments.arguments( + "jdbc:tc:mariadb:1.2.3://localhost:3306/test", + "mariadb", + Optional.of("1.2.3"), + "localhost:3306/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:mariadb://localhost:3306/test", + "mariadb", + Optional.empty(), + "localhost:3306/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:1.2.3:thin://@localhost:1521/test", + "oracle", + Optional.of("1.2.3"), + "localhost:1521/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:1.2.3:thin:@localhost:1521/test", + "oracle", + Optional.of("1.2.3"), + "localhost:1521/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:thin:@localhost:1521/test", + "oracle", + Optional.empty(), + "localhost:1521/test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:1.2.3:thin:@localhost:1521:test", + "oracle", + Optional.of("1.2.3"), + "localhost:1521:test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:1.2.3:thin://@localhost:1521:test", + "oracle", + Optional.of("1.2.3"), + "localhost:1521:test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:1.2.3-anything:thin://@localhost:1521:test", + "oracle", + Optional.of("1.2.3-anything"), + "localhost:1521:test", + "test" + ), + Arguments.arguments( + "jdbc:tc:oracle:thin:@localhost:1521:test", + "oracle", + Optional.empty(), + "localhost:1521:test", + "test" + ) ); } - @Test - public void test() { + @ParameterizedTest(name = "{index} - {0}") + @MethodSource("data") + void test(String jdbcUrl, String databaseType, Optional tag, String dbHostString, String databaseName) { ConnectionUrl url = ConnectionUrl.newInstance(jdbcUrl); assertThat(url.getDatabaseType()).as("Database Type is as expected").isEqualTo(databaseType); assertThat(url.getImageTag()).as("Image tag is as expected").isEqualTo(tag); diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java index b6de810e06c..16abff74ec9 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ConnectionUrlTest.java @@ -1,18 +1,14 @@ package org.testcontainers.jdbc; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class ConnectionUrlTest { - - @Rule - public ExpectedException thrown = ExpectedException.none(); +class ConnectionUrlTest { @Test - public void testConnectionUrl1() { + void testConnectionUrl1() { String urlString = "jdbc:tc:mysql:8.0.36://somehostname:3306/databasename?a=b&c=d"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); @@ -31,7 +27,7 @@ public void testConnectionUrl1() { } @Test - public void testConnectionUrl2() { + void testConnectionUrl2() { String urlString = "jdbc:tc:mysql://somehostname/databasename"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); @@ -49,13 +45,13 @@ public void testConnectionUrl2() { } @Test - public void testEmptyQueryParameter() { + void testEmptyQueryParameter() { ConnectionUrl url = ConnectionUrl.newInstance("jdbc:tc:mysql://somehostname/databasename?key="); assertThat(url.getQueryParameters().get("key")).as("'key' property value").isEqualTo(""); } @Test - public void testTmpfsOption() { + void testTmpfsOption() { String urlString = "jdbc:tc:mysql://somehostname/databasename?TC_TMPFS=key:value,key1:value1"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); @@ -69,7 +65,7 @@ public void testTmpfsOption() { } @Test - public void testInitScriptPathCapture() { + void testInitScriptPathCapture() { String urlString = "jdbc:tc:mysql:8.0.36://somehostname:3306/databasename?a=b&c=d&TC_INITSCRIPT=somepath/init_mysql.sql"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); @@ -83,13 +79,14 @@ public void testInitScriptPathCapture() { .containsEntry("TC_INITSCRIPT", "somepath/init_mysql.sql"); //Parameter sets are unmodifiable - thrown.expect(UnsupportedOperationException.class); - url.getContainerParameters().remove("TC_INITSCRIPT"); - url.getQueryParameters().remove("a"); + assertThatThrownBy(() -> url.getContainerParameters().remove("TC_INITSCRIPT")) + .isInstanceOf(UnsupportedOperationException.class); + assertThatThrownBy(() -> url.getQueryParameters().remove("a")) + .isInstanceOf(UnsupportedOperationException.class); } @Test - public void testInitFunctionCapture() { + void testInitFunctionCapture() { String urlString = "jdbc:tc:mysql:8.0.36://somehostname:3306/databasename?a=b&c=d&TC_INITFUNCTION=org.testcontainers.jdbc.JDBCDriverTest::sampleInitFunction"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); @@ -105,7 +102,7 @@ public void testInitFunctionCapture() { } @Test - public void testDaemonCapture() { + void testDaemonCapture() { String urlString = "jdbc:tc:mysql:8.0.36://somehostname:3306/databasename?a=b&c=d&TC_DAEMON=true"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); @@ -113,7 +110,7 @@ public void testDaemonCapture() { } @Test - public void testHostLessConnectionUrl() { + void testHostLessConnectionUrl() { String urlString = "jdbc:tc:mysql:8.0.36:///databasename?a=b&c=d"; ConnectionUrl url = ConnectionUrl.newInstance(urlString); diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ContainerDatabaseDriverTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ContainerDatabaseDriverTest.java index 4edd5d449ba..767258e19a1 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/ContainerDatabaseDriverTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/ContainerDatabaseDriverTest.java @@ -1,9 +1,6 @@ package org.testcontainers.jdbc; -import org.hamcrest.CoreMatchers; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; +import org.junit.jupiter.api.Test; import java.sql.Connection; import java.sql.DriverManager; @@ -11,25 +8,23 @@ import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class ContainerDatabaseDriverTest { +class ContainerDatabaseDriverTest { private static final String PLAIN_POSTGRESQL_JDBC_URL = "jdbc:postgresql://localhost:5432/test"; - @Rule - public ExpectedException thrown = ExpectedException.none(); - @Test - public void shouldNotTryToConnectToNonMatchingJdbcUrlDirectly() throws SQLException { + void shouldNotTryToConnectToNonMatchingJdbcUrlDirectly() throws SQLException { ContainerDatabaseDriver driver = new ContainerDatabaseDriver(); Connection connection = driver.connect(PLAIN_POSTGRESQL_JDBC_URL, new Properties()); assertThat(connection).isNull(); } @Test - public void shouldNotTryToConnectToNonMatchingJdbcUrlViaDriverManager() throws SQLException { - thrown.expect(SQLException.class); - thrown.expectMessage(CoreMatchers.startsWith("No suitable driver found for ")); - DriverManager.getConnection(PLAIN_POSTGRESQL_JDBC_URL); + void shouldNotTryToConnectToNonMatchingJdbcUrlViaDriverManager() throws SQLException { + assertThatThrownBy(() -> DriverManager.getConnection(PLAIN_POSTGRESQL_JDBC_URL)) + .isInstanceOf(SQLException.class) + .hasMessageStartingWith("No suitable driver found for "); } } diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/JdbcDatabaseDelegateTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/JdbcDatabaseDelegateTest.java index f3cf2d01d40..e6233e14b9f 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/JdbcDatabaseDelegateTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/JdbcDatabaseDelegateTest.java @@ -1,8 +1,7 @@ package org.testcontainers.jdbc; import lombok.NonNull; -import org.junit.Assert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.slf4j.Logger; import org.testcontainers.containers.JdbcDatabaseContainer; @@ -14,18 +13,19 @@ import java.util.ArrayList; import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class JdbcDatabaseDelegateTest { +class JdbcDatabaseDelegateTest { @Test - public void testLeakedConnections() { + void testLeakedConnections() { final JdbcDatabaseContainerStub stub = new JdbcDatabaseContainerStub(DockerImageName.parse("something")); try (JdbcDatabaseDelegate delegate = new JdbcDatabaseDelegate(stub, "")) { delegate.execute("foo", null, 0, false, false); } - Assert.assertEquals(0, stub.openConnectionsList.size()); + assertThat(stub.openConnectionsList.size()).isZero(); } static class JdbcDatabaseContainerStub extends JdbcDatabaseContainer { diff --git a/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java b/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java index 9f6b354818d..469234e15a6 100644 --- a/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java +++ b/modules/jdbc/src/test/java/org/testcontainers/jdbc/MissingJdbcDriverTest.java @@ -1,7 +1,7 @@ package org.testcontainers.jdbc; import com.google.common.base.Throwables; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.JdbcDatabaseContainer; import org.testcontainers.utility.DockerImageName; @@ -12,10 +12,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -public class MissingJdbcDriverTest { +class MissingJdbcDriverTest { @Test - public void shouldFailFastIfNoDriverFound() { + void shouldFailFastIfNoDriverFound() { final MissingDriverContainer container = new MissingDriverContainer(); try { From cb2568f199fa067bb0c0cc3f005768ad11f6bb7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 5 Sep 2025 14:55:32 -0600 Subject: [PATCH 0813/1224] Move R2DBC tests to JUnit Jupiter (#10771) --- modules/r2dbc/build.gradle | 7 +++++++ .../r2dbc/TestcontainersR2DBCConnectionFactoryTest.java | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 8837813426c..143deb8828e 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -8,6 +8,9 @@ dependencies { api project(':testcontainers') api 'io.r2dbc:r2dbc-spi:0.9.0.RELEASE' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') @@ -15,3 +18,7 @@ dependencies { testFixturesImplementation 'io.projectreactor:reactor-core:3.7.9' testFixturesImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/r2dbc/src/test/java/org/testcontainers/r2dbc/TestcontainersR2DBCConnectionFactoryTest.java b/modules/r2dbc/src/test/java/org/testcontainers/r2dbc/TestcontainersR2DBCConnectionFactoryTest.java index 9ae49b00bd1..7a76b436e22 100644 --- a/modules/r2dbc/src/test/java/org/testcontainers/r2dbc/TestcontainersR2DBCConnectionFactoryTest.java +++ b/modules/r2dbc/src/test/java/org/testcontainers/r2dbc/TestcontainersR2DBCConnectionFactoryTest.java @@ -6,7 +6,7 @@ import io.r2dbc.spi.ConnectionFactories; import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.Result; -import org.junit.Test; +import org.junit.jupiter.api.Test; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -15,10 +15,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class TestcontainersR2DBCConnectionFactoryTest { +class TestcontainersR2DBCConnectionFactoryTest { @Test - public void failsOnUnknownProvider() { + void failsOnUnknownProvider() { String nonExistingProvider = UUID.randomUUID().toString(); assertThatThrownBy(() -> { ConnectionFactories.get(String.format("r2dbc:tc:%s:///db", nonExistingProvider)); @@ -28,7 +28,7 @@ public void failsOnUnknownProvider() { } @Test - public void reusesUntilConnectionFactoryIsClosed() { + void reusesUntilConnectionFactoryIsClosed() { String url = "r2dbc:tc:postgresql:///db?TC_IMAGE_TAG=10-alpine"; ConnectionFactory connectionFactory = ConnectionFactories.get(url); From 4eca3bdaa3178b99c42c7ecc4ce29ff37ad20896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 5 Sep 2025 16:26:35 -0600 Subject: [PATCH 0814/1224] Move database-commons tests to JUnit Jupiter (#10772) --- modules/database-commons/build.gradle | 7 +++ .../testcontainers/ext/ScriptScannerTest.java | 10 ++-- .../ext/ScriptSplittingTest.java | 50 +++++++++---------- 3 files changed, 37 insertions(+), 30 deletions(-) diff --git a/modules/database-commons/build.gradle b/modules/database-commons/build.gradle index 47b433e7b2f..5193e6dfcf7 100644 --- a/modules/database-commons/build.gradle +++ b/modules/database-commons/build.gradle @@ -3,5 +3,12 @@ description = "Testcontainers :: Database-Commons" dependencies { api project(':testcontainers') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptScannerTest.java b/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptScannerTest.java index 7e24026c4ec..a82305a0a6e 100644 --- a/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptScannerTest.java +++ b/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptScannerTest.java @@ -1,16 +1,16 @@ package org.testcontainers.ext; import org.apache.commons.lang3.StringUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.regex.Pattern; import static org.assertj.core.api.Assertions.assertThat; -public class ScriptScannerTest { +class ScriptScannerTest { @Test - public void testHugeStringLiteral() { + void testHugeStringLiteral() { String script = "/* a comment */ \"" + StringUtils.repeat('~', 10000) + "\";"; ScriptScanner scanner = scanner(script); assertThat(scanner.next()).isEqualTo(ScriptScanner.Lexem.COMMENT); @@ -20,7 +20,7 @@ public void testHugeStringLiteral() { } @Test - public void testPgIdentifierWithDollarSigns() { + void testPgIdentifierWithDollarSigns() { ScriptScanner scanner = scanner( "this$is$a$valid$postgreSQL$identifier " + "$a$While this is a quoted string$a$$ --just followed by a dollar sign" @@ -32,7 +32,7 @@ public void testPgIdentifierWithDollarSigns() { } @Test - public void testQuotedLiterals() { + void testQuotedLiterals() { ScriptScanner scanner = scanner("'this \\'is a literal' \"this \\\" is a literal\""); assertThat(scanner.next()).isEqualTo(ScriptScanner.Lexem.QUOTED_STRING); assertThat(scanner.getCurrentMatch()).isEqualTo("'this \\'is a literal'"); diff --git a/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptSplittingTest.java b/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptSplittingTest.java index 3f78e5c51db..cb0e33162f4 100644 --- a/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptSplittingTest.java +++ b/modules/database-commons/src/test/java/org/testcontainers/ext/ScriptSplittingTest.java @@ -1,6 +1,6 @@ package org.testcontainers.ext; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.ArrayList; import java.util.Arrays; @@ -10,10 +10,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class ScriptSplittingTest { +class ScriptSplittingTest { @Test - public void testStringDemarcation() { + void testStringDemarcation() { String script = "SELECT 'foo `bar`'; SELECT 'foo -- `bar`'; SELECT 'foo /* `bar`';"; List expected = Arrays.asList("SELECT 'foo `bar`'", "SELECT 'foo -- `bar`'", "SELECT 'foo /* `bar`'"); @@ -22,7 +22,7 @@ public void testStringDemarcation() { } @Test - public void testIssue1547Case1() { + void testIssue1547Case1() { String script = "create database if not exists ttt;\n" + "\n" + @@ -51,7 +51,7 @@ public void testIssue1547Case1() { } @Test - public void testIssue1547Case2() { + void testIssue1547Case2() { String script = "CREATE TABLE bar (\n" + " end_time VARCHAR(255)\n" + @@ -69,7 +69,7 @@ public void testIssue1547Case2() { } @Test - public void testSplittingEnquotedSemicolon() { + void testSplittingEnquotedSemicolon() { String script = "CREATE TABLE `bar;bar` (\n" + " end_time VARCHAR(255)\n" + ");"; List expected = Arrays.asList("CREATE TABLE `bar;bar` ( end_time VARCHAR(255) )"); @@ -78,7 +78,7 @@ public void testSplittingEnquotedSemicolon() { } @Test - public void testUnusualSemicolonPlacement() { + void testUnusualSemicolonPlacement() { String script = "SELECT 1;;;;;SELECT 2;\n;SELECT 3\n; SELECT 4;\n SELECT 5"; List expected = Arrays.asList("SELECT 1", "SELECT 2", "SELECT 3", "SELECT 4", "SELECT 5"); @@ -87,7 +87,7 @@ public void testUnusualSemicolonPlacement() { } @Test - public void testCommentedSemicolon() { + void testCommentedSemicolon() { String script = "CREATE TABLE bar (\n" + " foo VARCHAR(255)\n" + "); \nDROP PROCEDURE IF EXISTS -- ;\n" + " count_foo"; @@ -100,7 +100,7 @@ public void testCommentedSemicolon() { } @Test - public void testStringEscaping() { + void testStringEscaping() { String script = "SELECT \"a /* string literal containing comment characters like -- here\";\n" + "SELECT \"a 'quoting' \\\"scenario ` involving BEGIN keyword\\\" here\";\n" + @@ -116,7 +116,7 @@ public void testStringEscaping() { } @Test - public void testBlockCommentExclusion() { + void testBlockCommentExclusion() { String script = "INSERT INTO bar (foo) /* ; */ VALUES ('hello world');"; List expected = Arrays.asList("INSERT INTO bar (foo) VALUES ('hello world')"); @@ -125,7 +125,7 @@ public void testBlockCommentExclusion() { } @Test - public void testBeginEndKeywordCorrectDetection() { + void testBeginEndKeywordCorrectDetection() { String script = "INSERT INTO something_end (begin_with_the_token, another_field) /*end*/ VALUES /* end */ (' begin ', `end`)-- begin\n;"; @@ -137,7 +137,7 @@ public void testBeginEndKeywordCorrectDetection() { } @Test - public void testCommentInStrings() { + void testCommentInStrings() { String script = "CREATE TABLE bar (foo VARCHAR(255));\n" + "\n" + @@ -161,7 +161,7 @@ public void testCommentInStrings() { } @Test - public void testMultipleBeginEndDetection() { + void testMultipleBeginEndDetection() { String script = "CREATE TABLE bar (foo VARCHAR(255));\n" + "\n" + @@ -205,7 +205,7 @@ public void testMultipleBeginEndDetection() { } @Test - public void testProcedureBlock() { + void testProcedureBlock() { String script = "CREATE PROCEDURE count_foo()\n" + " BEGIN\n" + @@ -264,7 +264,7 @@ public void testProcedureBlock() { } @Test - public void testUnclosedBlockComment() { + void testUnclosedBlockComment() { String script = "SELECT 'foo `bar`'; /*"; assertThatThrownBy(() -> doSplit(script, ScriptUtils.DEFAULT_STATEMENT_SEPARATOR)) .isInstanceOf(ScriptUtils.ScriptParseException.class) @@ -272,7 +272,7 @@ public void testUnclosedBlockComment() { } @Test - public void testIssue1452Case() { + void testIssue1452Case() { String script = "create table test (text VARCHAR(255));\n" + "\n" + @@ -288,7 +288,7 @@ public void testIssue1452Case() { } @Test - public void testIfLoopBlocks() { + void testIfLoopBlocks() { String script = "BEGIN\n" + " rec_loop: LOOP\n" + @@ -310,7 +310,7 @@ public void testIfLoopBlocks() { } @Test - public void testIfLoopBlocksSpecificSeparator() { + void testIfLoopBlocksSpecificSeparator() { String script = "BEGIN\n" + " rec_loop: LOOP\n" + @@ -336,14 +336,14 @@ public void testIfLoopBlocksSpecificSeparator() { } @Test - public void oracleStyleBlocks() { + void oracleStyleBlocks() { String script = "BEGIN END; /\n" + "BEGIN END;"; List expected = Arrays.asList("BEGIN END;", "BEGIN END;"); splitAndCompare(script, expected, "/"); } @Test - public void testMultiProcedureMySQLScript() { + void testMultiProcedureMySQLScript() { String script = "CREATE PROCEDURE doiterate(p1 INT)\n" + " BEGIN\n" + @@ -398,7 +398,7 @@ public void testMultiProcedureMySQLScript() { } @Test - public void testDollarQuotedStrings() { + void testDollarQuotedStrings() { String script = "CREATE FUNCTION f ()\n" + "RETURNS INT\n" + @@ -418,7 +418,7 @@ public void testDollarQuotedStrings() { } @Test - public void testNestedDollarQuotedString() { + void testNestedDollarQuotedString() { //see https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-DOLLAR-QUOTING String script = "CREATE FUNCTION f() AS $function$\n" + @@ -439,7 +439,7 @@ public void testNestedDollarQuotedString() { } @Test - public void testUnclosedDollarQuotedString() { + void testUnclosedDollarQuotedString() { String script = "SELECT $tag$ ..... $"; assertThatThrownBy(() -> doSplit(script, ScriptUtils.DEFAULT_STATEMENT_SEPARATOR)) .isInstanceOf(ScriptUtils.ScriptParseException.class) @@ -470,12 +470,12 @@ private List doSplit(String script, String separator) { } @Test - public void testIgnoreDelimitersInLiteralsAndComments() { + void testIgnoreDelimitersInLiteralsAndComments() { assertThat(ScriptUtils.containsSqlScriptDelimiters("'@' /*@*/ \"@\" $tag$@$tag$ --@", "@")).isFalse(); } @Test - public void testContainsDelimiters() { + void testContainsDelimiters() { assertThat(ScriptUtils.containsSqlScriptDelimiters("'@' /*@*/ @ \"@\" --@", "@")).isTrue(); } } From 88d85566c85c45d5e100616ba0571a3275f118c8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 22:01:02 +0000 Subject: [PATCH 0815/1224] Bump actions/labeler from 5 to 6 Bumps [actions/labeler](https://github.com/actions/labeler) from 5 to 6. - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/labeler dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 0127be63320..178ba299670 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -9,6 +9,6 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v5 + - uses: actions/labeler@v6 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From cbab3249b6d1df9fcea750633210377960ed0261 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Sep 2025 22:01:05 +0000 Subject: [PATCH 0816/1224] Bump actions/github-script from 7 to 8 Bumps [actions/github-script](https://github.com/actions/github-script) from 7 to 8. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v7...v8) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '8' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-windows.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 57b2d117894..f039f6597b7 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -66,7 +66,7 @@ jobs: statuses: write steps: - name: Create pending status - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | @@ -89,7 +89,7 @@ jobs: - uses: ./.github/actions/setup-junit-report - name: Create success status - uses: actions/github-script@v7 + uses: actions/github-script@v8 if: success() with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -104,7 +104,7 @@ jobs: }) - name: Create failure status - uses: actions/github-script@v7 + uses: actions/github-script@v8 if: failure() with: github-token: ${{ secrets.GITHUB_TOKEN }} From a70dbddd75641f922d5b584a6714a83308ab5afc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 11 Sep 2025 09:54:34 -0600 Subject: [PATCH 0817/1224] Move missing K3s tests to JUnit Jupiter (#10785) --- .../k3s/OfficialClientK3sContainerTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/k3s/src/test/java/org/testcontainers/k3s/OfficialClientK3sContainerTest.java b/modules/k3s/src/test/java/org/testcontainers/k3s/OfficialClientK3sContainerTest.java index 1c40e56fc2d..f71cbae558b 100644 --- a/modules/k3s/src/test/java/org/testcontainers/k3s/OfficialClientK3sContainerTest.java +++ b/modules/k3s/src/test/java/org/testcontainers/k3s/OfficialClientK3sContainerTest.java @@ -6,7 +6,7 @@ import io.kubernetes.client.openapi.models.V1NodeList; import io.kubernetes.client.util.Config; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.utility.DockerImageName; @@ -16,15 +16,15 @@ import static org.assertj.core.api.Assertions.assertThat; @Slf4j -public class OfficialClientK3sContainerTest { +class OfficialClientK3sContainerTest { @Test - public void shouldStartAndHaveListableNode() throws IOException, ApiException { + void shouldStartAndHaveListableNode() throws IOException, ApiException { runK3s(DockerImageName.parse("rancher/k3s:v1.21.3-k3s1")); } @Test - public void shouldStartAndHaveListableNodeUsingLowerVersion() throws IOException, ApiException { + void shouldStartAndHaveListableNodeUsingLowerVersion() throws IOException, ApiException { runK3s(DockerImageName.parse("rancher/k3s:v1.20.15-k3s1")); } From 51219646dca72ad267e575bf25d0b60208c60b42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 11 Sep 2025 10:53:45 -0600 Subject: [PATCH 0818/1224] Move database tests to JUnit Jupiter (#10786) * Move jdbc-test tests to JUnit Jupiter * Move r2dbc tests to JUnit Jupiter * Move ClickHouse tests to JUnit Jupiter * Move CockroachDB tests to JUnit Jupiter * Move CrateDB tests to JUnit Jupiter * Move Databend tests to JUnit Jupiter * Move DB2 tests to JUnit Jupiter * Move MariaDB tests to JUnit Jupiter * Move MSSQL Server tests to JUnit Jupiter * Move MySQL tests to JUnit Jupiter * Move OceanBase tests to JUnit Jupiter * Move Oracle Free tests to JUnit Jupiter * Move Oracle XE tests to JUnit Jupiter * Move PostgreSQL tests to JUnit Jupiter * Move Presto tests to JUnit Jupiter * Move QuestDB tests to JUnit Jupiter * Move TiDB tests to JUnit Jupiter * Move Timeplus tests to JUnit Jupiter * Move Trino tests to JUnit Jupiter * Move YugabyteDB tests to JUnit Jupiter --- modules/clickhouse/build.gradle | 7 ++ .../clickhouse/ClickHouseContainerTest.java | 12 +-- .../clickhouse/ClickhouseJDBCDriverTest.java | 6 +- .../clickhouse/SimpleClickhouseTest.java | 23 +----- modules/cockroachdb/build.gradle | 9 ++- .../CockroachDBJDBCDriverTest.java | 6 +- .../cockroachdb/SimpleCockroachDBTest.java | 16 ++-- modules/cratedb/build.gradle | 9 ++- .../jdbc/cratedb/CrateDBJDBCDriverTest.java | 6 +- .../junit/cratedb/SimpleCrateDBTest.java | 10 +-- modules/databend/build.gradle | 7 ++ .../databend/DatabendContainerTest.java | 8 +- .../databend/DatabendJDBCDriverTest.java | 6 +- modules/db2/build.gradle | 7 ++ .../jdbc/db2/DB2JDBCDriverTest.java | 6 +- .../junit/db2/SimpleDb2Test.java | 10 +-- modules/jdbc-test/build.gradle | 1 + .../jdbc/AbstractJDBCDriverTest.java | 16 ++-- modules/mariadb/build.gradle | 7 ++ .../jdbc/mariadb/MariaDBJDBCDriverTest.java | 6 +- .../junit/mariadb/SimpleMariaDBTest.java | 18 ++--- modules/mssqlserver/build.gradle | 7 ++ .../MSSQLServerJDBCDriverTest.java | 6 +- .../CustomPasswordMSSQLServerTest.java | 73 ++++++++----------- .../CustomizableMSSQLServerTest.java | 6 +- .../mssqlserver/SimpleMSSQLServerTest.java | 10 +-- modules/mysql/build.gradle | 7 ++ .../containers/MySQLRootAccountTest.java | 27 +++---- .../jdbc/mysql/JDBCDriverWithPoolTest.java | 18 ++--- .../MySQLDatabaseContainerDriverTest.java | 6 +- .../jdbc/mysql/MySQLJDBCDriverTest.java | 6 +- .../junit/mysql/CustomizableMysqlTest.java | 6 +- .../junit/mysql/MultiVersionMySQLTest.java | 17 ++--- .../junit/mysql/SimpleMySQLTest.java | 35 ++++----- modules/oceanbase/build.gradle | 7 ++ .../oceanbase/OceanBaseJdbcDriverTest.java | 6 +- .../oceanbase/SimpleOceanBaseCETest.java | 10 +-- modules/oracle-free/build.gradle | 7 ++ .../junit/oracle/SimpleOracleTest.java | 18 ++--- .../oracle/jdbc/OracleJDBCDriverTest.java | 6 +- modules/oracle-xe/build.gradle | 7 ++ .../containers/jdbc/OracleJDBCDriverTest.java | 6 +- .../junit/oracle/SimpleOracleTest.java | 18 ++--- modules/postgresql/build.gradle | 7 ++ .../containers/CompatibleImageTest.java | 10 +-- .../PostgreSQLConnectionURLTest.java | 12 +-- .../containers/TimescaleDBContainerTest.java | 12 +-- .../jdbc/DatabaseDriverShutdownTest.java | 12 +-- .../jdbc/DatabaseDriverTmpfsTest.java | 6 +- .../jdbc/pgvector/PgVectorJDBCDriverTest.java | 6 +- .../jdbc/postgis/PostgisJDBCDriverTest.java | 6 +- .../postgresql/PostgreSQLJDBCDriverTest.java | 4 - .../TimescaleDBJDBCDriverTest.java | 4 - .../CustomizablePostgreSQLTest.java | 6 +- .../postgresql/SimplePostgreSQLTest.java | 18 ++--- modules/presto/build.gradle | 7 ++ .../containers/PrestoContainerTest.java | 14 ++-- .../jdbc/presto/PrestoJDBCDriverTest.java | 6 +- modules/questdb/build.gradle | 7 ++ .../jdbc/questdb/QuestDBJDBCDriverTest.java | 6 +- .../junit/questdb/SimpleQuestDBTest.java | 8 +- modules/r2dbc/build.gradle | 1 + .../AbstractR2DBCDatabaseContainerTest.java | 8 +- modules/tidb/build.gradle | 7 ++ .../jdbc/tidb/TiDBJDBCDriverTest.java | 4 - .../junit/tidb/SimpleTiDBTest.java | 10 +-- modules/timeplus/build.gradle | 7 ++ .../timeplus/TimeplusJDBCDriverTest.java | 6 +- .../timeplus/TimeplusContainerTest.java | 8 +- modules/trino/build.gradle | 7 ++ .../containers/TrinoContainerTest.java | 10 +-- .../jdbc/trino/TrinoJDBCDriverTest.java | 6 +- modules/yugabytedb/build.gradle | 8 ++ .../YugabyteDBYSQLJDBCDriverTest.java | 6 +- .../junit/yugabytedb/YugabyteDBYCQLTest.java | 16 ++-- .../junit/yugabytedb/YugabyteDBYSQLTest.java | 16 ++-- 76 files changed, 398 insertions(+), 378 deletions(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index b840e70763b..3fc372b2891 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -10,8 +10,15 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.1', classifier: 'all') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.clickhouse:client-v2:0.9.1' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') } + +test { + useJUnitPlatform() +} diff --git a/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java b/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java index ff20917e009..0f9eb3ef6a3 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/clickhouse/ClickHouseContainerTest.java @@ -3,7 +3,7 @@ import com.clickhouse.client.api.Client; import com.clickhouse.client.api.data_formats.ClickHouseBinaryFormatReader; import com.clickhouse.client.api.query.QueryResponse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.ClickhouseTestImages; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -16,10 +16,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -public class ClickHouseContainerTest extends AbstractContainerDatabaseTest { +class ClickHouseContainerTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { ClickHouseContainer clickhouse = new ClickHouseContainer("clickhouse/clickhouse-server:21.11-alpine") // } @@ -34,7 +34,7 @@ public void testSimple() throws SQLException { } @Test - public void customCredentialsWithUrlParams() throws SQLException { + void customCredentialsWithUrlParams() throws SQLException { try ( ClickHouseContainer clickhouse = new ClickHouseContainer("clickhouse/clickhouse-server:21.11.2-alpine") .withUsername("default") @@ -56,7 +56,7 @@ public void customCredentialsWithUrlParams() throws SQLException { } @Test - public void testNewAuth() throws SQLException { + void testNewAuth() throws SQLException { try (ClickHouseContainer clickhouse = new ClickHouseContainer(ClickhouseTestImages.CLICKHOUSE_24_12_IMAGE)) { clickhouse.start(); @@ -68,7 +68,7 @@ public void testNewAuth() throws SQLException { } @Test - public void testGetHttpMethodWithHttpClient() { + void testGetHttpMethodWithHttpClient() { ClickHouseContainer clickhouse = new ClickHouseContainer(ClickhouseTestImages.CLICKHOUSE_24_12_IMAGE); clickhouse.start(); Client client = new Client.Builder() 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 index 056aace7772..0a85a26899a 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/jdbc/clickhouse/ClickhouseJDBCDriverTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/jdbc/clickhouse/ClickhouseJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.clickhouse; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class ClickhouseJDBCDriverTest extends AbstractJDBCDriverTest { +class ClickhouseJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { // diff --git a/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java index eb33274ce6b..c9bd9e917f5 100644 --- a/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java +++ b/modules/clickhouse/src/test/java/org/testcontainers/junit/clickhouse/SimpleClickhouseTest.java @@ -1,37 +1,20 @@ package org.testcontainers.junit.clickhouse; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; import org.testcontainers.ClickhouseTestImages; import org.testcontainers.containers.ClickHouseContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; -import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class SimpleClickhouseTest extends AbstractContainerDatabaseTest { - - private final DockerImageName imageName; - - public SimpleClickhouseTest(DockerImageName imageName) { - this.imageName = imageName; - } - - @Parameterized.Parameters(name = "{0}") - public static Object[][] data() { - return new Object[][] { // - { ClickhouseTestImages.CLICKHOUSE_IMAGE }, - }; - } +class SimpleClickhouseTest extends AbstractContainerDatabaseTest { @Test public void testSimple() throws SQLException { - try (ClickHouseContainer clickhouse = new ClickHouseContainer(this.imageName)) { + try (ClickHouseContainer clickhouse = new ClickHouseContainer(ClickhouseTestImages.CLICKHOUSE_IMAGE)) { clickhouse.start(); ResultSet resultSet = performQuery(clickhouse, "SELECT 1"); diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 264c22eff9e..8107fc92f6a 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -3,8 +3,11 @@ description = "Testcontainers :: JDBC :: CockroachDB" dependencies { api project(':testcontainers-jdbc') - testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.4' } @@ -13,3 +16,7 @@ tasks.japicmp { "org.testcontainers.containers.CockroachContainer" ] } + +test { + useJUnitPlatform() +} 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 index b5e147ce553..dc4915aac3e 100644 --- a/modules/cockroachdb/src/test/java/org/testcontainers/jdbc/cockroachdb/CockroachDBJDBCDriverTest.java +++ b/modules/cockroachdb/src/test/java/org/testcontainers/jdbc/cockroachdb/CockroachDBJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.cockroachdb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class CockroachDBJDBCDriverTest extends AbstractJDBCDriverTest { +class CockroachDBJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { // 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 12c25738e45..5846c22a5db 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 @@ -1,6 +1,6 @@ package org.testcontainers.junit.cockroachdb; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.CockroachDBTestImages; import org.testcontainers.containers.CockroachContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -14,14 +14,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { +class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { static { // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing LogManager.getLogManager().getLogger("").setLevel(Level.OFF); } @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { CockroachContainer cockroach = new CockroachContainer("cockroachdb/cockroach:v22.2.3") // } @@ -36,7 +36,7 @@ public void testSimple() throws SQLException { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try ( CockroachContainer cockroach = new CockroachContainer(CockroachDBTestImages.COCKROACHDB_IMAGE) .withInitScript("somepath/init_postgresql.sql") @@ -51,7 +51,7 @@ public void testExplicitInitScript() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { CockroachContainer cockroach = new CockroachContainer(CockroachDBTestImages.COCKROACHDB_IMAGE) .withUrlParam("sslmode", "disable") .withUrlParam("application_name", "cockroach"); @@ -70,7 +70,7 @@ public void testWithAdditionalUrlParamInJdbcUrl() { } @Test - public void testWithUsernamePasswordDatabase() throws SQLException { + void testWithUsernamePasswordDatabase() throws SQLException { try ( CockroachContainer cockroach = new CockroachContainer( CockroachDBTestImages.FIRST_COCKROACHDB_IMAGE_WITH_ENV_VARS_SUPPORT @@ -92,7 +92,7 @@ public void testWithUsernamePasswordDatabase() throws SQLException { } @Test - public void testAnExceptionIsThrownWhenImageDoesNotSupportEnvVars() { + void testAnExceptionIsThrownWhenImageDoesNotSupportEnvVars() { CockroachContainer cockroachContainer = new CockroachContainer( CockroachDBTestImages.COCKROACHDB_IMAGE_WITH_ENV_VARS_UNSUPPORTED ); @@ -111,7 +111,7 @@ public void testAnExceptionIsThrownWhenImageDoesNotSupportEnvVars() { } @Test - public void testInitializationScript() throws SQLException { + void testInitializationScript() throws SQLException { String sql = "USE postgres; \n" + "CREATE TABLE bar (foo VARCHAR(255)); \n" + diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index b74d9c5f949..f7bc059ced3 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -3,8 +3,15 @@ description = "Testcontainers :: JDBC :: CrateDB" dependencies { api project(':testcontainers-jdbc') - testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testImplementation project(':testcontainers-jdbc-test') compileOnly 'org.jetbrains:annotations:26.0.2' } + +test { + useJUnitPlatform() +} diff --git a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java index 54ef9704ac5..2c20afe6680 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/jdbc/cratedb/CrateDBJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.cratedb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class CrateDBJDBCDriverTest extends AbstractJDBCDriverTest { +class CrateDBJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java index 40f2c667711..803b9173218 100644 --- a/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java +++ b/modules/cratedb/src/test/java/org/testcontainers/junit/cratedb/SimpleCrateDBTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.cratedb; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.CrateDBTestImages; import org.testcontainers.cratedb.CrateDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -12,14 +12,14 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SimpleCrateDBTest extends AbstractContainerDatabaseTest { +class SimpleCrateDBTest extends AbstractContainerDatabaseTest { static { // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing LogManager.getLogManager().getLogger("").setLevel(Level.OFF); } @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { CrateDBContainer cratedb = new CrateDBContainer("crate:5.2.5") // } @@ -34,7 +34,7 @@ public void testSimple() throws SQLException { } @Test - public void testCommandOverride() throws SQLException { + void testCommandOverride() throws SQLException { try ( CrateDBContainer cratedb = new CrateDBContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) .withCommand("crate -C discovery.type=single-node -C cluster.name=testcontainers") @@ -48,7 +48,7 @@ public void testCommandOverride() throws SQLException { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try ( CrateDBContainer cratedb = new CrateDBContainer(CrateDBTestImages.CRATEDB_TEST_IMAGE) .withInitScript("somepath/init_cratedb.sql") diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 6e57f4bd198..1535441e925 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -5,5 +5,12 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.databend:databend-jdbc:0.4.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java b/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java index 66f3504e725..984f42979c4 100644 --- a/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java +++ b/modules/databend/src/test/java/org/testcontainers/databend/DatabendContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.databend; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class DatabendContainerTest extends AbstractContainerDatabaseTest { +class DatabendContainerTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { DatabendContainer databend = new DatabendContainer("datafuselabs/databend:v1.2.615") // } @@ -26,7 +26,7 @@ public void testSimple() throws SQLException { } @Test - public void customCredentialsWithUrlParams() throws SQLException { + void customCredentialsWithUrlParams() throws SQLException { try ( DatabendContainer databend = new DatabendContainer("datafuselabs/databend:v1.2.615") .withUsername("test") diff --git a/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java b/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java index a36039dc8d1..2f3a030919f 100644 --- a/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java +++ b/modules/databend/src/test/java/org/testcontainers/databend/DatabendJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.databend; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class DatabendJDBCDriverTest extends AbstractJDBCDriverTest { +class DatabendJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { // diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index b50291c201d..49fb4c72e28 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -3,6 +3,9 @@ description = "Testcontainers :: JDBC :: DB2" dependencies { api project(':testcontainers-jdbc') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' testImplementation 'org.assertj:assertj-core:3.27.4' @@ -13,3 +16,7 @@ tasks.japicmp { "org.testcontainers.containers.Db2Container" ] } + +test { + useJUnitPlatform() +} 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 index 4a03f824a28..cfa74c8017a 100644 --- a/modules/db2/src/test/java/org/testcontainers/jdbc/db2/DB2JDBCDriverTest.java +++ b/modules/db2/src/test/java/org/testcontainers/jdbc/db2/DB2JDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.db2; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class DB2JDBCDriverTest extends AbstractJDBCDriverTest { +class DB2JDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { // 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 5f8763b1e19..95222330e09 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 @@ -1,6 +1,6 @@ package org.testcontainers.junit.db2; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.Db2TestImages; import org.testcontainers.containers.Db2Container; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -10,10 +10,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SimpleDb2Test extends AbstractContainerDatabaseTest { +class SimpleDb2Test extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { Db2Container db2 = new Db2Container("ibmcom/db2:11.5.0.0a").acceptLicense() // } @@ -29,7 +29,7 @@ public void testSimple() throws SQLException { } @Test - public void testSimpleWithNewImage() throws SQLException { + void testSimpleWithNewImage() throws SQLException { try (Db2Container db2 = new Db2Container("icr.io/db2_community/db2:11.5.8.0").acceptLicense()) { db2.start(); @@ -42,7 +42,7 @@ public void testSimpleWithNewImage() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { try ( Db2Container db2 = new Db2Container(Db2TestImages.DB2_IMAGE) .withUrlParam("sslConnection", "false") diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle index f4f762ae43a..1136c2b44b0 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -11,4 +11,5 @@ dependencies { api 'org.apache.tomcat:tomcat-jdbc:11.0.10' api 'org.vibur:vibur-dbcp:26.0' api 'mysql:mysql-connector-java:8.0.33' + api 'org.junit.jupiter:junit-jupiter:5.13.4' } diff --git a/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java b/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java index 5a22e37ecfc..ff844b8988b 100644 --- a/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java +++ b/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java @@ -4,9 +4,11 @@ import com.zaxxer.hikari.HikariDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.lang3.SystemUtils; -import org.junit.AfterClass; -import org.junit.Test; -import org.junit.runners.Parameterized.Parameter; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.Parameter; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import java.sql.Connection; import java.sql.ResultSet; @@ -17,6 +19,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assume.assumeFalse; +@ParameterizedClass +@MethodSource("data") public class AbstractJDBCDriverTest { protected enum Options { @@ -27,7 +31,7 @@ protected enum Options { PmdKnownBroken, } - @Parameter + @Parameter(0) public String jdbcUrl; @Parameter(1) @@ -39,13 +43,13 @@ public static void sampleInitFunction(Connection connection) throws SQLException connection.createStatement().execute("CREATE TABLE my_counter (\n" + " n INT\n" + ");"); } - @AfterClass + @AfterAll public static void testCleanup() { ContainerDatabaseDriver.killContainers(); } @Test - public void test() throws SQLException { + void test() throws SQLException { try (HikariDataSource dataSource = getDataSource(jdbcUrl, 1)) { performSimpleTest(dataSource); diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle index d68f122f4dc..2bb703099aa 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -6,6 +6,9 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.5' @@ -18,3 +21,7 @@ tasks.japicmp { "org.testcontainers.containers.MariaDBContainer" ] } + +test { + useJUnitPlatform() +} 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 index 9d903ab3965..5d3b799f0ff 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/jdbc/mariadb/MariaDBJDBCDriverTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/jdbc/mariadb/MariaDBJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.mariadb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class MariaDBJDBCDriverTest extends AbstractJDBCDriverTest { +class MariaDBJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { 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 2651615928c..9b7fab4daaf 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 @@ -1,7 +1,7 @@ package org.testcontainers.junit.mariadb; import org.apache.commons.lang3.SystemUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.MariaDBTestImages; import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -21,10 +21,10 @@ import static org.assertj.core.api.Assumptions.assumeThat; import static org.junit.Assume.assumeFalse; -public class SimpleMariaDBTest extends AbstractContainerDatabaseTest { +class SimpleMariaDBTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { MariaDBContainer mariadb = new MariaDBContainer<>("mariadb:10.3.39") // } @@ -39,7 +39,7 @@ public void testSimple() throws SQLException { } @Test - public void testSpecificVersion() throws SQLException { + void testSpecificVersion() throws SQLException { try ( MariaDBContainer mariadbOldVersion = new MariaDBContainer<>( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") @@ -57,7 +57,7 @@ public void testSpecificVersion() throws SQLException { } @Test - public void testMariaDBWithCustomIniFile() throws SQLException { + void testMariaDBWithCustomIniFile() throws SQLException { assumeFalse(SystemUtils.IS_OS_WINDOWS); try ( @@ -73,7 +73,7 @@ public void testMariaDBWithCustomIniFile() throws SQLException { } @Test - public void testMariaDBWithCommandOverride() throws SQLException { + void testMariaDBWithCommandOverride() throws SQLException { try ( MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE) .withCommand("mysqld --auto_increment_increment=10") @@ -87,7 +87,7 @@ public void testMariaDBWithCommandOverride() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { MariaDBContainer mariaDBContainer = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE) .withUrlParam("connectTimeout", "40000") .withUrlParam("rewriteBatchedStatements", "true"); @@ -105,7 +105,7 @@ public void testWithAdditionalUrlParamInJdbcUrl() { } @Test - public void testWithOnlyUserReadableCustomIniFile() throws Exception { + void testWithOnlyUserReadableCustomIniFile() throws Exception { assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue(); try ( @@ -136,7 +136,7 @@ public void testWithOnlyUserReadableCustomIniFile() throws Exception { } @Test - public void testEmptyPasswordWithRootUser() throws SQLException { + void testEmptyPasswordWithRootUser() throws SQLException { try (MariaDBContainer mysql = new MariaDBContainer<>("mariadb:11.2.4").withUsername("root")) { mysql.start(); diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle index 3ba79559b58..da8318ffa84 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -6,6 +6,9 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' @@ -21,3 +24,7 @@ tasks.japicmp { "org.testcontainers.containers.MSSQLServerContainer" ] } + +test { + useJUnitPlatform() +} 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 index 4ed4db9e8ab..9f616ab10f8 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/jdbc/mssqlserver/MSSQLServerJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.mssqlserver; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class MSSQLServerJDBCDriverTest extends AbstractJDBCDriverTest { +class MSSQLServerJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java index 27075d6a3fe..06aa1dc4a61 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java @@ -1,14 +1,13 @@ package org.testcontainers.junit.mssqlserver; import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.MSSQLServerTestImages; import org.testcontainers.containers.MSSQLServerContainer; -import java.util.Arrays; -import java.util.Collection; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.fail; @@ -16,7 +15,6 @@ * Tests if the password passed to the container satisfied the password policy described at * https://docs.microsoft.com/en-us/sql/relational-databases/security/password-policy?view=sql-server-2017 */ -@RunWith(Parameterized.class) public class CustomPasswordMSSQLServerTest { private static String UPPER_CASE_LETTERS = "ABCDE"; @@ -27,51 +25,40 @@ public class CustomPasswordMSSQLServerTest { private static String SPECIAL_CHARS = "_(!)_"; - private String password; - - private Boolean valid; - - public CustomPasswordMSSQLServerTest(String password, Boolean valid) { - this.password = password; - this.valid = valid; - } - - @Parameterized.Parameters - public static Collection data() { - return Arrays.asList( - new Object[][] { - new Object[] { null, false }, - // too short - { "abc123", false }, - // too long - { RandomStringUtils.randomAlphabetic(129), false }, - // only 2 categories - { UPPER_CASE_LETTERS + NUMBERS, false }, - { UPPER_CASE_LETTERS + SPECIAL_CHARS, false }, - { LOWER_CASE_LETTERS + NUMBERS, false }, - { LOWER_CASE_LETTERS + SPECIAL_CHARS, false }, - { NUMBERS + SPECIAL_CHARS, false }, - // 3 categories - { UPPER_CASE_LETTERS + LOWER_CASE_LETTERS + NUMBERS, true }, - { UPPER_CASE_LETTERS + LOWER_CASE_LETTERS + SPECIAL_CHARS, true }, - { UPPER_CASE_LETTERS + NUMBERS + SPECIAL_CHARS, true }, - { LOWER_CASE_LETTERS + NUMBERS + SPECIAL_CHARS, true }, - // 4 categories - { UPPER_CASE_LETTERS + LOWER_CASE_LETTERS + NUMBERS + SPECIAL_CHARS, true }, - } + public static Stream data() { + return Stream.of( + Arguments.arguments(null, false), + // too short + Arguments.arguments("abc123", false), + // too long + Arguments.arguments(RandomStringUtils.randomAlphabetic(129), false), + // only 2 categories + Arguments.arguments(UPPER_CASE_LETTERS + NUMBERS, false), + Arguments.arguments(UPPER_CASE_LETTERS + SPECIAL_CHARS, false), + Arguments.arguments(LOWER_CASE_LETTERS + NUMBERS, false), + Arguments.arguments(LOWER_CASE_LETTERS + SPECIAL_CHARS, false), + Arguments.arguments(NUMBERS + SPECIAL_CHARS, false), + // 3 categories + Arguments.arguments(UPPER_CASE_LETTERS + LOWER_CASE_LETTERS + NUMBERS, true), + Arguments.arguments(UPPER_CASE_LETTERS + LOWER_CASE_LETTERS + SPECIAL_CHARS, true), + Arguments.arguments(UPPER_CASE_LETTERS + NUMBERS + SPECIAL_CHARS, true), + Arguments.arguments(LOWER_CASE_LETTERS + NUMBERS + SPECIAL_CHARS, true), + // 4 categories + Arguments.arguments(UPPER_CASE_LETTERS + LOWER_CASE_LETTERS + NUMBERS + SPECIAL_CHARS, true) ); } - @Test - public void runPasswordTests() { + @ParameterizedTest + @MethodSource("data") + public void runPasswordTests(String password, boolean valid) { try { - new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE).withPassword(this.password); + new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE).withPassword(password); if (!valid) { - fail("Password " + this.password + " is not valid. Expected exception"); + fail("Password " + password + " is not valid. Expected exception"); } } catch (IllegalArgumentException e) { if (valid) { - fail("Password " + this.password + " should have been validated"); + fail("Password " + password + " should have been validated"); } } } diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java index 03e0affa00c..630b6c5356c 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.mssqlserver; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.utility.DockerImageName; @@ -10,12 +10,12 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest { +class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest { private static final String STRONG_PASSWORD = "myStrong(!)Password"; @Test - public void testSqlServerConnection() throws SQLException { + void testSqlServerConnection() throws SQLException { try ( MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>( DockerImageName.parse("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04") 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 943eff30a53..0d995911893 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.mssqlserver; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.MSSQLServerTestImages; import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -13,10 +13,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { +class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>( "mcr.microsoft.com/mssql/server:2022-CU20-ubuntu-22.04" @@ -34,7 +34,7 @@ public void testSimple() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { try ( MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE) .withUrlParam("integratedSecurity", "false") @@ -48,7 +48,7 @@ public void testWithAdditionalUrlParamInJdbcUrl() { } @Test - public void testSetupDatabase() throws SQLException { + void testSetupDatabase() throws SQLException { try ( MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE) ) { diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index ddacc0fdc50..32573799f70 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -6,6 +6,9 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' @@ -20,3 +23,7 @@ tasks.japicmp { "org.testcontainers.containers.MySQLContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java index e9a3c862143..a8737c4c74f 100644 --- a/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/containers/MySQLRootAccountTest.java @@ -1,9 +1,8 @@ package org.testcontainers.containers; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.MySQLTestImages; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.utility.DockerImageName; @@ -13,10 +12,8 @@ import java.sql.SQLException; @Slf4j -@RunWith(Parameterized.class) -public class MySQLRootAccountTest { +class MySQLRootAccountTest { - @Parameterized.Parameters(name = "{0}") public static DockerImageName[] params() { return new DockerImageName[] { MySQLTestImages.MYSQL_57_IMAGE, @@ -26,21 +23,21 @@ public static DockerImageName[] params() { }; } - @Parameterized.Parameter - public DockerImageName image; - - @Test - public void testRootAccountUsageWithDefaultPassword() throws SQLException { + @ParameterizedTest + @MethodSource("params") + void testRootAccountUsageWithDefaultPassword(DockerImageName image) throws SQLException { testWithDB(new MySQLContainer<>(image).withUsername("root")); } - @Test - public void testRootAccountUsageWithEmptyPassword() throws SQLException { + @ParameterizedTest + @MethodSource("params") + void testRootAccountUsageWithEmptyPassword(DockerImageName image) throws SQLException { testWithDB(new MySQLContainer<>(image).withUsername("root").withPassword("")); } - @Test - public void testRootAccountUsageWithCustomPassword() throws SQLException { + @ParameterizedTest + @MethodSource("params") + void testRootAccountUsageWithCustomPassword(DockerImageName image) throws SQLException { testWithDB(new MySQLContainer<>(image).withUsername("root").withPassword("not-default")); } diff --git a/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java index be48f623183..0075b2ebf7f 100644 --- a/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/JDBCDriverWithPoolTest.java @@ -5,19 +5,19 @@ import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; import org.apache.tomcat.jdbc.pool.PoolProperties; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.jdbc.ContainerDatabaseDriver; import org.vibur.dbcp.ViburDBCPDataSource; import java.sql.Connection; import java.sql.SQLException; -import java.util.Arrays; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import java.util.function.Supplier; +import java.util.stream.Stream; import javax.sql.DataSource; @@ -29,7 +29,8 @@ * 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) +@ParameterizedClass +@MethodSource("dataSourceSuppliers") public class JDBCDriverWithPoolTest { public static final String URL = @@ -37,9 +38,8 @@ public class JDBCDriverWithPoolTest { private final DataSource dataSource; - @Parameterized.Parameters - public static Iterable> dataSourceSuppliers() { - return Arrays.asList( + public static Stream> dataSourceSuppliers() { + return Stream.of( JDBCDriverWithPoolTest::getTomcatDataSourceWithDriverClassName, JDBCDriverWithPoolTest::getTomcatDataSource, JDBCDriverWithPoolTest::getHikariDataSourceWithDriverClassName, @@ -56,7 +56,7 @@ public JDBCDriverWithPoolTest(Supplier dataSourceSupplier) { private ExecutorService executorService = Executors.newFixedThreadPool(5); @Test - public void testMySQLWithConnectionPoolUsingSameContainer() throws SQLException, InterruptedException { + void testMySQLWithConnectionPoolUsingSameContainer() throws SQLException, InterruptedException { // Populate the database with some data in multiple threads, so that multiple connections from the pool will be used for (int i = 0; i < 100; i++) { executorService.submit(() -> { diff --git a/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLDatabaseContainerDriverTest.java b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLDatabaseContainerDriverTest.java index 7f5cf5eae1d..da73f21ae2e 100644 --- a/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLDatabaseContainerDriverTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLDatabaseContainerDriverTest.java @@ -1,6 +1,6 @@ package org.testcontainers.jdbc.mysql; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.jdbc.ContainerDatabaseDriver; import java.sql.Connection; @@ -11,10 +11,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class MySQLDatabaseContainerDriverTest { +class MySQLDatabaseContainerDriverTest { @Test - public void shouldRespectBothUrlPropertiesAndParameterProperties() throws SQLException { + void shouldRespectBothUrlPropertiesAndParameterProperties() throws SQLException { ContainerDatabaseDriver driver = new ContainerDatabaseDriver(); String url = "jdbc:tc:mysql:8.0.36://hostname/databasename?padCharsWithSpace=true"; Properties properties = new Properties(); 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 index 526c2ab522c..b069e5fd0c8 100644 --- a/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLJDBCDriverTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/jdbc/mysql/MySQLJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.mysql; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class MySQLJDBCDriverTest extends AbstractJDBCDriverTest { +class MySQLJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java index e756631d8e1..9e9d97dc54e 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.mysql; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.MySQLTestImages; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CustomizableMysqlTest extends AbstractContainerDatabaseTest { +class CustomizableMysqlTest extends AbstractContainerDatabaseTest { private static final String DB_NAME = "foo"; @@ -19,7 +19,7 @@ public class CustomizableMysqlTest extends AbstractContainerDatabaseTest { private static final String PWD = "baz"; @Test - public void testSimple() throws SQLException { + 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<>(MySQLTestImages.MYSQL_80_IMAGE) diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java index 25085289ba7..d8e8b52dc56 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java @@ -1,8 +1,7 @@ package org.testcontainers.junit.mysql; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.MySQLTestImages; import org.testcontainers.containers.MySQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -13,10 +12,8 @@ import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class MultiVersionMySQLTest extends AbstractContainerDatabaseTest { +class MultiVersionMySQLTest extends AbstractContainerDatabaseTest { - @Parameterized.Parameters(name = "{0}") public static DockerImageName[] params() { return new DockerImageName[] { MySQLTestImages.MYSQL_57_IMAGE, @@ -26,11 +23,9 @@ public static DockerImageName[] params() { }; } - @Parameterized.Parameter - public DockerImageName dockerImageName; - - @Test - public void versionCheckTest() throws SQLException { + @ParameterizedTest + @MethodSource("params") + void versionCheckTest(DockerImageName dockerImageName) throws SQLException { try (MySQLContainer mysql = new MySQLContainer<>(dockerImageName)) { mysql.start(); final ResultSet resultSet = performQuery(mysql, "SELECT VERSION()"); 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 085fdf074cb..b3eac503c57 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 @@ -1,6 +1,6 @@ package org.testcontainers.junit.mysql; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.MySQLTestImages; @@ -27,15 +27,15 @@ import java.util.Set; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assumptions.assumeThat; -public class SimpleMySQLTest extends AbstractContainerDatabaseTest { +class SimpleMySQLTest extends AbstractContainerDatabaseTest { private static final Logger logger = LoggerFactory.getLogger(SimpleMySQLTest.class); @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { MySQLContainer mysql = new MySQLContainer<>("mysql:8.0.36") // } @@ -51,7 +51,7 @@ public void testSimple() throws SQLException { } @Test - public void testSpecificVersion() throws SQLException { + void testSpecificVersion() throws SQLException { try ( MySQLContainer mysqlOldVersion = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") @@ -69,7 +69,7 @@ public void testSpecificVersion() throws SQLException { } @Test - public void testMySQLWithCustomIniFile() throws SQLException { + void testMySQLWithCustomIniFile() throws SQLException { try ( MySQLContainer mysqlCustomConfig = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") @@ -81,7 +81,7 @@ public void testMySQLWithCustomIniFile() throws SQLException { } @Test - public void testCommandOverride() throws SQLException { + void testCommandOverride() throws SQLException { try ( MySQLContainer mysqlCustomConfig = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withCommand("mysqld --auto_increment_increment=42") @@ -96,7 +96,7 @@ public void testCommandOverride() throws SQLException { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try ( MySQLContainer container = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withInitScript("somepath/init_mysql.sql") @@ -111,8 +111,8 @@ public void testExplicitInitScript() throws SQLException { } } - @Test(expected = ContainerLaunchException.class) - public void testEmptyPasswordWithNonRootUser() { + @Test + void testEmptyPasswordWithNonRootUser() { try ( MySQLContainer container = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withDatabaseName("TEST") @@ -120,13 +120,14 @@ public void testEmptyPasswordWithNonRootUser() { .withPassword("") .withEnv("MYSQL_ROOT_HOST", "%") ) { - container.start(); - fail("ContainerLaunchException expected to be thrown"); + assertThatThrownBy(container::start) + .isInstanceOf(ContainerLaunchException.class) + .hasMessageStartingWith("Container startup failed for image mysql"); } } @Test - public void testEmptyPasswordWithRootUser() throws SQLException { + 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<>(MySQLTestImages.MYSQL_80_IMAGE) @@ -145,7 +146,7 @@ public void testEmptyPasswordWithRootUser() throws SQLException { } @Test - public void testWithAdditionalUrlParamTimeZone() throws SQLException { + void testWithAdditionalUrlParamTimeZone() throws SQLException { MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withUrlParam("serverTimezone", "Europe/Zurich") .withEnv("TZ", "Europe/Zurich") @@ -180,7 +181,7 @@ public void testWithAdditionalUrlParamTimeZone() throws SQLException { } @Test - public void testWithAdditionalUrlParamMultiQueries() throws SQLException { + void testWithAdditionalUrlParamMultiQueries() throws SQLException { MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withUrlParam("allowMultiQueries", "true") .withLogConsumer(new Slf4jLogConsumer(logger)); @@ -205,7 +206,7 @@ public void testWithAdditionalUrlParamMultiQueries() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) .withUrlParam("allowMultiQueries", "true") .withUrlParam("rewriteBatchedStatements", "true") @@ -224,7 +225,7 @@ public void testWithAdditionalUrlParamInJdbcUrl() { } @Test - public void testWithOnlyUserReadableCustomIniFile() throws Exception { + void testWithOnlyUserReadableCustomIniFile() throws Exception { assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue(); try ( MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) diff --git a/modules/oceanbase/build.gradle b/modules/oceanbase/build.gradle index d4278ddc0bc..c577c65b260 100644 --- a/modules/oceanbase/build.gradle +++ b/modules/oceanbase/build.gradle @@ -3,6 +3,13 @@ description = "Testcontainers :: JDBC :: OceanBase" dependencies { api project(':testcontainers-jdbc') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } + +test { + useJUnitPlatform() +} diff --git a/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/OceanBaseJdbcDriverTest.java b/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/OceanBaseJdbcDriverTest.java index a4f63b1eb90..b701d953e9a 100644 --- a/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/OceanBaseJdbcDriverTest.java +++ b/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/OceanBaseJdbcDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.oceanbase; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class OceanBaseJdbcDriverTest extends AbstractJDBCDriverTest { +class OceanBaseJdbcDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { { "jdbc:tc:oceanbasece://hostname/databasename", EnumSet.noneOf(Options.class) } } diff --git a/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java b/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java index 46619f328be..ee2d8196718 100644 --- a/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java +++ b/modules/oceanbase/src/test/java/org/testcontainers/oceanbase/SimpleOceanBaseCETest.java @@ -1,6 +1,6 @@ package org.testcontainers.oceanbase; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -8,12 +8,12 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SimpleOceanBaseCETest extends AbstractContainerDatabaseTest { +class SimpleOceanBaseCETest extends AbstractContainerDatabaseTest { private static final String IMAGE = "oceanbase/oceanbase-ce:4.2.1.8-108000022024072217"; @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { OceanBaseCEContainer oceanbase = new OceanBaseCEContainer( "oceanbase/oceanbase-ce:4.2.1.8-108000022024072217" @@ -30,7 +30,7 @@ public void testSimple() throws SQLException { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try (OceanBaseCEContainer oceanbase = new OceanBaseCEContainer(IMAGE).withInitScript("init.sql")) { oceanbase.start(); @@ -41,7 +41,7 @@ public void testExplicitInitScript() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { try (OceanBaseCEContainer oceanbase = new OceanBaseCEContainer(IMAGE).withUrlParam("useSSL", "false")) { oceanbase.start(); diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index a55c9f26518..3f85086074f 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -6,6 +6,9 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' @@ -14,3 +17,7 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } + +test { + useJUnitPlatform() +} diff --git a/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java b/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java index a9c3bce593a..f46539bac89 100644 --- a/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java +++ b/modules/oracle-free/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.oracle; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.oracle.OracleContainer; import org.testcontainers.utility.DockerImageName; @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -public class SimpleOracleTest extends AbstractContainerDatabaseTest { +class SimpleOracleTest extends AbstractContainerDatabaseTest { private static final DockerImageName ORACLE_DOCKER_IMAGE_NAME = DockerImageName.parse( "gvenzl/oracle-free:slim-faststart" @@ -32,7 +32,7 @@ private void runTest(OracleContainer container, String databaseName, String user } @Test - public void testDefaultSettings() throws SQLException { + void testDefaultSettings() throws SQLException { try ( // container { OracleContainer oracle = new OracleContainer("gvenzl/oracle-free:slim-faststart") // } @@ -46,14 +46,14 @@ public void testDefaultSettings() throws SQLException { } @Test - public void testPluggableDatabase() throws SQLException { + void testPluggableDatabase() throws SQLException { try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME).withDatabaseName("testDB")) { runTest(oracle, "testDB", "test", "test"); } } @Test - public void testPluggableDatabaseAndCustomUser() throws SQLException { + void testPluggableDatabaseAndCustomUser() throws SQLException { try ( OracleContainer oracle = new OracleContainer("gvenzl/oracle-free:slim-faststart") .withDatabaseName("testDB") @@ -65,7 +65,7 @@ public void testPluggableDatabaseAndCustomUser() throws SQLException { } @Test - public void testCustomUser() throws SQLException { + void testCustomUser() throws SQLException { try ( OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME) .withUsername("testUser") @@ -76,7 +76,7 @@ public void testCustomUser() throws SQLException { } @Test - public void testSID() throws SQLException { + void testSID() throws SQLException { try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME).usingSid()) { runTest(oracle, "freepdb1", "system", "test"); @@ -87,7 +87,7 @@ public void testSID() throws SQLException { } @Test - public void testSIDAndCustomPassword() throws SQLException { + void testSIDAndCustomPassword() throws SQLException { try ( OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME) .usingSid() @@ -98,7 +98,7 @@ public void testSIDAndCustomPassword() throws SQLException { } @Test - public void testErrorPaths() throws SQLException { + void testErrorPaths() throws SQLException { try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME)) { try { oracle.withDatabaseName("FREEPDB1"); diff --git a/modules/oracle-free/src/test/java/org/testcontainers/oracle/jdbc/OracleJDBCDriverTest.java b/modules/oracle-free/src/test/java/org/testcontainers/oracle/jdbc/OracleJDBCDriverTest.java index 6f6157c61c8..a4982e966c1 100644 --- a/modules/oracle-free/src/test/java/org/testcontainers/oracle/jdbc/OracleJDBCDriverTest.java +++ b/modules/oracle-free/src/test/java/org/testcontainers/oracle/jdbc/OracleJDBCDriverTest.java @@ -4,17 +4,17 @@ import com.zaxxer.hikari.HikariDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.sql.ResultSet; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; -public class OracleJDBCDriverTest { +class OracleJDBCDriverTest { @Test - public void testOracleWithNoSpecifiedVersion() throws SQLException { + void testOracleWithNoSpecifiedVersion() throws SQLException { performSimpleTest("jdbc:tc:oracle://hostname/databasename"); } diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index a384fcb7221..edc86cef19c 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -6,6 +6,9 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' @@ -20,3 +23,7 @@ tasks.japicmp { "org.testcontainers.containers.OracleContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java b/modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java index 5e44f0d368c..4b672827fe6 100644 --- a/modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java +++ b/modules/oracle-xe/src/test/java/org/testcontainers/containers/jdbc/OracleJDBCDriverTest.java @@ -4,17 +4,17 @@ import com.zaxxer.hikari.HikariDataSource; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.ResultSetHandler; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.sql.ResultSet; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; -public class OracleJDBCDriverTest { +class OracleJDBCDriverTest { @Test - public void testOracleWithNoSpecifiedVersion() throws SQLException { + void testOracleWithNoSpecifiedVersion() throws SQLException { performSimpleTest("jdbc:tc:oracle://hostname/databasename"); } diff --git a/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java b/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java index eb63442c06e..17ee85944a7 100644 --- a/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java +++ b/modules/oracle-xe/src/test/java/org/testcontainers/junit/oracle/SimpleOracleTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.oracle; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.OracleContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.utility.DockerImageName; @@ -11,7 +11,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -public class SimpleOracleTest extends AbstractContainerDatabaseTest { +class SimpleOracleTest extends AbstractContainerDatabaseTest { public static final DockerImageName ORACLE_DOCKER_IMAGE_NAME = DockerImageName.parse( "gvenzl/oracle-xe:21-slim-faststart" @@ -32,7 +32,7 @@ private void runTest(OracleContainer container, String databaseName, String user } @Test - public void testDefaultSettings() throws SQLException { + void testDefaultSettings() throws SQLException { try ( // container { OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21-slim-faststart") // } @@ -46,14 +46,14 @@ public void testDefaultSettings() throws SQLException { } @Test - public void testPluggableDatabase() throws SQLException { + void testPluggableDatabase() throws SQLException { try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME).withDatabaseName("testDB")) { runTest(oracle, "testDB", "test", "test"); } } @Test - public void testPluggableDatabaseAndCustomUser() throws SQLException { + void testPluggableDatabaseAndCustomUser() throws SQLException { try ( OracleContainer oracle = new OracleContainer("gvenzl/oracle-xe:21-slim-faststart") .withDatabaseName("testDB") @@ -65,7 +65,7 @@ public void testPluggableDatabaseAndCustomUser() throws SQLException { } @Test - public void testCustomUser() throws SQLException { + void testCustomUser() throws SQLException { try ( OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME) .withUsername("testUser") @@ -76,7 +76,7 @@ public void testCustomUser() throws SQLException { } @Test - public void testSID() throws SQLException { + void testSID() throws SQLException { try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME).usingSid();) { runTest(oracle, "xepdb1", "system", "test"); @@ -87,7 +87,7 @@ public void testSID() throws SQLException { } @Test - public void testSIDAndCustomPassword() throws SQLException { + void testSIDAndCustomPassword() throws SQLException { try ( OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME) .usingSid() @@ -98,7 +98,7 @@ public void testSIDAndCustomPassword() throws SQLException { } @Test - public void testErrorPaths() throws SQLException { + void testErrorPaths() throws SQLException { try (OracleContainer oracle = new OracleContainer(ORACLE_DOCKER_IMAGE_NAME)) { try { oracle.withDatabaseName("XEPDB1"); diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle index 8af61c5f3e2..dd5e441477a 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -6,6 +6,9 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' @@ -20,3 +23,7 @@ tasks.japicmp { "org.testcontainers.containers.PostgreSQLContainer" ] } + +test { + useJUnitPlatform() +} diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java b/modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java index 76b4a8c1bda..7101f4a9fb1 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.utility.DockerImageName; @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CompatibleImageTest extends AbstractContainerDatabaseTest { +class CompatibleImageTest extends AbstractContainerDatabaseTest { @Test - public void pgvector() throws SQLException { + void pgvector() throws SQLException { try ( // pgvectorContainer { PostgreSQLContainer pgvector = new PostgreSQLContainer<>("pgvector/pgvector:pg16") @@ -27,7 +27,7 @@ public void pgvector() throws SQLException { } @Test - public void postgis() throws SQLException { + void postgis() throws SQLException { try ( // postgisContainer { PostgreSQLContainer postgis = new PostgreSQLContainer<>( @@ -44,7 +44,7 @@ public void postgis() throws SQLException { } @Test - public void timescaledb() throws SQLException { + void timescaledb() throws SQLException { try ( // timescaledbContainer { PostgreSQLContainer timescaledb = new PostgreSQLContainer<>( 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 275517250b6..3ed0b7030b1 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/PostgreSQLConnectionURLTest.java @@ -1,15 +1,15 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.PostgreSQLTestImages; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class PostgreSQLConnectionURLTest { +class PostgreSQLConnectionURLTest { @Test - public void shouldCorrectlyAppendQueryString() { + void shouldCorrectlyAppendQueryString() { 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() { + void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { PostgreSQLContainer postgres = new NoParamsUrlPostgreSQLContainer(); String connectionUrl = postgres.constructUrlForConnection("?stringtype=unspecified&stringtype=unspecified"); String queryString = connectionUrl.substring(connectionUrl.indexOf('?')); @@ -35,7 +35,7 @@ public void shouldCorrectlyAppendQueryStringWhenNoBaseParams() { } @Test - public void shouldReturnOriginalURLWhenEmptyQueryString() { + void shouldReturnOriginalURLWhenEmptyQueryString() { PostgreSQLContainer postgres = new FixedJdbcUrlPostgreSQLContainer(); String connectionUrl = postgres.constructUrlForConnection(""); @@ -43,7 +43,7 @@ public void shouldReturnOriginalURLWhenEmptyQueryString() { } @Test - public void shouldRejectInvalidQueryString() { + void shouldRejectInvalidQueryString() { assertThat( catchThrowable(() -> { new NoParamsUrlPostgreSQLContainer().constructUrlForConnection("stringtype=unspecified"); diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/TimescaleDBContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/containers/TimescaleDBContainerTest.java index 90f3113c7c0..3991f4c2b1c 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/TimescaleDBContainerTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/containers/TimescaleDBContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TimescaleDBContainerTest extends AbstractContainerDatabaseTest { +class TimescaleDBContainerTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try (JdbcDatabaseContainer postgres = new TimescaleDBContainerProvider().newInstance()) { postgres.start(); @@ -22,7 +22,7 @@ public void testSimple() throws SQLException { } @Test - public void testCommandOverride() throws SQLException { + void testCommandOverride() throws SQLException { try ( GenericContainer postgres = new TimescaleDBContainerProvider() .newInstance() @@ -40,7 +40,7 @@ public void testCommandOverride() throws SQLException { } @Test - public void testUnsetCommand() throws SQLException { + void testUnsetCommand() throws SQLException { try ( GenericContainer postgres = new TimescaleDBContainerProvider() .newInstance() @@ -59,7 +59,7 @@ public void testUnsetCommand() throws SQLException { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try ( JdbcDatabaseContainer postgres = new TimescaleDBContainerProvider() .newInstance() diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java index ed519ed2e4b..ab4d6f03d2e 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverShutdownTest.java @@ -1,7 +1,7 @@ package org.testcontainers.jdbc; -import org.junit.AfterClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.JdbcDatabaseContainer; import java.sql.Connection; @@ -16,15 +16,15 @@ * 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 { +class DatabaseDriverShutdownTest { - @AfterClass + @BeforeAll public static void testCleanup() { ContainerDatabaseDriver.killContainers(); } @Test - public void shouldStopContainerWhenAllConnectionsClosed() throws SQLException { + void shouldStopContainerWhenAllConnectionsClosed() throws SQLException { final String jdbcUrl = "jdbc:tc:postgresql:9.6.8://hostname/databasename"; getConnectionAndClose(jdbcUrl); @@ -34,7 +34,7 @@ public void shouldStopContainerWhenAllConnectionsClosed() throws SQLException { } @Test - public void shouldNotStopDaemonContainerWhenAllConnectionsClosed() throws SQLException { + void shouldNotStopDaemonContainerWhenAllConnectionsClosed() throws SQLException { final String jdbcUrl = "jdbc:tc:postgresql:9.6.8://hostname/databasename?TC_DAEMON=true"; getConnectionAndClose(jdbcUrl); diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java index 463981d2d59..12a6f2216cf 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/DatabaseDriverTmpfsTest.java @@ -1,6 +1,6 @@ package org.testcontainers.jdbc; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.Container; import org.testcontainers.containers.JdbcDatabaseContainer; @@ -15,10 +15,10 @@ * 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 { +class DatabaseDriverTmpfsTest { @Test - public void testDatabaseHasTmpFsViaConnectionString() throws Exception { + void testDatabaseHasTmpFsViaConnectionString() throws Exception { final String jdbcUrl = "jdbc:tc:postgresql:9.6.8://hostname/databasename?TC_TMPFS=/testtmpfs:rw"; try (Connection ignored = DriverManager.getConnection(jdbcUrl)) { JdbcDatabaseContainer container = ContainerDatabaseDriver.getContainer(jdbcUrl); diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/pgvector/PgVectorJDBCDriverTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/pgvector/PgVectorJDBCDriverTest.java index 2d7e67f4923..e94986e7875 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/jdbc/pgvector/PgVectorJDBCDriverTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/pgvector/PgVectorJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.pgvector; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class PgVectorJDBCDriverTest extends AbstractJDBCDriverTest { +class PgVectorJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { 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 abc0a3b76bc..d6a0047a23c 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 @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.postgis; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class PostgisJDBCDriverTest extends AbstractJDBCDriverTest { +class PostgisJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { 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 index d42f17f3ec2..b47af39f54b 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgresql/PostgreSQLJDBCDriverTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/postgresql/PostgreSQLJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.postgresql; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) public class PostgreSQLJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/postgresql/src/test/java/org/testcontainers/jdbc/timescaledb/TimescaleDBJDBCDriverTest.java b/modules/postgresql/src/test/java/org/testcontainers/jdbc/timescaledb/TimescaleDBJDBCDriverTest.java index 2a50b46c901..8befb01bfb1 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/jdbc/timescaledb/TimescaleDBJDBCDriverTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/jdbc/timescaledb/TimescaleDBJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.timescaledb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) public class TimescaleDBJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java index 0e9904a5f61..fb09530913b 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.postgresql; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.PostgreSQLTestImages; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest { +class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest { private static final String DB_NAME = "foo"; @@ -19,7 +19,7 @@ public class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest { private static final String PWD = "baz"; @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withDatabaseName(DB_NAME) 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 53585fec327..7227f3bdd60 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 @@ -1,6 +1,6 @@ package org.testcontainers.junit.postgresql; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.PostgreSQLTestImages; import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -13,14 +13,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNoException; -public class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { +class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { static { // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing LogManager.getLogManager().getLogger("").setLevel(Level.OFF); } @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:9.6.12") // } @@ -35,7 +35,7 @@ public void testSimple() throws SQLException { } @Test - public void testCommandOverride() throws SQLException { + void testCommandOverride() throws SQLException { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withCommand("postgres -c max_connections=42") @@ -49,7 +49,7 @@ public void testCommandOverride() throws SQLException { } @Test - public void testUnsetCommand() throws SQLException { + void testUnsetCommand() throws SQLException { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withCommand("postgres -c max_connections=42") @@ -64,7 +64,7 @@ public void testUnsetCommand() throws SQLException { } @Test - public void testMissingInitScript() { + void testMissingInitScript() { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withInitScript(null) @@ -74,7 +74,7 @@ public void testMissingInitScript() { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withInitScript("somepath/init_postgresql.sql") @@ -89,7 +89,7 @@ public void testExplicitInitScript() throws SQLException { } @Test - public void testExplicitInitScripts() throws SQLException { + void testExplicitInitScripts() throws SQLException { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withInitScripts("somepath/init_postgresql.sql", "somepath/init_postgresql_2.sql") @@ -110,7 +110,7 @@ public void testExplicitInitScripts() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { try ( PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withUrlParam("charSet", "UNICODE") diff --git a/modules/presto/build.gradle b/modules/presto/build.gradle index 194b413c10f..452e8cc271d 100644 --- a/modules/presto/build.gradle +++ b/modules/presto/build.gradle @@ -3,7 +3,14 @@ description = "Testcontainers :: JDBC :: Presto" dependencies { api project(':testcontainers-jdbc') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.prestosql:presto-jdbc:350' compileOnly 'org.jetbrains:annotations:26.0.2' } + +test { + useJUnitPlatform() +} diff --git a/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java b/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java index 8f2aa15f21c..9a46309f9e9 100644 --- a/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java +++ b/modules/presto/src/test/java/org/testcontainers/containers/PrestoContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.PrestoTestImages; import java.sql.Connection; @@ -14,10 +14,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class PrestoContainerTest { +class PrestoContainerTest { @Test - public void testSimple() throws Exception { + void testSimple() throws Exception { try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_TEST_IMAGE)) { prestoSql.start(); try ( @@ -35,7 +35,7 @@ public void testSimple() throws Exception { } @Test - public void testSpecificVersion() throws Exception { + void testSpecificVersion() throws Exception { try ( PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_PREVIOUS_VERSION_TEST_IMAGE) ) { @@ -54,7 +54,7 @@ public void testSpecificVersion() throws Exception { } @Test - public void testQueryMemoryAndTpch() throws SQLException { + void testQueryMemoryAndTpch() throws SQLException { try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_TEST_IMAGE)) { prestoSql.start(); try ( @@ -88,7 +88,7 @@ public void testQueryMemoryAndTpch() throws SQLException { } @Test - public void testInitScript() throws Exception { + void testInitScript() throws Exception { try (PrestoContainer prestoSql = new PrestoContainer<>(PrestoTestImages.PRESTO_TEST_IMAGE)) { prestoSql.withInitScript("initial.sql"); prestoSql.start(); @@ -105,7 +105,7 @@ public void testInitScript() throws Exception { } @Test - public void testTcJdbcUri() throws Exception { + void testTcJdbcUri() throws Exception { try ( Connection connection = DriverManager.getConnection( String.format("jdbc:tc:presto:%s://hostname/", PrestoContainer.DEFAULT_TAG) 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 index 9c5dd712104..02e5b2a0485 100644 --- a/modules/presto/src/test/java/org/testcontainers/jdbc/presto/PrestoJDBCDriverTest.java +++ b/modules/presto/src/test/java/org/testcontainers/jdbc/presto/PrestoJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.presto; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class PrestoJDBCDriverTest extends AbstractJDBCDriverTest { +class PrestoJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { // diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 665b2473b0a..f2b69777ab2 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -5,9 +5,16 @@ dependencies { api project(':testcontainers-jdbc') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.questdb:questdb:9.0.2' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } + +test { + useJUnitPlatform() +} diff --git a/modules/questdb/src/test/java/org/testcontainers/jdbc/questdb/QuestDBJDBCDriverTest.java b/modules/questdb/src/test/java/org/testcontainers/jdbc/questdb/QuestDBJDBCDriverTest.java index 3144f8bfad3..40612f05680 100644 --- a/modules/questdb/src/test/java/org/testcontainers/jdbc/questdb/QuestDBJDBCDriverTest.java +++ b/modules/questdb/src/test/java/org/testcontainers/jdbc/questdb/QuestDBJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.questdb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class QuestDBJDBCDriverTest extends AbstractJDBCDriverTest { +class QuestDBJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java index f91f17f14b4..aad4df70c2c 100644 --- a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java +++ b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java @@ -6,7 +6,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.QuestDBTestImages; import org.testcontainers.containers.QuestDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -20,12 +20,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -public class SimpleQuestDBTest extends AbstractContainerDatabaseTest { +class SimpleQuestDBTest extends AbstractContainerDatabaseTest { private static final String TABLE_NAME = "mytable"; @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { QuestDBContainer questDB = new QuestDBContainer("questdb/questdb:6.5.3") // } @@ -40,7 +40,7 @@ public void testSimple() throws SQLException { } @Test - public void testRest() throws IOException { + void testRest() throws IOException { try (QuestDBContainer questdb = new QuestDBContainer(QuestDBTestImages.QUESTDB_IMAGE)) { questdb.start(); populateByInfluxLineProtocol(questdb, 1_000); diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 143deb8828e..87c0e927048 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -17,6 +17,7 @@ dependencies { testFixturesImplementation 'io.projectreactor:reactor-core:3.7.9' testFixturesImplementation 'org.assertj:assertj-core:3.27.4' + testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' } test { diff --git a/modules/r2dbc/src/testFixtures/java/org/testcontainers/r2dbc/AbstractR2DBCDatabaseContainerTest.java b/modules/r2dbc/src/testFixtures/java/org/testcontainers/r2dbc/AbstractR2DBCDatabaseContainerTest.java index ca06e22d631..ed0a7fba70f 100644 --- a/modules/r2dbc/src/testFixtures/java/org/testcontainers/r2dbc/AbstractR2DBCDatabaseContainerTest.java +++ b/modules/r2dbc/src/testFixtures/java/org/testcontainers/r2dbc/AbstractR2DBCDatabaseContainerTest.java @@ -6,7 +6,7 @@ import io.r2dbc.spi.ConnectionFactory; import io.r2dbc.spi.ConnectionFactoryMetadata; import io.r2dbc.spi.ConnectionFactoryOptions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -28,7 +28,7 @@ protected String createTestQuery(int result) { } @Test - public final void testGetOptions() { + void testGetOptions() { try (T container = createContainer()) { container.start(); @@ -38,13 +38,13 @@ public final void testGetOptions() { } @Test - public final void testUrlSupport() { + void testUrlSupport() { ConnectionFactory connectionFactory = ConnectionFactories.get(createR2DBCUrl()); runTestQuery(connectionFactory); } @Test - public final void testGetMetadata() { + void testGetMetadata() { ConnectionFactory connectionFactory = ConnectionFactories.get(createR2DBCUrl()); ConnectionFactoryMetadata metadata = connectionFactory.getMetadata(); assertThat(metadata).isNotNull(); diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 47dd9d01027..61d21063af0 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -3,8 +3,15 @@ description = "Testcontainers :: JDBC :: TiDB" dependencies { api project(':testcontainers-jdbc') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' compileOnly 'org.jetbrains:annotations:26.0.2' } + +test { + useJUnitPlatform() +} diff --git a/modules/tidb/src/test/java/org/testcontainers/jdbc/tidb/TiDBJDBCDriverTest.java b/modules/tidb/src/test/java/org/testcontainers/jdbc/tidb/TiDBJDBCDriverTest.java index 566850fa629..4b3d60a013c 100644 --- a/modules/tidb/src/test/java/org/testcontainers/jdbc/tidb/TiDBJDBCDriverTest.java +++ b/modules/tidb/src/test/java/org/testcontainers/jdbc/tidb/TiDBJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.tidb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) public class TiDBJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { { "jdbc:tc:tidb://hostname/databasename", EnumSet.noneOf(Options.class) } } diff --git a/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java b/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java index c010e4298fe..9323e7d21ac 100644 --- a/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java +++ b/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.tidb; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TiDBTestImages; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.tidb.TiDBContainer; @@ -10,10 +10,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SimpleTiDBTest extends AbstractContainerDatabaseTest { +class SimpleTiDBTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { TiDBContainer tidb = new TiDBContainer("pingcap/tidb:v6.1.0") // } @@ -29,7 +29,7 @@ public void testSimple() throws SQLException { } @Test - public void testExplicitInitScript() throws SQLException { + void testExplicitInitScript() throws SQLException { try ( TiDBContainer tidb = new TiDBContainer(TiDBTestImages.TIDB_IMAGE).withInitScript("somepath/init_tidb.sql") ) { // TiDB is expected to be compatible with MySQL @@ -43,7 +43,7 @@ public void testExplicitInitScript() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { TiDBContainer tidb = new TiDBContainer(TiDBTestImages.TIDB_IMAGE).withUrlParam("sslmode", "disable"); try { diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index 5816772e300..681efb5cf7a 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -4,7 +4,14 @@ dependencies { api project(':testcontainers') api project(':testcontainers-jdbc') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.10' testImplementation 'org.assertj:assertj-core:3.27.4' } + +test { + useJUnitPlatform() +} diff --git a/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java b/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java index 3f3a7ac8136..1427f33e5a4 100644 --- a/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java +++ b/modules/timeplus/src/test/java/org/testcontainers/junit/timeplus/TimeplusJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.junit.timeplus; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class TimeplusJDBCDriverTest extends AbstractJDBCDriverTest { +class TimeplusJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { { "jdbc:tc:timeplus:2.3.21://hostname", EnumSet.noneOf(Options.class) } } diff --git a/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java b/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java index 5e00f945555..7ab38c03f87 100644 --- a/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java +++ b/modules/timeplus/src/test/java/org/testcontainers/timeplus/TimeplusContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.timeplus; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TimeplusImages; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TimeplusContainerTest extends AbstractContainerDatabaseTest { +class TimeplusContainerTest extends AbstractContainerDatabaseTest { @Test - public void testSimple() throws SQLException { + void testSimple() throws SQLException { try ( // container { TimeplusContainer timeplus = new TimeplusContainer("timeplus/timeplusd:2.3.21") // } @@ -27,7 +27,7 @@ public void testSimple() throws SQLException { } @Test - public void customCredentialsWithUrlParams() throws SQLException { + void customCredentialsWithUrlParams() throws SQLException { try ( TimeplusContainer timeplus = new TimeplusContainer(TimeplusImages.TIMEPLUS_IMAGE) .withUsername("system") diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 08e3c0c2982..04c5ffb73b7 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -3,7 +3,14 @@ description = "Testcontainers :: JDBC :: Trino" dependencies { api project(':testcontainers-jdbc') + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.trino:trino-jdbc:476' compileOnly 'org.jetbrains:annotations:26.0.2' } + +test { + useJUnitPlatform() +} diff --git a/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java b/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java index ea25f39dbef..a12df1bcda7 100644 --- a/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java +++ b/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TrinoTestImages; import java.sql.Connection; @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TrinoContainerTest { +class TrinoContainerTest { @Test - public void testSimple() throws Exception { + void testSimple() throws Exception { try ( // container { TrinoContainer trino = new TrinoContainer("trinodb/trino:352") // } @@ -33,7 +33,7 @@ public void testSimple() throws Exception { } @Test - public void testSpecificVersion() throws Exception { + void testSpecificVersion() throws Exception { try (TrinoContainer trino = new TrinoContainer(TrinoTestImages.TRINO_PREVIOUS_VERSION_TEST_IMAGE)) { trino.start(); try ( @@ -50,7 +50,7 @@ public void testSpecificVersion() throws Exception { } @Test - public void testInitScript() throws Exception { + void testInitScript() throws Exception { try (TrinoContainer trino = new TrinoContainer(TrinoTestImages.TRINO_TEST_IMAGE)) { trino.withInitScript("initial.sql"); trino.start(); diff --git a/modules/trino/src/test/java/org/testcontainers/jdbc/trino/TrinoJDBCDriverTest.java b/modules/trino/src/test/java/org/testcontainers/jdbc/trino/TrinoJDBCDriverTest.java index 9ec98c2e6d7..7674d1bc459 100644 --- a/modules/trino/src/test/java/org/testcontainers/jdbc/trino/TrinoJDBCDriverTest.java +++ b/modules/trino/src/test/java/org/testcontainers/jdbc/trino/TrinoJDBCDriverTest.java @@ -1,16 +1,12 @@ package org.testcontainers.jdbc.trino; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; import java.util.EnumSet; -@RunWith(Parameterized.class) -public class TrinoJDBCDriverTest extends AbstractJDBCDriverTest { +class TrinoJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { // diff --git a/modules/yugabytedb/build.gradle b/modules/yugabytedb/build.gradle index d81dd3e0648..b867b42a603 100644 --- a/modules/yugabytedb/build.gradle +++ b/modules/yugabytedb/build.gradle @@ -2,9 +2,17 @@ description = "Testcontainers :: JDBC :: YugabyteDB" dependencies { api project(':testcontainers-jdbc') + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') // YCQL driver testImplementation 'com.yugabyte:java-driver-core:4.19.0-yb-1' // YSQL driver testRuntimeOnly 'com.yugabyte:jdbc-yugabytedb:42.7.3-yb-4' } + +test { + useJUnitPlatform() +} diff --git a/modules/yugabytedb/src/test/java/org/testcontainers/jdbc/yugabytedb/YugabyteDBYSQLJDBCDriverTest.java b/modules/yugabytedb/src/test/java/org/testcontainers/jdbc/yugabytedb/YugabyteDBYSQLJDBCDriverTest.java index a7ecab34aba..37129e8f899 100644 --- a/modules/yugabytedb/src/test/java/org/testcontainers/jdbc/yugabytedb/YugabyteDBYSQLJDBCDriverTest.java +++ b/modules/yugabytedb/src/test/java/org/testcontainers/jdbc/yugabytedb/YugabyteDBYSQLJDBCDriverTest.java @@ -1,7 +1,5 @@ package org.testcontainers.jdbc.yugabytedb; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; import org.testcontainers.jdbc.AbstractJDBCDriverTest; import java.util.Arrays; @@ -10,10 +8,8 @@ /** * YugabyteDB YSQL API JDBC connectivity driver test class */ -@RunWith(Parameterized.class) -public class YugabyteDBYSQLJDBCDriverTest extends AbstractJDBCDriverTest { +class YugabyteDBYSQLJDBCDriverTest extends AbstractJDBCDriverTest { - @Parameterized.Parameters(name = "{index} - {0}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java index bf8ec2be1ea..24e6b2c24dd 100644 --- a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java +++ b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYCQLTest.java @@ -2,7 +2,7 @@ import com.datastax.oss.driver.api.core.CqlSession; import com.datastax.oss.driver.api.core.cql.ResultSet; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.YugabyteDBYCQLContainer; import org.testcontainers.utility.DockerImageName; @@ -11,7 +11,7 @@ /** * YugabyteDB YCQL API unit test class */ -public class YugabyteDBYCQLTest { +class YugabyteDBYCQLTest { private static final String IMAGE_NAME = "yugabytedb/yugabyte:2.14.4.0-b26"; @@ -20,7 +20,7 @@ public class YugabyteDBYCQLTest { private static final DockerImageName YBDB_TEST_IMAGE = DockerImageName.parse(IMAGE_NAME); @Test - public void testSmoke() { + void testSmoke() { try ( // creatingYCQLContainer { final YugabyteDBYCQLContainer ycqlContainer = new YugabyteDBYCQLContainer( @@ -38,7 +38,7 @@ public void testSmoke() { } @Test - public void testCustomKeyspace() { + void testCustomKeyspace() { String key = "random"; try ( final YugabyteDBYCQLContainer ycqlContainer = new YugabyteDBYCQLContainer(YBDB_TEST_IMAGE) @@ -61,7 +61,7 @@ public void testCustomKeyspace() { } @Test - public void testAuthenticationEnabled() { + void testAuthenticationEnabled() { String role = "random"; try ( final YugabyteDBYCQLContainer ycqlContainer = new YugabyteDBYCQLContainer(YBDB_TEST_IMAGE) @@ -80,7 +80,7 @@ public void testAuthenticationEnabled() { } @Test - public void testAuthenticationDisabled() { + void testAuthenticationDisabled() { try ( final YugabyteDBYCQLContainer ycqlContainer = new YugabyteDBYCQLContainer(YBDB_TEST_IMAGE) .withPassword("cassandra") @@ -94,7 +94,7 @@ public void testAuthenticationDisabled() { } @Test - public void testInitScript() { + void testInitScript() { String key = "random"; try ( final YugabyteDBYCQLContainer ycqlContainer = new YugabyteDBYCQLContainer(YBDB_TEST_IMAGE) @@ -111,7 +111,7 @@ public void testInitScript() { } @Test - public void shouldStartWhenContainerIpIsUsedInWaitStrategy() { + void shouldStartWhenContainerIpIsUsedInWaitStrategy() { try ( final YugabyteDBYCQLContainer ycqlContainer = new YugabyteDBYCQLContainer(IMAGE_NAME_2_18) .withUsername("cassandra") diff --git a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java index 47a36f4f784..04d1448cfba 100644 --- a/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java +++ b/modules/yugabytedb/src/test/java/org/testcontainers/junit/yugabytedb/YugabyteDBYSQLTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit.yugabytedb; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.YugabyteDBYSQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.utility.DockerImageName; @@ -12,14 +12,14 @@ /** * YugabyteDB YSQL API unit test class */ -public class YugabyteDBYSQLTest extends AbstractContainerDatabaseTest { +class YugabyteDBYSQLTest extends AbstractContainerDatabaseTest { private static final String IMAGE_NAME = "yugabytedb/yugabyte:2.14.4.0-b26"; private static final DockerImageName YBDB_TEST_IMAGE = DockerImageName.parse(IMAGE_NAME); @Test - public void testSmoke() throws SQLException { + void testSmoke() throws SQLException { try ( // creatingYSQLContainer { final YugabyteDBYSQLContainer ysqlContainer = new YugabyteDBYSQLContainer( @@ -35,7 +35,7 @@ public void testSmoke() throws SQLException { } @Test - public void testCustomDatabase() throws SQLException { + void testCustomDatabase() throws SQLException { String key = "random"; try ( final YugabyteDBYSQLContainer ysqlContainer = new YugabyteDBYSQLContainer(YBDB_TEST_IMAGE) @@ -49,7 +49,7 @@ public void testCustomDatabase() throws SQLException { } @Test - public void testInitScript() throws SQLException { + void testInitScript() throws SQLException { try ( final YugabyteDBYSQLContainer ysqlContainer = new YugabyteDBYSQLContainer(YBDB_TEST_IMAGE) .withInitScript("init/init_yql.sql") @@ -62,7 +62,7 @@ public void testInitScript() throws SQLException { } @Test - public void testWithAdditionalUrlParamInJdbcUrl() { + void testWithAdditionalUrlParamInJdbcUrl() { try ( final YugabyteDBYSQLContainer ysqlContainer = new YugabyteDBYSQLContainer(YBDB_TEST_IMAGE) .withUrlParam("sslmode", "disable") @@ -80,7 +80,7 @@ public void testWithAdditionalUrlParamInJdbcUrl() { } @Test - public void testWithCustomRole() throws SQLException { + void testWithCustomRole() throws SQLException { try ( final YugabyteDBYSQLContainer ysqlContainer = new YugabyteDBYSQLContainer(YBDB_TEST_IMAGE) .withDatabaseName("yugabyte") @@ -95,7 +95,7 @@ public void testWithCustomRole() throws SQLException { } @Test - public void testWaitStrategy() throws SQLException { + void testWaitStrategy() throws SQLException { try (final YugabyteDBYSQLContainer ysqlContainer = new YugabyteDBYSQLContainer(YBDB_TEST_IMAGE)) { ysqlContainer.start(); assertThat(performQuery(ysqlContainer, "SELECT 1").getInt(1)) From 3c41660cdff0426719ea1f2d13ba55b2f16580a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 22:03:12 +0000 Subject: [PATCH 0819/1224] Bump com.gradle:common-custom-user-data-gradle-plugin from 2.3 to 2.4.0 Bumps [com.gradle:common-custom-user-data-gradle-plugin](https://github.com/gradle/common-custom-user-data-gradle-plugin) from 2.3 to 2.4.0. - [Release notes](https://github.com/gradle/common-custom-user-data-gradle-plugin/releases) - [Commits](https://github.com/gradle/common-custom-user-data-gradle-plugin/compare/v2.3...v2.4.0) --- updated-dependencies: - dependency-name: com.gradle:common-custom-user-data-gradle-plugin dependency-version: 2.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 2076cb71c86..0d13ebcc3fe 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.19.2" - classpath "com.gradle:common-custom-user-data-gradle-plugin:2.3" + classpath "com.gradle:common-custom-user-data-gradle-plugin:2.4.0" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } } From 15f3c0da97deef1e08593fa40a906873faebd84a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 22 Sep 2025 15:36:40 -0600 Subject: [PATCH 0820/1224] Skip databend module in CI (#10793) --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 66b364c6bfa..b0d4721fd12 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -98,7 +98,7 @@ jobs: # we should not push empty results to the cache READ_ONLY_REMOTE_GRADLE_CACHE: true run: | - TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'del(.[] | select(. == ":testcontainers:check" or startswith(":docs:")))' --compact-output) + TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'del(.[] | select(. == ":testcontainers-databend:check" or . == ":testcontainers:check" or startswith(":docs:")))' --compact-output) echo $TASKS echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT check: From 851f8ffa3dc98ff10143156ca788893f32d51f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 23 Sep 2025 16:28:31 -0600 Subject: [PATCH 0821/1224] Update spring boot version to 3.5.6 in selenium example (#10797) --- examples/selenium-container/build.gradle | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/selenium-container/build.gradle b/examples/selenium-container/build.gradle index f2234e604e6..f1a8058e304 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.7.18' + id 'org.springframework.boot' version '3.5.6' } apply plugin: 'io.spring.dependency-management' @@ -17,7 +17,6 @@ dependencies { testImplementation 'org.testcontainers:testcontainers-selenium' testImplementation 'org.testcontainers:testcontainers-junit-jupiter' testImplementation 'org.assertj:assertj-core:3.27.4' - testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.8.2" } test { From d42e9d70393c4c01d7a9435f0942aad80c334140 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 22:29:40 +0000 Subject: [PATCH 0822/1224] Bump com.github.docker-java:docker-java-bom from 3.5.3 to 3.6.0 in /core Bumps [com.github.docker-java:docker-java-bom](https://github.com/docker-java/docker-java) from 3.5.3 to 3.6.0. - [Release notes](https://github.com/docker-java/docker-java/releases) - [Changelog](https://github.com/docker-java/docker-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/docker-java/docker-java/compare/3.5.3...3.6.0) --- updated-dependencies: - dependency-name: com.github.docker-java:docker-java-bom dependency-version: 3.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 9b94f587a79..14bac3806fa 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -87,8 +87,8 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - api platform('com.github.docker-java:docker-java-bom:3.5.3') - shaded platform('com.github.docker-java:docker-java-bom:3.5.3') + api platform('com.github.docker-java:docker-java-bom:3.6.0') + shaded platform('com.github.docker-java:docker-java-bom:3.6.0') api "com.github.docker-java:docker-java-api" From d3721efef7c35b2f196e727ba581c7436f69bfdf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 23:12:44 +0000 Subject: [PATCH 0823/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /core Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/commits) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 9b94f587a79..0b6077c30f8 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -70,8 +70,8 @@ configurations.all { dependencies { api 'junit:junit:4.13.2' api 'org.slf4j:slf4j-api:1.7.36' - compileOnly 'org.jetbrains:annotations:26.0.2' - testCompileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' + testCompileOnly 'org.jetbrains:annotations:26.0.2-1' api 'org.apache.commons:commons-compress:1.24.0' api ('org.rnorth.duct-tape:duct-tape:1.0.8') { exclude(group: 'org.jetbrains', module: 'annotations') From e1354258c1c0c90f42d9687e8e69c7a30da6a6e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Sep 2025 23:13:08 +0000 Subject: [PATCH 0824/1224] Bump org.yaml:snakeyaml from 2.4 to 2.5 in /core Bumps [org.yaml:snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 2.4 to 2.5. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-2.5..snakeyaml-2.4) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-version: '2.5' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 9b94f587a79..4cbbd8373c2 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -99,7 +99,7 @@ dependencies { api 'com.github.docker-java:docker-java-transport-zerodep' shaded 'com.google.guava:guava:33.3.1-jre' - shaded "org.yaml:snakeyaml:2.4" + shaded "org.yaml:snakeyaml:2.5" shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2' From 284a1ea7576ad44a3773cfa60a96701169cfac34 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 01:01:59 +0000 Subject: [PATCH 0825/1224] Bump redis.clients:jedis from 6.1.0 to 6.2.0 in /core Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 1b0ef50a729..83fad3fac80 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -109,7 +109,7 @@ dependencies { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'redis.clients:jedis:6.1.0' + testImplementation 'redis.clients:jedis:6.2.0' testImplementation 'com.rabbitmq:amqp-client:5.26.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' From 2ba03ecfa4054e38ee666dc1b2107da30ce6d9f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 01:02:09 +0000 Subject: [PATCH 0826/1224] Bump org.assertj:assertj-core from 3.27.4 to 3.27.6 in /core Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.4 to 3.27.6. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.4...assertj-build-3.27.6) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 1b0ef50a729..f53781ce029 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -119,13 +119,13 @@ dependencies { // Synthetic JAR used for MountableFileTest and DirectoryTarResourceTest testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') - testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation 'org.assertj:assertj-core:3.27.6' testImplementation 'io.rest-assured:rest-assured:5.5.6' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" jarFileTestImplementation 'junit:junit:4.13.2' - jarFileTestImplementation 'org.assertj:assertj-core:3.27.4' + jarFileTestImplementation 'org.assertj:assertj-core:3.27.6' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' } From dee4d4bb11c62854b0a6a3a0db5a92668e584381 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 01:05:40 +0000 Subject: [PATCH 0827/1224] Bump org.apache.commons:commons-compress from 1.24.0 to 1.28.0 in /core Bumps [org.apache.commons:commons-compress](https://github.com/apache/commons-compress) from 1.24.0 to 1.28.0. - [Changelog](https://github.com/apache/commons-compress/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-compress/compare/rel/commons-compress-1.24.0...rel/commons-compress-1.28.0) --- updated-dependencies: - dependency-name: org.apache.commons:commons-compress dependency-version: 1.28.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 1b0ef50a729..5349681f200 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -72,7 +72,7 @@ dependencies { api 'org.slf4j:slf4j-api:1.7.36' compileOnly 'org.jetbrains:annotations:26.0.2-1' testCompileOnly 'org.jetbrains:annotations:26.0.2-1' - api 'org.apache.commons:commons-compress:1.24.0' + api 'org.apache.commons:commons-compress:1.28.0' api ('org.rnorth.duct-tape:duct-tape:1.0.8') { exclude(group: 'org.jetbrains', module: 'annotations') } From c81554bb137770da5af76ba6da382b3132cf61b1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Sep 2025 01:05:45 +0000 Subject: [PATCH 0828/1224] Bump io.grpc:grpc-bom from 1.73.0 to 1.74.0 in /modules/qdrant Bumps [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) from 1.73.0 to 1.74.0. - [Release notes](https://github.com/grpc/grpc-java/releases) - [Commits](https://github.com/grpc/grpc-java/compare/v1.73.0...v1.74.0) --- updated-dependencies: - dependency-name: io.grpc:grpc-bom dependency-version: 1.74.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 4148f09d50a..304d76f9251 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.qdrant:client:1.15.0' - testImplementation platform('io.grpc:grpc-bom:1.73.0') + testImplementation platform('io.grpc:grpc-bom:1.75.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' testImplementation 'io.grpc:grpc-netty-shaded' From 9654cf1c4743447750c1686b9cceec6f9f2f3075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 23 Sep 2025 20:57:56 -0600 Subject: [PATCH 0829/1224] Replace deprecated XmlSlurper with groovy.xml.XmlSlurper (#10801) --- .../testcontainers/build/ComparePOMWithLatestReleasedTask.groovy | 1 + 1 file changed, 1 insertion(+) diff --git a/buildSrc/src/main/groovy/org/testcontainers/build/ComparePOMWithLatestReleasedTask.groovy b/buildSrc/src/main/groovy/org/testcontainers/build/ComparePOMWithLatestReleasedTask.groovy index 1bb71ca8f52..287f934c1e7 100644 --- a/buildSrc/src/main/groovy/org/testcontainers/build/ComparePOMWithLatestReleasedTask.groovy +++ b/buildSrc/src/main/groovy/org/testcontainers/build/ComparePOMWithLatestReleasedTask.groovy @@ -1,5 +1,6 @@ package org.testcontainers.build +import groovy.xml.XmlSlurper import org.gradle.api.DefaultTask import org.gradle.api.tasks.Input import org.gradle.api.tasks.TaskAction From 2a57f383266f1b976a507ff837940eba8176dbf6 Mon Sep 17 00:00:00 2001 From: Vladimir Sitnikov Date: Wed, 24 Sep 2025 21:04:11 +0300 Subject: [PATCH 0830/1224] Move Toxiproxy tests to JUnit Jupiter (#10757) --- modules/toxiproxy/build.gradle | 7 +++++++ .../containers/ToxiproxyTest.java | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index f97193c730a..6fe7062a045 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -6,6 +6,9 @@ dependencies { testImplementation 'redis.clients:jedis:6.1.0' testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation platform('org.junit:junit-bom:5.13.4') + testImplementation 'org.junit.jupiter:junit-jupiter' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.japicmp { @@ -13,3 +16,7 @@ tasks.japicmp { "org.testcontainers.containers.ToxiproxyContainer" ] } + +tasks.withType(Test).configureEach { + useJUnitPlatform() +} 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 bb941640055..1e35c2d7206 100644 --- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java +++ b/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java @@ -3,8 +3,9 @@ import eu.rekawek.toxiproxy.Proxy; import eu.rekawek.toxiproxy.ToxiproxyClient; import eu.rekawek.toxiproxy.model.ToxicDirection; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisConnectionException; @@ -22,23 +23,29 @@ public class ToxiproxyTest { // spotless:off // creatingProxy { // Create a common docker network so that containers can communicate - @Rule + @AutoClose public Network network = Network.newNetwork(); // The target container - this could be anything - @Rule + @AutoClose public GenericContainer redis = new GenericContainer<>("redis:6-alpine") .withExposedPorts(6379) .withNetwork(network) .withNetworkAliases("redis"); // Toxiproxy container, which will be used as a TCP proxy - @Rule + @AutoClose public ToxiproxyContainer toxiproxy = new ToxiproxyContainer("ghcr.io/shopify/toxiproxy:2.5.0") .withNetwork(network); // } // spotless:on + @BeforeEach + public void setUp() { + redis.start(); + toxiproxy.start(); + } + @Test public void testDirect() { final Jedis jedis = createJedis(redis.getHost(), redis.getFirstMappedPort()); From 7209ff67f85fa7ef80f3e2e7f9c08db57769fe1d Mon Sep 17 00:00:00 2001 From: Eliassen-Steinar Date: Wed, 24 Sep 2025 21:33:18 +0200 Subject: [PATCH 0831/1224] Expose gRPC endpoint from BigQueryEmulator (#10779) --- .../containers/BigQueryEmulatorContainer.java | 4 + .../BigQueryEmulatorContainerTest.java | 152 +++++++++++++++++- 2 files changed, 155 insertions(+), 1 deletion(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java index 6c305a50537..6831785b0a5 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java @@ -33,6 +33,10 @@ public String getEmulatorHttpEndpoint() { return String.format("http://%s:%d", getHost(), getMappedPort(HTTP_PORT)); } + public Integer getEmulatorGrpcPort() { + return getMappedPort(GRPC_PORT); + } + public String getProjectId() { return PROJECT_ID; } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java index 7f06a67c26c..0337cd563b9 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java @@ -1,11 +1,39 @@ package org.testcontainers.containers; +import com.google.api.core.ApiFuture; +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.rpc.FixedTransportChannelProvider; import com.google.cloud.NoCredentials; import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQueryOptions; +import com.google.cloud.bigquery.DatasetId; +import com.google.cloud.bigquery.DatasetInfo; +import com.google.cloud.bigquery.Field; import com.google.cloud.bigquery.QueryJobConfiguration; +import com.google.cloud.bigquery.Schema; +import com.google.cloud.bigquery.StandardSQLTypeName; +import com.google.cloud.bigquery.StandardTableDefinition; +import com.google.cloud.bigquery.TableDefinition; +import com.google.cloud.bigquery.TableId; +import com.google.cloud.bigquery.TableInfo; import com.google.cloud.bigquery.TableResult; +import com.google.cloud.bigquery.storage.v1.AppendRowsResponse; +import com.google.cloud.bigquery.storage.v1.BatchCommitWriteStreamsRequest; +import com.google.cloud.bigquery.storage.v1.BatchCommitWriteStreamsResponse; +import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient; +import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings; +import com.google.cloud.bigquery.storage.v1.CreateWriteStreamRequest; +import com.google.cloud.bigquery.storage.v1.FinalizeWriteStreamRequest; +import com.google.cloud.bigquery.storage.v1.FinalizeWriteStreamResponse; +import com.google.cloud.bigquery.storage.v1.JsonStreamWriter; +import com.google.cloud.bigquery.storage.v1.TableName; +import com.google.cloud.bigquery.storage.v1.WriteStream; +import io.grpc.ManagedChannelBuilder; +import org.json.JSONArray; +import org.json.JSONObject; import org.junit.jupiter.api.Test; +import org.threeten.bp.Duration; import java.math.BigDecimal; import java.util.List; @@ -16,7 +44,7 @@ class BigQueryEmulatorContainerTest { @Test - void test() throws Exception { + void testHttpEndpoint() throws Exception { try ( // emulatorContainer { BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3") @@ -51,4 +79,126 @@ void test() throws Exception { assertThat(values).containsOnly(BigDecimal.valueOf(30)); } } + + @Test + void testGrcpEndpoint() throws Exception { + try ( + BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.6.5") + ) { + container.start(); + + BigQuery bigQuery = getBigQuery(container); + String tableName = "test-table"; + String datasetName = "test-dataset"; + + bigQuery.create(DatasetInfo.of(DatasetId.of(container.getProjectId(), datasetName))); + + Schema schema = Schema.of(Field.of("name", StandardSQLTypeName.STRING)); + + TableId tableId = TableId.of(datasetName, tableName); + TableDefinition tableDefinition = StandardTableDefinition.of(schema); + TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build(); + + bigQuery.create(tableInfo); + + BigQueryWriteSettings.Builder bigQueryWriteSettingsBuilder = BigQueryWriteSettings.newBuilder(); + + bigQueryWriteSettingsBuilder + .createWriteStreamSettings() + .setRetrySettings( + bigQueryWriteSettingsBuilder + .createWriteStreamSettings() + .getRetrySettings() + .toBuilder() + .setTotalTimeout(Duration.ofSeconds(60)) + .build() + ); + + BigQueryWriteClient bigQueryWriteClient = BigQueryWriteClient.create( + bigQueryWriteSettingsBuilder + .setTransportChannelProvider( + FixedTransportChannelProvider.create( + GrpcTransportChannel.create( + ManagedChannelBuilder + .forAddress(container.getHost(), container.getEmulatorGrpcPort()) + .usePlaintext() + .build() + ) + ) + ) + .setCredentialsProvider(NoCredentialsProvider.create()) + .build() + ); + + TableName parentTable = TableName.of(container.getProjectId(), datasetName, tableName); + CreateWriteStreamRequest createWriteStreamRequest = CreateWriteStreamRequest + .newBuilder() + .setParent(parentTable.toString()) + .setWriteStream(WriteStream.newBuilder().setType(WriteStream.Type.PENDING)) + .build(); + + WriteStream writeStream = bigQueryWriteClient.createWriteStream(createWriteStreamRequest); + + JsonStreamWriter writer = JsonStreamWriter + .newBuilder(writeStream.getName(), writeStream.getTableSchema(), bigQueryWriteClient) + .build(); + + JSONArray jsonArray = new JSONArray(); + JSONObject record1 = new JSONObject(); + record1.put("name", "Alice"); + jsonArray.put(record1); + + JSONObject record2 = new JSONObject(); + record2.put("name", "Bob"); + jsonArray.put(record2); + + ApiFuture future = writer.append(jsonArray); + AppendRowsResponse response = future.get(); + + FinalizeWriteStreamRequest finalizeRequest = FinalizeWriteStreamRequest + .newBuilder() + .setName(writeStream.getName()) + .build(); + FinalizeWriteStreamResponse finalizeResponse = bigQueryWriteClient.finalizeWriteStream(finalizeRequest); + + BatchCommitWriteStreamsRequest commitRequest = BatchCommitWriteStreamsRequest + .newBuilder() + .setParent(parentTable.toString()) + .addWriteStreams(writeStream.getName()) + .build(); + BatchCommitWriteStreamsResponse commitResponse = bigQueryWriteClient.batchCommitWriteStreams(commitRequest); + + writer.close(); + + String sql = String.format( + "SELECT name FROM `%s.%s.%s` ORDER BY name", + container.getProjectId(), + datasetName, + tableName + ); + TableResult result = bigQuery.query(QueryJobConfiguration.newBuilder(sql).build()); + + List names = result + .streamValues() + .map(row -> row.get("name").getStringValue()) + .collect(Collectors.toList()); + + assertThat(names).containsExactly("Alice", "Bob"); + + bigQueryWriteClient.shutdown(); + bigQueryWriteClient.close(); + } + } + + private BigQuery getBigQuery(BigQueryEmulatorContainer container) { + String url = container.getEmulatorHttpEndpoint(); + return BigQueryOptions + .newBuilder() + .setProjectId(container.getProjectId()) + .setHost(url) + .setLocation(url) + .setCredentials(NoCredentials.getInstance()) + .build() + .getService(); + } } From c5e48b9835979815388db9616e00683eca903b63 Mon Sep 17 00:00:00 2001 From: Gasan Guseinov <465806+gusega@users.noreply.github.com> Date: Wed, 24 Sep 2025 22:07:20 +0200 Subject: [PATCH 0832/1224] Fix javadoc ConfluentKafkaContainer.java (#10714) --- .../org/testcontainers/kafka/ConfluentKafkaContainer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java index 42942cdd3a5..abbd2bfd908 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java @@ -87,8 +87,8 @@ protected void containerIsStarting(InspectContainerResponse containerInfo) { *

    * Default advertised listeners: *

      - *
    • {@code container.getConfig().getHostName():9092}
    • - *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    • {@code container.getHost():container.getMappedPort(9092)}
    • + *
    • {@code containerInfo.getConfig().getHostName():9093}
    • *
    * @param listener a listener with format {@code host:port} * @return this {@link ConfluentKafkaContainer} instance @@ -118,8 +118,8 @@ public ConfluentKafkaContainer withListener(String listener) { *

    * Default advertised listeners: *

      - *
    • {@code container.getConfig().getHostName():9092}
    • - *
    • {@code container.getHost():container.getMappedPort(9093)}
    • + *
    • {@code container.getHost():container.getMappedPort(9092)}
    • + *
    • {@code containerInfo.getConfig().getHostName():9093}
    • *
    * @param listener a supplier that will provide a listener * @param advertisedListener a supplier that will provide a listener From 7369dd9605e2faa7edc77917b9e9fe7b41b117e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 24 Sep 2025 15:34:39 -0600 Subject: [PATCH 0833/1224] Move Testcontainers tests to JUnit Jupiter (#10803) --- core/build.gradle | 20 ++- .../testcontainers/JarFileShadingTest.java | 10 +- .../testcontainers/PublicBinaryAPITest.java | 41 +++--- .../OutOfPackageImagePullPolicyTest.java | 6 +- .../java/org/testcontainers/DaemonTest.java | 6 +- .../DockerClientFactoryTest.java | 18 ++- .../ComposeContainerWithServicesTest.java | 22 +-- .../containers/ComposeOverridesTest.java | 32 +---- .../containers/ComposeProfilesOptionTest.java | 24 +--- .../containers/ContainerStateTest.java | 23 +--- ...ockerComposeContainerWithServicesTest.java | 22 +-- .../containers/DockerComposeFilesTest.java | 8 +- .../DockerComposeOverridesTest.java | 32 +---- .../DockerComposeProfilesOptionTest.java | 20 +-- .../DockerMcpGatewayContainerTest.java | 8 +- .../DockerModelRunnerContainerTest.java | 8 +- .../containers/ExposedHostTest.java | 28 ++-- .../FailureDetectingExternalResourceTest.java | 6 +- .../containers/GenericContainerTest.java | 32 ++--- .../testcontainers/containers/JibTest.java | 10 +- .../containers/MultiStageBuildTest.java | 8 +- .../containers/NetworkTest.java | 31 ++--- ...ParsedDockerComposeFileValidationTest.java | 36 ++--- .../containers/ReusabilityUnitTests.java | 96 ++++++------- .../containers/output/ContainerLogsTest.java | 18 +-- .../FrameConsumerResultCallbackTest.java | 28 ++-- .../output/ToStringConsumerTest.java | 16 ++- .../IsRunningStartupCheckStrategyTest.java | 14 +- .../ExternalPortListeningCheckTest.java | 18 +-- ...InternalCommandPortListeningCheckTest.java | 36 +++-- .../DockerHealthcheckWaitStrategyTest.java | 12 +- .../wait/strategy/WaitAllStrategyTest.java | 24 ++-- .../dockerclient/AmbiguousImagePullTest.java | 10 +- .../DockerClientConfigUtilsTest.java | 18 +-- ...temPropertyClientProviderStrategyTest.java | 29 ++-- .../dockerclient/EventStreamTest.java | 13 +- .../dockerclient/ImagePullTest.java | 20 +-- ...ostPropertyClientProviderStrategyTest.java | 23 +--- .../images/AgeBasedPullPolicyTest.java | 6 +- .../testcontainers/images/ImageDataTest.java | 8 +- .../images/ImagePullPolicyTest.java | 22 +-- .../images/OverrideImagePullPolicyTest.java | 24 ++-- .../images/ParsedDockerfileTest.java | 24 ++-- .../images/RemoteDockerImageTest.java | 19 +-- .../images/builder/DockerfileBuildTest.java | 60 ++++---- .../images/builder/DockerignoreTest.java | 8 +- .../builder/ImageFromDockerfileTest.java | 8 +- .../statement/AbstractStatementTest.java | 15 +- .../statement/KeyValuesStatementTest.java | 19 ++- .../statement/MultiArgsStatementTest.java | 13 +- .../statement/RawStatementTest.java | 11 +- .../SingleArgumentStatementTest.java | 13 +- .../testcontainers/junit/BaseComposeTest.java | 22 +-- .../junit/BaseDockerComposeTest.java | 22 +-- .../junit/ComposeContainerOverrideTest.java | 8 +- .../junit/ComposeContainerPortViaEnvTest.java | 10 +- .../junit/ComposeContainerScalingTest.java | 26 ++-- .../junit/ComposeContainerTest.java | 18 +-- .../ComposeContainerVolumeRemovalTest.java | 35 ++--- .../junit/ComposeContainerWithBuildTest.java | 47 +++---- .../ComposeContainerWithCopyFilesTest.java | 12 +- .../ComposeContainerWithOptionsTest.java | 75 ++++------ .../ComposeContainerWithWaitStrategies.java | 8 +- .../junit/ComposeErrorHandlingTest.java | 6 +- .../junit/ComposePassthroughTest.java | 22 +-- .../junit/ComposeWaitStrategyTest.java | 31 ++--- .../junit/ComposeWithIdentifierTest.java | 10 +- .../junit/ComposeWithNetworkTest.java | 10 +- .../junit/CopyFileToContainerTest.java | 16 +-- .../junit/DependenciesTest.java | 16 +-- .../DockerComposeContainerPortViaEnvTest.java | 10 +- .../DockerComposeContainerScalingTest.java | 23 ++-- .../junit/DockerComposeContainerTest.java | 22 +-- ...ckerComposeContainerVolumeRemovalTest.java | 30 ++-- .../DockerComposeContainerWithBuildTest.java | 47 +++---- ...ckerComposeContainerWithCopyFilesTest.java | 10 +- ...DockerComposeContainerWithOptionsTest.java | 75 ++++------ .../junit/DockerComposeErrorHandlingTest.java | 6 +- .../junit/DockerComposeLocalImageTest.java | 6 +- .../junit/DockerComposeLogConsumerTest.java | 6 +- .../junit/DockerComposePassthroughTest.java | 59 ++++---- .../junit/DockerComposeServiceTest.java | 24 ++-- .../junit/DockerComposeV2FormatTest.java | 10 +- ...ckerComposeV2FormatWithIdentifierTest.java | 10 +- .../junit/DockerComposeV2WithNetworkTest.java | 10 +- .../junit/DockerComposeWaitStrategyTest.java | 31 ++--- .../junit/DockerNetworkModeTest.java | 8 +- .../junit/DockerfileContainerTest.java | 12 +- .../testcontainers/junit/DockerfileTest.java | 12 +- .../junit/ExecInContainerTest.java | 30 ++-- .../junit/FileOperationsTest.java | 60 ++++---- .../junit/FixedHostPortContainerTest.java | 6 +- .../junit/GenericContainerRuleTest.java | 66 ++++----- .../junit/NonExistentImagePullTest.java | 10 +- .../junit/OutputStreamTest.java | 46 +++++-- .../junit/OutputStreamWithTTYTest.java | 28 ++-- .../ParameterizedDockerfileContainerTest.java | 36 ++--- .../junit/WorkingDirectoryTest.java | 12 +- .../strategy/AbstractWaitStrategyTest.java | 4 +- .../strategy/HostPortWaitStrategyTest.java | 29 ++-- .../wait/strategy/HttpWaitStrategyTest.java | 30 ++-- .../strategy/LogMessageWaitStrategyTest.java | 16 +-- .../wait/strategy/ShellStrategyTest.java | 8 +- .../utility/AuthenticatedImagePullTest.java | 20 +-- .../utility/ClasspathScannerTest.java | 16 +-- .../utility/ComparableVersionTest.java | 24 +--- .../DefaultImageNameSubstitutorTest.java | 16 +-- .../utility/DirectoryTarResourceTest.java | 10 +- .../DockerImageNameCompatibilityTest.java | 24 ++-- .../utility/DockerImageNameTest.java | 130 +++++++++--------- .../utility/DockerLoggerFactoryTest.java | 6 +- .../utility/DockerStatusTest.java | 32 ++--- .../utility/FilterRegistryTest.java | 10 +- .../utility/ImageNameSubstitutorTest.java | 34 +++-- .../utility/LazyFutureTest.java | 17 ++- .../utility/LicenseAcceptanceTest.java | 15 +- ...kTestcontainersConfigurationExtension.java | 39 ++++++ .../MockTestcontainersConfigurationRule.java | 39 ------ .../utility/MountableFileTest.java | 26 ++-- .../PrefixingImageNameSubstitutorTest.java | 26 ++-- .../utility/RegistryAuthLocatorTest.java | 39 +++--- .../utility/ResourceReaperTest.java | 8 +- .../utility/TestEnvironmentTest.java | 12 +- .../TestcontainersConfigurationTest.java | 46 +++---- 124 files changed, 1368 insertions(+), 1483 deletions(-) create mode 100644 core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationExtension.java delete mode 100644 core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationRule.java diff --git a/core/build.gradle b/core/build.gradle index ac868c2f928..b4eeae7b0c5 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -30,6 +30,7 @@ shadowJar { } task jarFileTest(type: Test) { + useJUnitPlatform() testClassesDirs = sourceSets.jarFileTest.output.classesDirs classpath = sourceSets.jarFileTest.runtimeClasspath @@ -105,6 +106,9 @@ dependencies { shaded 'org.zeroturnaround:zt-exec:1.12' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation('com.google.cloud.tools:jib-core:0.27.3') { exclude group: 'com.google.guava', module: 'guava' } @@ -124,8 +128,9 @@ dependencies { jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" - jarFileTestImplementation 'junit:junit:4.13.2' - jarFileTestImplementation 'org.assertj:assertj-core:3.27.6' + jarFileTestRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + jarFileTestImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + jarFileTestImplementation 'org.assertj:assertj-core:3.27.4' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' } @@ -135,3 +140,14 @@ tasks.generatePomFileForMavenJavaPublication.finalizedBy( ] } ) + +compileTestJava { + javaCompiler = javaToolchains.compilerFor { + languageVersion = JavaLanguageVersion.of(17) + } + options.release.set(17) +} + +test { + useJUnitPlatform() +} diff --git a/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java b/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java index 6b9ebc32efc..8b6f380f6eb 100644 --- a/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java +++ b/core/src/jarFileTest/java/org/testcontainers/JarFileShadingTest.java @@ -1,7 +1,7 @@ package org.testcontainers; import org.assertj.core.api.ListAssert; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.file.Files; @@ -9,17 +9,17 @@ import static org.assertj.core.api.Assertions.assertThat; -public class JarFileShadingTest extends AbstractJarFileTest { +class JarFileShadingTest extends AbstractJarFileTest { @Test - public void testPackages() throws Exception { + void testPackages() throws Exception { assertThatFileList(root).containsOnly("org", "META-INF"); assertThatFileList(root.resolve("org")).containsOnly("testcontainers"); } @Test - public void testMetaInf() throws Exception { + void testMetaInf() throws Exception { assertThatFileList(root.resolve("META-INF")) .containsOnly( "MANIFEST.MF", @@ -33,7 +33,7 @@ public void testMetaInf() throws Exception { } @Test - public void testMetaInfServices() throws Exception { + void testMetaInfServices() throws Exception { assertThatFileList(root.resolve("META-INF").resolve("services")) .allMatch(it -> it.startsWith("org.testcontainers.")); } diff --git a/core/src/jarFileTest/java/org/testcontainers/PublicBinaryAPITest.java b/core/src/jarFileTest/java/org/testcontainers/PublicBinaryAPITest.java index 77156e77636..6f8a1c46941 100644 --- a/core/src/jarFileTest/java/org/testcontainers/PublicBinaryAPITest.java +++ b/core/src/jarFileTest/java/org/testcontainers/PublicBinaryAPITest.java @@ -2,12 +2,12 @@ import lombok.RequiredArgsConstructor; import org.assertj.core.api.Assertions; -import org.junit.Assume; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.Parameter; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import org.objectweb.asm.ClassReader; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; @@ -30,15 +30,15 @@ /** * This test checks that we don't expose any shaded class in our public API. - * We use {@link Parameterized} runner here to create a test per public class in Testcontainers' JAR file. */ -@RunWith(Parameterized.class) +@ParameterizedClass +@MethodSource("data") @RequiredArgsConstructor public class PublicBinaryAPITest extends AbstractJarFileTest { - private static String SHADED_PACKAGE = "org.testcontainers.shaded."; + private static final String SHADED_PACKAGE = "org.testcontainers.shaded."; - private static String SHADED_PACKAGE_PATH = SHADED_PACKAGE.replaceAll("\\.", "/"); + private static final String SHADED_PACKAGE_PATH = SHADED_PACKAGE.replaceAll("\\.", "/"); static { Assertions.registerFormatterForType(ClassNode.class, it -> it.name); @@ -46,7 +46,6 @@ public class PublicBinaryAPITest extends AbstractJarFileTest { Assertions.registerFormatterForType(MethodNode.class, it -> it.name + it.desc); } - @Parameters(name = "{0}") public static List data() throws Exception { List result = new ArrayList<>(); @@ -85,11 +84,13 @@ public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IO return result; } - private final String fileName; + @Parameter(0) + private String fileName; - private final ClassNode classNode; + @Parameter(1) + private ClassNode classNode; - @Before + @BeforeEach public void setUp() { switch (classNode.name) { // Necessary evil @@ -97,29 +98,29 @@ public void setUp() { case "org/testcontainers/dockerclient/DockerClientProviderStrategy": case "org/testcontainers/dockerclient/WindowsClientProviderStrategy": case "org/testcontainers/utility/DynamicPollInterval": - Assume.assumeTrue(false); + Assumptions.assumeTrue(false); } } @Test - public void testSuperClass() { + void testSuperClass() { assertThat(classNode.superName).doesNotStartWith(SHADED_PACKAGE_PATH); } @Test - public void testInterfaces() { + void testInterfaces() { assertThat(classNode.interfaces).allSatisfy(it -> assertThat(it).doesNotStartWith(SHADED_PACKAGE_PATH)); } @Test - public void testMethodReturnTypes() { + void testMethodReturnTypes() { assertThat(classNode.methods) .filteredOn(it -> (it.access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED)) != 0) .allSatisfy(it -> assertThat(Type.getReturnType(it.desc).getClassName()).doesNotStartWith(SHADED_PACKAGE)); } @Test - public void testMethodArguments() { + void testMethodArguments() { assertThat(classNode.methods) .filteredOn(it -> (it.access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED)) != 0) .allSatisfy(method -> { @@ -130,7 +131,7 @@ public void testMethodArguments() { } @Test - public void testFields() { + void testFields() { assertThat(classNode.fields) .filteredOn(it -> (it.access & (Opcodes.ACC_PUBLIC | Opcodes.ACC_PROTECTED)) != 0) .allSatisfy(it -> assertThat(Type.getType(it.desc).getClassName()).doesNotStartWith(SHADED_PACKAGE)); diff --git a/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java b/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java index 6b7f7044994..5b13d172386 100644 --- a/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java +++ b/core/src/test/java/alt/testcontainers/images/OutOfPackageImagePullPolicyTest.java @@ -1,6 +1,6 @@ package alt.testcontainers.images; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -8,10 +8,10 @@ import org.testcontainers.images.ImageData; import org.testcontainers.utility.DockerImageName; -public class OutOfPackageImagePullPolicyTest { +class OutOfPackageImagePullPolicyTest { @Test - public void shouldSupportCustomPoliciesOutOfTestcontainersPackage() { + void shouldSupportCustomPoliciesOutOfTestcontainersPackage() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withImagePullPolicy( diff --git a/core/src/test/java/org/testcontainers/DaemonTest.java b/core/src/test/java/org/testcontainers/DaemonTest.java index dd35112f781..01f4a1c5475 100644 --- a/core/src/test/java/org/testcontainers/DaemonTest.java +++ b/core/src/test/java/org/testcontainers/DaemonTest.java @@ -1,6 +1,6 @@ package org.testcontainers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import java.io.File; @@ -14,7 +14,7 @@ /** * This test forks a new JVM, otherwise it's not possible to reliably diff the threads */ -public class DaemonTest { +class DaemonTest { public static void main(String[] args) { Thread mainThread = Thread.currentThread(); @@ -46,7 +46,7 @@ public static void main(String[] args) { } @Test - public void testThatAllThreadsAreDaemons() throws Exception { + void testThatAllThreadsAreDaemons() throws Exception { ProcessBuilder processBuilder = new ProcessBuilder( new File(System.getProperty("java.home")).toPath().resolve("bin").resolve("java").toString(), "-ea", diff --git a/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java b/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java index 794bbbc37c9..56c68d4fd5d 100644 --- a/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java +++ b/core/src/test/java/org/testcontainers/DockerClientFactoryTest.java @@ -1,10 +1,10 @@ package org.testcontainers; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.testcontainers.dockerclient.LogToStringContainerCallback; import org.testcontainers.utility.DockerImageName; -import org.testcontainers.utility.MockTestcontainersConfigurationRule; +import org.testcontainers.utility.MockTestcontainersConfigurationExtension; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -12,13 +12,11 @@ /** * Test for {@link DockerClientFactory}. */ -public class DockerClientFactoryTest { - - @Rule - public MockTestcontainersConfigurationRule configurationMock = new MockTestcontainersConfigurationRule(); +@ExtendWith(MockTestcontainersConfigurationExtension.class) +class DockerClientFactoryTest { @Test - public void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() { + void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() { try (DockerRegistryContainer registryContainer = new DockerRegistryContainer()) { registryContainer.start(); DockerImageName imageName = registryContainer.createImage(); @@ -40,14 +38,14 @@ public void runCommandInsideDockerShouldNotFailIfImageDoesNotExistsLocally() { } @Test - public void dockerHostIpAddress() { + void dockerHostIpAddress() { DockerClientFactory instance = new DockerClientFactory(); instance.strategy = null; assertThat(instance.dockerHostIpAddress()).isNotNull(); } @Test - public void failedChecksFailFast() { + void failedChecksFailFast() { DockerClientFactory instance = DockerClientFactory.instance(); assertThat(instance.client()).isNotNull(); assertThat(instance.cachedClientFailure).isNull(); diff --git a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java index 9a73c83981b..6d141ac08f1 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.rnorth.ducttape.TimeoutException; import org.testcontainers.containers.wait.strategy.Wait; @@ -13,7 +13,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class ComposeContainerWithServicesTest { +class ComposeContainerWithServicesTest { public static final File SIMPLE_COMPOSE_FILE = new File( "src/test/resources/compose-scaling-multiple-containers.yml" @@ -28,7 +28,7 @@ public class ComposeContainerWithServicesTest { ); @Test - public void testDesiredSubsetOfServicesAreStarted() { + void testDesiredSubsetOfServicesAreStarted() { try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE).withServices("redis")) { compose.start(); @@ -37,7 +37,7 @@ public void testDesiredSubsetOfServicesAreStarted() { } @Test - public void testDesiredSubsetOfScaledServicesAreStarted() { + void testDesiredSubsetOfScaledServicesAreStarted() { try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE).withScaledService("redis", 2)) { compose.start(); @@ -46,7 +46,7 @@ public void testDesiredSubsetOfScaledServicesAreStarted() { } @Test - public void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { + void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { try ( ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE) .withServices("redis") @@ -59,7 +59,7 @@ public void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { } @Test - public void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { + void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { try ( ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE) .withServices("other") @@ -72,7 +72,7 @@ public void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { } @Test - public void testAllServicesAreStartedIfNotSpecified() { + void testAllServicesAreStartedIfNotSpecified() { try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE)) { compose.start(); @@ -81,7 +81,7 @@ public void testAllServicesAreStartedIfNotSpecified() { } @Test - public void testScaleInComposeFileIsRespected() { + void testScaleInComposeFileIsRespected() { try (ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_INLINE_SCALE)) { compose.start(); @@ -91,7 +91,7 @@ public void testScaleInComposeFileIsRespected() { } @Test - public void testStartupTimeoutSetsTheHighestTimeout() { + void testStartupTimeoutSetsTheHighestTimeout() { assertThat( catchThrowable(() -> { try ( @@ -113,7 +113,7 @@ public void testStartupTimeoutSetsTheHighestTimeout() { } @Test - public void testWaitingForHealthcheck() { + void testWaitingForHealthcheck() { try ( ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) @@ -125,7 +125,7 @@ public void testWaitingForHealthcheck() { } @Test - public void testWaitingForHealthcheckWithRestartDoesNotCrash() { + void testWaitingForHealthcheckWithRestartDoesNotCrash() { try ( ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) diff --git a/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java index 553ac21a8a0..1ed03ae9315 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java @@ -3,11 +3,8 @@ import com.google.common.util.concurrent.Uninterruptibles; import org.apache.commons.lang3.SystemUtils; import org.assertj.core.api.Assumptions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.utility.CommandLine; @@ -18,8 +15,7 @@ import java.util.Arrays; import java.util.concurrent.TimeUnit; -@RunWith(Parameterized.class) -public class ComposeOverridesTest { +class ComposeOverridesTest { private static final String DOCKER_EXECUTABLE = SystemUtils.IS_OS_WINDOWS ? "docker.exe" : "docker"; @@ -37,19 +33,6 @@ public class ComposeOverridesTest { private static final String SERVICE_NAME = "alpine-1"; - private final boolean localMode; - - private final String expectedEnvVar; - - private final File[] composeFiles; - - public ComposeOverridesTest(boolean localMode, String expectedEnvVar, File... composeFiles) { - this.localMode = localMode; - this.expectedEnvVar = expectedEnvVar; - this.composeFiles = composeFiles; - } - - @Parameters(name = "{index}: local[{0}], composeFiles[{2}], expectedEnvVar[{1}]") public static Iterable data() { return Arrays.asList( new Object[][] { @@ -61,18 +44,15 @@ public static Iterable data() { ); } - @Before - public void setUp() { + @ParameterizedTest(name = "{index}: local[{0}], composeFiles[{2}], expectedEnvVar[{1}]") + @MethodSource("data") + void test(boolean localMode, String expectedEnvVar, File... composeFiles) { if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DOCKER_EXECUTABLE)) .as("docker executable exists") .isTrue(); } - } - - @Test - public void test() { try ( ComposeContainer compose = new ComposeContainer(composeFiles) .withLocalCompose(localMode) diff --git a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java index 8fc662a118e..8a176fdcddb 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java @@ -1,41 +1,31 @@ package org.testcontainers.containers; import org.assertj.core.api.Assumptions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.utility.CommandLine; import java.io.File; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class ComposeProfilesOptionTest { +class ComposeProfilesOptionTest { - @Parameterized.Parameters(name = "{0}") public static Boolean[] local() { return new Boolean[] { Boolean.TRUE, Boolean.FALSE }; } - @Parameterized.Parameter - public boolean localMode; - public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); - @Before - public void setUp() { - if (this.localMode) { + @ParameterizedTest + @MethodSource("local") + void testProfileOption(boolean localMode) { + if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(ComposeContainer.COMPOSE_EXECUTABLE)) .as("docker executable exists") .isTrue(); } - } - - @Test - public void testProfileOption() { try ( // composeContainerWithLocalCompose { ComposeContainer compose = new ComposeContainer(COMPOSE_FILE) diff --git a/core/src/test/java/org/testcontainers/containers/ContainerStateTest.java b/core/src/test/java/org/testcontainers/containers/ContainerStateTest.java index d3cedc11464..7b37bc1926f 100644 --- a/core/src/test/java/org/testcontainers/containers/ContainerStateTest.java +++ b/core/src/test/java/org/testcontainers/containers/ContainerStateTest.java @@ -1,8 +1,7 @@ package org.testcontainers.containers; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Collections; import java.util.List; @@ -12,10 +11,8 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@RunWith(Parameterized.class) -public class ContainerStateTest { +class ContainerStateTest { - @Parameterized.Parameters(name = "{0} ({1} -> {2})") public static Object[][] params() { return new Object[][] { new Object[] { "regular mapping", "80:8080/tcp", Collections.singletonList(80) }, @@ -27,17 +24,9 @@ public static Object[][] params() { }; } - @Parameterized.Parameter(0) - public String name; - - @Parameterized.Parameter(1) - public String testSet; - - @Parameterized.Parameter(2) - public List expectedResult; - - @Test - public void test() { + @ParameterizedTest(name = "{0} ({1} -> {2})") + @MethodSource("params") + void test(String name, String testSet, List expectedResult) { ContainerState containerState = mock(ContainerState.class); doCallRealMethod().when(containerState).getBoundPortNumbers(); diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java index f92c4727921..cc6c124fde0 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.rnorth.ducttape.TimeoutException; import org.testcontainers.containers.wait.strategy.Wait; @@ -13,7 +13,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class DockerComposeContainerWithServicesTest { +class DockerComposeContainerWithServicesTest { public static final File SIMPLE_COMPOSE_FILE = new File( "src/test/resources/compose-scaling-multiple-containers.yml" @@ -28,7 +28,7 @@ public class DockerComposeContainerWithServicesTest { ); @Test - public void testDesiredSubsetOfServicesAreStarted() { + void testDesiredSubsetOfServicesAreStarted() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE).withServices("redis") ) { @@ -39,7 +39,7 @@ public void testDesiredSubsetOfServicesAreStarted() { } @Test - public void testDesiredSubsetOfScaledServicesAreStarted() { + void testDesiredSubsetOfScaledServicesAreStarted() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) .withScaledService("redis", 2) @@ -51,7 +51,7 @@ public void testDesiredSubsetOfScaledServicesAreStarted() { } @Test - public void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { + void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) .withServices("redis") @@ -64,7 +64,7 @@ public void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { } @Test - public void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { + void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) .withServices("other") @@ -77,7 +77,7 @@ public void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { } @Test - public void testAllServicesAreStartedIfNotSpecified() { + void testAllServicesAreStartedIfNotSpecified() { try (DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE)) { compose.start(); @@ -86,7 +86,7 @@ public void testAllServicesAreStartedIfNotSpecified() { } @Test - public void testScaleInComposeFileIsRespected() { + void testScaleInComposeFileIsRespected() { try (DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_INLINE_SCALE)) { compose.start(); @@ -96,7 +96,7 @@ public void testScaleInComposeFileIsRespected() { } @Test - public void testStartupTimeoutSetsTheHighestTimeout() { + void testStartupTimeoutSetsTheHighestTimeout() { assertThat( catchThrowable(() -> { try ( @@ -118,7 +118,7 @@ public void testStartupTimeoutSetsTheHighestTimeout() { } @Test - public void testWaitingForHealthcheck() { + void testWaitingForHealthcheck() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) @@ -130,7 +130,7 @@ public void testWaitingForHealthcheck() { } @Test - public void testWaitingForHealthcheckWithRestartDoesNotCrash() { + void testWaitingForHealthcheckWithRestartDoesNotCrash() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeFilesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeFilesTest.java index 9ae02a676c4..4704817c0e0 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeFilesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeFilesTest.java @@ -1,16 +1,16 @@ package org.testcontainers.containers; import com.google.common.collect.Lists; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.File; import static org.assertj.core.api.Assertions.assertThat; -public class DockerComposeFilesTest { +class DockerComposeFilesTest { @Test - public void shouldGetDependencyImages() { + void shouldGetDependencyImages() { DockerComposeFiles dockerComposeFiles = new DockerComposeFiles( Lists.newArrayList(new File("src/test/resources/docker-compose-imagename-parsing-v2.yml")) ); @@ -19,7 +19,7 @@ public void shouldGetDependencyImages() { } @Test - public void shouldGetDependencyImagesWhenOverriding() { + void shouldGetDependencyImagesWhenOverriding() { DockerComposeFiles dockerComposeFiles = new DockerComposeFiles( Lists.newArrayList( new File("src/test/resources/docker-compose-imagename-overriding-a.yml"), diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java index 036134e32d8..eb66fbabc38 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java @@ -2,11 +2,8 @@ import com.google.common.util.concurrent.Uninterruptibles; import org.assertj.core.api.Assumptions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.utility.CommandLine; @@ -17,8 +14,7 @@ import java.util.Arrays; import java.util.concurrent.TimeUnit; -@RunWith(Parameterized.class) -public class DockerComposeOverridesTest { +class DockerComposeOverridesTest { private static final File BASE_COMPOSE_FILE = new File("src/test/resources/docker-compose-base.yml"); @@ -34,19 +30,6 @@ public class DockerComposeOverridesTest { private static final String SERVICE_NAME = "alpine_1"; - private final boolean localMode; - - private final String expectedEnvVar; - - private final File[] composeFiles; - - public DockerComposeOverridesTest(boolean localMode, String expectedEnvVar, File... composeFiles) { - this.localMode = localMode; - this.expectedEnvVar = expectedEnvVar; - this.composeFiles = composeFiles; - } - - @Parameters(name = "{index}: local[{0}], composeFiles[{2}], expectedEnvVar[{1}]") public static Iterable data() { return Arrays.asList( new Object[][] { @@ -58,8 +41,9 @@ public static Iterable data() { ); } - @Before - public void setUp() { + @ParameterizedTest(name = "{index}: local[{0}], composeFiles[{2}], expectedEnvVar[{1}]") + @MethodSource("data") + void test(boolean localMode, String expectedEnvVar, File... composeFiles) { if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) @@ -69,10 +53,6 @@ public void setUp() { .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) .doesNotStartWith("Docker Compose version v2"); } - } - - @Test - public void test() { try ( DockerComposeContainer compose = new DockerComposeContainer(composeFiles) .withLocalCompose(localMode) diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java index 72f80cc877e..20a52566201 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java @@ -1,31 +1,27 @@ package org.testcontainers.containers; import org.assertj.core.api.Assumptions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.utility.CommandLine; import java.io.File; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class DockerComposeProfilesOptionTest { +class DockerComposeProfilesOptionTest { - @Parameterized.Parameters(name = "{0}") public static Boolean[] local() { return new Boolean[] { Boolean.TRUE, Boolean.FALSE }; } - @Parameterized.Parameter public boolean localMode; public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); - @Before - public void setUp() { + @ParameterizedTest(name = "{0}") + @MethodSource("local") + void testProfileOption() { if (this.localMode) { Assumptions .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) @@ -35,10 +31,6 @@ public void setUp() { .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) .doesNotStartWith("Docker Compose version v2"); } - } - - @Test - public void testProfileOption() { try ( DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE) .withOptions("--profile=cache") diff --git a/core/src/test/java/org/testcontainers/containers/DockerMcpGatewayContainerTest.java b/core/src/test/java/org/testcontainers/containers/DockerMcpGatewayContainerTest.java index 28e4cf6fb6a..cecd9f4da6f 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerMcpGatewayContainerTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerMcpGatewayContainerTest.java @@ -1,15 +1,15 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; -public class DockerMcpGatewayContainerTest { +class DockerMcpGatewayContainerTest { @Test - public void serviceSuccessfullyStarts() { + void serviceSuccessfullyStarts() { try (DockerMcpGatewayContainer gateway = new DockerMcpGatewayContainer("docker/mcp-gateway:latest")) { gateway.start(); @@ -18,7 +18,7 @@ public void serviceSuccessfullyStarts() { } @Test - public void gatewayStartsWithServers() { + void gatewayStartsWithServers() { try ( // container { DockerMcpGatewayContainer gateway = new DockerMcpGatewayContainer("docker/mcp-gateway:latest") diff --git a/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java b/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java index c04c0159e51..b215a373cf5 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerModelRunnerContainerTest.java @@ -2,15 +2,15 @@ import io.restassured.RestAssured; import io.restassured.response.Response; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; -public class DockerModelRunnerContainerTest { +class DockerModelRunnerContainerTest { @Test - public void checkStatus() { + void checkStatus() { assumeThat(System.getenv("CI")).isNull(); try ( @@ -26,7 +26,7 @@ public void checkStatus() { } @Test - public void pullsModelAndExposesInference() { + void pullsModelAndExposesInference() { assumeThat(System.getenv("CI")).isNull(); String modelName = "ai/smollm2:360M-Q4_K_M"; diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 4ce316fcf80..39c986d1f8a 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -3,10 +3,10 @@ import com.google.common.collect.ImmutableMap; import com.sun.net.httpserver.HttpServer; import lombok.SneakyThrows; -import org.junit.After; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.runner.Description; import org.junit.runners.model.Statement; import org.testcontainers.DockerClientFactory; @@ -23,11 +23,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; -public class ExposedHostTest { +class ExposedHostTest { private static HttpServer server; - @BeforeClass + @BeforeAll public static void setUpClass() throws Exception { server = HttpServer.create(new InetSocketAddress(0), 0); server.createContext( @@ -44,18 +44,18 @@ public static void setUpClass() throws Exception { server.start(); } - @AfterClass + @AfterAll public static void tearDownClass() { server.stop(0); } - @After + @AfterEach public void tearDown() { PortForwardingContainer.INSTANCE.reset(); } @Test - public void testExposedHostAfterContainerIsStarted() { + void testExposedHostAfterContainerIsStarted() { try (GenericContainer container = new GenericContainer<>(tinyContainerDef()).withAccessToHost(true)) { container.start(); Testcontainers.exposeHostPorts(server.getAddress().getPort()); @@ -64,13 +64,13 @@ public void testExposedHostAfterContainerIsStarted() { } @Test - public void testExposedHost() { + void testExposedHost() { Testcontainers.exposeHostPorts(server.getAddress().getPort()); assertResponse(new GenericContainer<>(tinyContainerDef()), server.getAddress().getPort()); } @Test - public void testExposedHostWithNetwork() { + void testExposedHostWithNetwork() { Testcontainers.exposeHostPorts(server.getAddress().getPort()); try (Network network = Network.newNetwork()) { assertResponse( @@ -81,7 +81,7 @@ public void testExposedHostWithNetwork() { } @Test - public void testExposedHostPortOnFixedInternalPorts() { + void testExposedHostPortOnFixedInternalPorts() { Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 80)); Testcontainers.exposeHostPorts(ImmutableMap.of(server.getAddress().getPort(), 81)); @@ -90,7 +90,7 @@ public void testExposedHostPortOnFixedInternalPorts() { } @Test - public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { + void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { assumeThat(TestcontainersConfiguration.getInstance().environmentSupportsReuse()).isTrue(); Network network = createReusableNetwork(UUID.randomUUID()); Testcontainers.exposeHostPorts(server.getAddress().getPort()); @@ -117,7 +117,7 @@ public void testExposedHostWithReusableContainerAndFixedNetworkName() throws IOE } @Test - public void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetworkName() + void testExposedHostOnFixedInternalPortsWithReusableContainerAndFixedNetworkName() throws IOException, InterruptedException { assumeThat(TestcontainersConfiguration.getInstance().environmentSupportsReuse()).isTrue(); Network network = createReusableNetwork(UUID.randomUUID()); diff --git a/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java b/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java index c743fcf6a43..b2abf02bce5 100644 --- a/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java +++ b/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -10,10 +10,10 @@ import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; -public class FailureDetectingExternalResourceTest { +class FailureDetectingExternalResourceTest { @Test - public void finishedIsCalledForCleanupIfStartingThrows() throws Throwable { + void finishedIsCalledForCleanupIfStartingThrows() { FailureDetectingExternalResource res = spy(FailureDetectingExternalResource.class); Statement stmt = res.apply(mock(Statement.class), Description.EMPTY); doThrow(new RuntimeException()).when(res).starting(any()); diff --git a/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java b/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java index c1c4ff3818e..37aac1b0af9 100644 --- a/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java +++ b/core/src/test/java/org/testcontainers/containers/GenericContainerTest.java @@ -17,7 +17,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.assertj.core.api.Assumptions; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.DockerClientFactory; import org.testcontainers.TestImages; @@ -46,10 +46,10 @@ import static org.assertj.core.api.Assertions.catchThrowable; import static org.assertj.core.api.Assumptions.assumeThat; -public class GenericContainerTest { +class GenericContainerTest { @Test - public void shouldReportOOMAfterWait() { + void shouldReportOOMAfterWait() { Info info = DockerClientFactory.instance().client().infoCmd().exec(); // Poor man's rootless Docker detection :D Assumptions.assumeThat(info.getSecurityOptions()).doesNotContain("name=rootless"); @@ -75,7 +75,7 @@ public void shouldReportOOMAfterWait() { } @Test - public void shouldReportErrorAfterWait() { + void shouldReportErrorAfterWait() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withStartupCheckStrategy(new NoopStartupCheckStrategy()) @@ -90,7 +90,7 @@ public void shouldReportErrorAfterWait() { } @Test - public void shouldCopyTransferableAsFile() { + void shouldCopyTransferableAsFile() { try ( // transferableFile { GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) @@ -107,7 +107,7 @@ public void shouldCopyTransferableAsFile() { } @Test - public void shouldCopyTransferableAsFileWithFileMode() { + void shouldCopyTransferableAsFileWithFileMode() { try ( // transferableWithFileMode { GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) @@ -124,7 +124,7 @@ public void shouldCopyTransferableAsFileWithFileMode() { } @Test - public void shouldCopyTransferableAfterMountableFile() { + void shouldCopyTransferableAfterMountableFile() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withStartupCheckStrategy(new NoopStartupCheckStrategy()) @@ -140,7 +140,7 @@ public void shouldCopyTransferableAfterMountableFile() { } @Test - public void shouldOnlyPublishExposedPorts() { + void shouldOnlyPublishExposedPorts() { ImageFromDockerfile image = new ImageFromDockerfile("publish-multiple") .withDockerfileFromBuilder(builder -> { builder @@ -176,7 +176,7 @@ public void shouldOnlyPublishExposedPorts() { } @Test - public void shouldWaitUntilExposedPortIsMapped() { + void shouldWaitUntilExposedPortIsMapped() { ImageFromDockerfile image = new ImageFromDockerfile("publish-multiple") .withDockerfileFromBuilder(builder -> { builder @@ -198,7 +198,7 @@ public void shouldWaitUntilExposedPortIsMapped() { } @Test - public void testArchitectureCheck() { + void testArchitectureCheck() { assumeThat(DockerClientFactory.instance().client().versionCmd().exec().getArch()).isNotEqualTo("amd64"); // Choose an image that is *different* from the server architecture--this ensures we always get a warning. final String image; @@ -233,7 +233,7 @@ public void testArchitectureCheck() { } @Test - public void shouldReturnTheProvidedImage() { + void shouldReturnTheProvidedImage() { GenericContainer container = new GenericContainer(TestImages.REDIS_IMAGE); assertThat(container.getImage().get()).isEqualTo("redis:6-alpine"); container.setImage(new RemoteDockerImage(TestImages.ALPINE_IMAGE)); @@ -241,7 +241,7 @@ public void shouldReturnTheProvidedImage() { } @Test - public void shouldContainDefaultNetworkAlias() { + void shouldContainDefaultNetworkAlias() { try (GenericContainer container = new GenericContainer<>("testcontainers/helloworld:1.1.0")) { container.start(); assertThat(container.getNetworkAliases()).hasSize(1); @@ -249,7 +249,7 @@ public void shouldContainDefaultNetworkAlias() { } @Test - public void shouldContainDefaultNetworkAliasWhenUsingGenericContainer() { + void shouldContainDefaultNetworkAliasWhenUsingGenericContainer() { try (HelloWorldContainer container = new HelloWorldContainer("testcontainers/helloworld:1.1.0")) { container.start(); assertThat(container.getNetworkAliases()).hasSize(1); @@ -257,7 +257,7 @@ public void shouldContainDefaultNetworkAliasWhenUsingGenericContainer() { } @Test - public void shouldContainDefaultNetworkAliasWhenUsingContainerDef() { + void shouldContainDefaultNetworkAliasWhenUsingContainerDef() { try (TcHelloWorldContainer container = new TcHelloWorldContainer("testcontainers/helloworld:1.1.0")) { container.start(); assertThat(container.getNetworkAliases()).hasSize(1); @@ -265,7 +265,7 @@ public void shouldContainDefaultNetworkAliasWhenUsingContainerDef() { } @Test - public void shouldRespectWaitStrategy() { + void shouldRespectWaitStrategy() { try ( HelloWorldLogStrategyContainer container = new HelloWorldLogStrategyContainer( "testcontainers/helloworld:1.1.0" @@ -280,7 +280,7 @@ public void shouldRespectWaitStrategy() { } @Test - public void testStartupAttemptsDoesNotLeaveContainersRunningWhenWrongWaitStrategyIsUsed() { + void testStartupAttemptsDoesNotLeaveContainersRunningWhenWrongWaitStrategyIsUsed() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withLabel("waitstrategy", "wrong") diff --git a/core/src/test/java/org/testcontainers/containers/JibTest.java b/core/src/test/java/org/testcontainers/containers/JibTest.java index 1441ff00120..df045052bc3 100644 --- a/core/src/test/java/org/testcontainers/containers/JibTest.java +++ b/core/src/test/java/org/testcontainers/containers/JibTest.java @@ -1,7 +1,7 @@ package org.testcontainers.containers; import com.github.dockerjava.api.command.InspectImageResponse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.output.OutputFrame.OutputType; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -12,10 +12,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class JibTest { +class JibTest { @Test - public void buildImage() { + void buildImage() { try ( // jibContainerUsage { GenericContainer busybox = new GenericContainer<>( @@ -36,7 +36,7 @@ public void buildImage() { } @Test - public void standardLabelsAreAddedWhenUsingJibSetLabels() { + void standardLabelsAreAddedWhenUsingJibSetLabels() { try ( GenericContainer busybox = new GenericContainer<>( new JibImage( @@ -56,7 +56,7 @@ public void standardLabelsAreAddedWhenUsingJibSetLabels() { } @Test - public void standardLabelsAreAddedWhenUsingJibAddLabel() { + void standardLabelsAreAddedWhenUsingJibAddLabel() { try ( GenericContainer busybox = new GenericContainer<>( new JibImage( diff --git a/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java b/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java index f5bed1020c0..b1ec1c707d5 100644 --- a/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java +++ b/core/src/test/java/org/testcontainers/containers/MultiStageBuildTest.java @@ -1,6 +1,6 @@ package org.testcontainers.containers; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.images.builder.ImageFromDockerfile; import java.io.IOException; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class MultiStageBuildTest { +class MultiStageBuildTest { @Test - public void testDockerMultistageBuild() throws IOException, InterruptedException { + void testDockerMultistageBuild() throws IOException, InterruptedException { try ( GenericContainer container = new GenericContainer<>( new ImageFromDockerfile() @@ -27,7 +27,7 @@ public void testDockerMultistageBuild() throws IOException, InterruptedException } @Test - public void shouldBuildMultistageBuildWithBuildImageCmdModifier() throws IOException, InterruptedException { + void shouldBuildMultistageBuildWithBuildImageCmdModifier() throws IOException, InterruptedException { try ( GenericContainer container = new GenericContainer<>( new ImageFromDockerfile() diff --git a/core/src/test/java/org/testcontainers/containers/NetworkTest.java b/core/src/test/java/org/testcontainers/containers/NetworkTest.java index 099bef20ed7..675658b353a 100644 --- a/core/src/test/java/org/testcontainers/containers/NetworkTest.java +++ b/core/src/test/java/org/testcontainers/containers/NetworkTest.java @@ -1,44 +1,41 @@ package org.testcontainers.containers; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.TestImages; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Enclosed.class) -public class NetworkTest { +class NetworkTest { - public static class WithRules { + @Nested + class WithRules { - @Rule public Network network = Network.newNetwork(); - @Rule public GenericContainer foo = new GenericContainer<>(TestImages.TINY_IMAGE) .withNetwork(network) .withNetworkAliases("foo") .withCommand("/bin/sh", "-c", "while true ; do printf 'HTTP/1.1 200 OK\\n\\nyay' | nc -l -p 8080; done"); - @Rule public GenericContainer bar = new GenericContainer<>(TestImages.TINY_IMAGE) .withNetwork(network) .withCommand("top"); - @Test - public void testNetworkSupport() throws Exception { + void testNetworkSupport() throws Exception { + foo.start(); + bar.start(); String response = bar.execInContainer("wget", "-O", "-", "http://foo:8080").getStdout(); assertThat(response).as("received response").isEqualTo("yay"); } } - public static class WithoutRules { + @Nested + class WithoutRules { @Test - public void testNetworkSupport() throws Exception { + void testNetworkSupport() throws Exception { // useCustomNetwork { try ( Network network = Network.newNetwork(); @@ -64,7 +61,7 @@ public void testNetworkSupport() throws Exception { } @Test - public void testBuilder() { + void testBuilder() { try (Network network = Network.builder().driver("macvlan").build()) { String id = network.getId(); assertThat( @@ -76,7 +73,7 @@ public void testBuilder() { } @Test - public void testModifiers() { + void testModifiers() { try ( Network network = Network.builder().createNetworkCmdModifier(cmd -> cmd.withDriver("macvlan")).build() ) { @@ -90,7 +87,7 @@ public void testModifiers() { } @Test - public void testReusability() { + void testReusability() { try (Network network = Network.newNetwork()) { String firstId = network.getId(); assertThat(DockerClientFactory.instance().client().inspectNetworkCmd().withNetworkId(firstId).exec()) diff --git a/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java b/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java index 9067d77d825..36126df6a38 100644 --- a/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java +++ b/core/src/test/java/org/testcontainers/containers/ParsedDockerComposeFileValidationTest.java @@ -3,12 +3,12 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import lombok.SneakyThrows; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import java.io.File; import java.io.PrintWriter; +import java.nio.file.Path; import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; @@ -16,13 +16,13 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.entry; -public class ParsedDockerComposeFileValidationTest { +class ParsedDockerComposeFileValidationTest { - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); + @TempDir + public Path temporaryFolder; @Test - public void shouldValidate() { + void shouldValidate() { File file = new File("src/test/resources/docker-compose-container-name-v1.yml"); assertThatThrownBy(() -> { new ParsedDockerComposeFile(file); @@ -32,7 +32,7 @@ public void shouldValidate() { } @Test - public void shouldRejectContainerNameV1() { + void shouldRejectContainerNameV1() { assertThatThrownBy(() -> { new ParsedDockerComposeFile(ImmutableMap.of("redis", ImmutableMap.of("container_name", "redis"))); }) @@ -40,7 +40,7 @@ public void shouldRejectContainerNameV1() { } @Test - public void shouldRejectContainerNameV2() { + void shouldRejectContainerNameV2() { assertThatThrownBy(() -> { new ParsedDockerComposeFile( ImmutableMap.of( @@ -55,7 +55,7 @@ public void shouldRejectContainerNameV2() { } @Test - public void shouldIgnoreUnknownStructure() { + void shouldIgnoreUnknownStructure() { // Everything is a list new ParsedDockerComposeFile(Collections.emptyMap()); @@ -71,7 +71,7 @@ public void shouldIgnoreUnknownStructure() { @Test @SneakyThrows - public void shouldRejectDeserializationOfArbitraryClasses() { + void shouldRejectDeserializationOfArbitraryClasses() { // Reject deserialization gadget chain attacks: https://nvd.nist.gov/vuln/detail/CVE-2022-1471 // https://raw.githubusercontent.com/mbechler/marshalsec/master/marshalsec.pdf @@ -86,7 +86,7 @@ public void shouldRejectDeserializationOfArbitraryClasses() { } @Test - public void shouldObtainImageNamesV1() { + void shouldObtainImageNamesV1() { File file = new File("src/test/resources/docker-compose-imagename-parsing-v1.yml"); ParsedDockerComposeFile parsedFile = new ParsedDockerComposeFile(file); assertThat(parsedFile.getServiceNameToImageNames()) @@ -99,7 +99,7 @@ public void shouldObtainImageNamesV1() { } @Test - public void shouldObtainImageNamesV2() { + void shouldObtainImageNamesV2() { File file = new File("src/test/resources/docker-compose-imagename-parsing-v2.yml"); ParsedDockerComposeFile parsedFile = new ParsedDockerComposeFile(file); assertThat(parsedFile.getServiceNameToImageNames()) @@ -112,7 +112,7 @@ public void shouldObtainImageNamesV2() { } @Test - public void shouldObtainImageNamesV2WithNoVersionTag() { + void shouldObtainImageNamesV2WithNoVersionTag() { File file = new File("src/test/resources/docker-compose-imagename-parsing-v2-no-version.yml"); ParsedDockerComposeFile parsedFile = new ParsedDockerComposeFile(file); assertThat(parsedFile.getServiceNameToImageNames()) @@ -125,7 +125,7 @@ public void shouldObtainImageNamesV2WithNoVersionTag() { } @Test - public void shouldObtainImageFromDockerfileBuild() { + void shouldObtainImageFromDockerfileBuild() { File file = new File("src/test/resources/docker-compose-imagename-parsing-dockerfile.yml"); ParsedDockerComposeFile parsedFile = new ParsedDockerComposeFile(file); assertThat(parsedFile.getServiceNameToImageNames()) @@ -138,7 +138,7 @@ public void shouldObtainImageFromDockerfileBuild() { } @Test - public void shouldObtainImageFromDockerfileBuildWithContext() { + void shouldObtainImageFromDockerfileBuildWithContext() { File file = new File("src/test/resources/docker-compose-imagename-parsing-dockerfile-with-context.yml"); ParsedDockerComposeFile parsedFile = new ParsedDockerComposeFile(file); assertThat(parsedFile.getServiceNameToImageNames()) @@ -151,8 +151,8 @@ public void shouldObtainImageFromDockerfileBuildWithContext() { } @Test - public void shouldSupportALotOfAliases() throws Exception { - File file = temporaryFolder.newFile(); + void shouldSupportALotOfAliases() throws Exception { + File file = temporaryFolder.resolve("tmp-docker-compose.yml").toFile(); try (PrintWriter writer = new PrintWriter(file)) { writer.println("x-entry: &entry"); writer.println(" key: value"); diff --git a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java index 04f97fef514..2c70a3f894f 100644 --- a/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java +++ b/core/src/test/java/org/testcontainers/containers/ReusabilityUnitTests.java @@ -14,14 +14,12 @@ import com.github.dockerjava.core.command.InspectContainerCmdImpl; import com.github.dockerjava.core.command.ListContainersCmdImpl; import com.github.dockerjava.core.command.StartContainerCmdImpl; -import lombok.RequiredArgsConstructor; -import lombok.experimental.FieldDefaults; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Answers; import org.mockito.Mockito; import org.mockito.stubbing.Answer; @@ -29,7 +27,7 @@ import org.testcontainers.TestImages; import org.testcontainers.containers.startupcheck.StartupCheckStrategy; import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; -import org.testcontainers.utility.MockTestcontainersConfigurationRule; +import org.testcontainers.utility.MockTestcontainersConfigurationExtension; import org.testcontainers.utility.MountableFile; import org.testcontainers.utility.TestcontainersConfiguration; @@ -53,15 +51,11 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -@RunWith(Enclosed.class) -public class ReusabilityUnitTests { +class ReusabilityUnitTests { - @RunWith(Parameterized.class) - @RequiredArgsConstructor - @FieldDefaults(makeFinal = true) - public static class CanBeReusedTest { + @Nested + class CanBeReusedTest { - @Parameterized.Parameters(name = "{0}") public static Object[][] data() { return new Object[][] { { "generic", new GenericContainer<>(TestImages.TINY_IMAGE), true }, @@ -72,14 +66,9 @@ public static Object[][] data() { }; } - String name; - - GenericContainer container; - - boolean reusable; - - @Test - public void shouldBeReusable() { + @ParameterizedTest(name = "{0}") + @MethodSource("data") + void shouldBeReusable(String name, GenericContainer container, boolean reusable) { if (reusable) { assertThat(container.canBeReused()).as("Is reusable").isTrue(); } else { @@ -108,9 +97,8 @@ protected void containerIsCreated(String containerId) { } } - @RunWith(BlockJUnit4ClassRunner.class) - @FieldDefaults(makeFinal = true) - public static class HooksTest extends AbstractReusabilityTest { + @Nested + class HooksTest extends AbstractReusabilityTest { List script = new ArrayList<>(); @@ -140,7 +128,7 @@ protected void containerIsStarted(InspectContainerResponse containerInfo, boolea ); @Test - public void shouldSetLabelsIfEnvironmentDoesNotSupportReuse() { + void shouldSetLabelsIfEnvironmentDoesNotSupportReuse() { Mockito.doReturn(false).when(TestcontainersConfiguration.getInstance()).environmentSupportsReuse(); String containerId = randomContainerId(); @@ -159,7 +147,7 @@ public void shouldSetLabelsIfEnvironmentDoesNotSupportReuse() { } @Test - public void shouldCallHookIfReused() { + void shouldCallHookIfReused() { Mockito.doReturn(true).when(TestcontainersConfiguration.getInstance()).environmentSupportsReuse(); String containerId = randomContainerId(); when(client.createContainerCmd(any())).then(createContainerAnswer(containerId)); @@ -172,7 +160,7 @@ public void shouldCallHookIfReused() { } @Test - public void shouldNotCallHookIfNotReused() { + void shouldNotCallHookIfNotReused() { String containerId = randomContainerId(); when(client.createContainerCmd(any())).then(createContainerAnswer(containerId)); when(client.listContainersCmd()).then(listContainersAnswer()); @@ -189,9 +177,8 @@ public void shouldNotCallHookIfNotReused() { } } - @RunWith(BlockJUnit4ClassRunner.class) - @FieldDefaults(makeFinal = true) - public static class HashTest extends AbstractReusabilityTest { + @Nested + class HashTest extends AbstractReusabilityTest { protected GenericContainer container = makeReusable( new GenericContainer(TestImages.TINY_IMAGE) { @@ -203,7 +190,7 @@ public void copyFileToContainer(MountableFile mountableFile, String containerPat ); @Test - public void shouldStartIfListReturnsEmpty() { + void shouldStartIfListReturnsEmpty() { String containerId = randomContainerId(); when(client.createContainerCmd(any())).then(createContainerAnswer(containerId)); when(client.listContainersCmd()).then(listContainersAnswer()); @@ -216,7 +203,7 @@ public void shouldStartIfListReturnsEmpty() { } @Test - public void shouldReuseIfListReturnsID() { + void shouldReuseIfListReturnsID() { Mockito.doReturn(true).when(TestcontainersConfiguration.getInstance()).environmentSupportsReuse(); String containerId = randomContainerId(); when(client.createContainerCmd(any())).then(createContainerAnswer(containerId)); @@ -231,7 +218,7 @@ public void shouldReuseIfListReturnsID() { } @Test - public void shouldSetLabelsIfEnvironmentDoesNotSupportReuse() { + void shouldSetLabelsIfEnvironmentDoesNotSupportReuse() { Mockito.doReturn(false).when(TestcontainersConfiguration.getInstance()).environmentSupportsReuse(); AtomicReference commandRef = new AtomicReference<>(); String containerId = randomContainerId(); @@ -250,7 +237,7 @@ public void shouldSetLabelsIfEnvironmentDoesNotSupportReuse() { } @Test - public void shouldSetCopiedFilesHashLabel() { + void shouldSetCopiedFilesHashLabel() { Mockito.doReturn(true).when(TestcontainersConfiguration.getInstance()).environmentSupportsReuse(); AtomicReference commandRef = new AtomicReference<>(); String containerId = randomContainerId(); @@ -266,7 +253,7 @@ public void shouldSetCopiedFilesHashLabel() { } @Test - public void shouldHashCopiedFiles() { + void shouldHashCopiedFiles() { Mockito.doReturn(true).when(TestcontainersConfiguration.getInstance()).environmentSupportsReuse(); AtomicReference commandRef = new AtomicReference<>(); String containerId = randomContainerId(); @@ -303,9 +290,10 @@ public void shouldHashCopiedFiles() { } } - @RunWith(Parameterized.class) - @FieldDefaults(makeFinal = true) - public static class CopyFilesHashTest { + @Nested + @ParameterizedClass + @MethodSource("strategies") + class CopyFilesHashTest { private final TestStrategy strategy; @@ -353,7 +341,6 @@ public void clear() { } } - @Parameterized.Parameters public static List, TestStrategy>> strategies() { return Arrays.asList(MountableFileTestStrategy::new, TransferableTestStrategy::new); } @@ -365,12 +352,12 @@ public CopyFilesHashTest(Function, TestStrategy> strategyFac } @Test - public void empty() { + void empty() { assertThat(container.hashCopiedFiles()).isNotNull(); } @Test - public void oneFile() { + void oneFile() { long emptyHash = container.hashCopiedFiles().getValue(); strategy.withCopyFileToContainer( @@ -382,7 +369,7 @@ public void oneFile() { } @Test - public void differentPath() { + void differentPath() { MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt"); strategy.withCopyFileToContainer(mountableFile, "/foo/bar"); @@ -396,7 +383,7 @@ public void differentPath() { } @Test - public void detectsChangesInFile() throws Exception { + void detectsChangesInFile() throws Exception { Path path = File.createTempFile("reusable_test", ".txt").toPath(); MountableFile mountableFile = MountableFile.forHostPath(path); strategy.withCopyFileToContainer(mountableFile, "/foo/bar"); @@ -409,7 +396,7 @@ public void detectsChangesInFile() throws Exception { } @Test - public void multipleFiles() { + void multipleFiles() { strategy.withCopyFileToContainer( MountableFile.forClasspathResource("test_copy_to_container.txt"), "/foo/bar" @@ -425,7 +412,7 @@ public void multipleFiles() { } @Test - public void folder() throws Exception { + void folder() throws Exception { long emptyHash = container.hashCopiedFiles().getValue(); Path tempDirectory = Files.createTempDirectory("reusable_test"); @@ -436,7 +423,7 @@ public void folder() throws Exception { } @Test - public void changesInFolder() throws Exception { + void changesInFolder() throws Exception { Path tempDirectory = Files.createTempDirectory("reusable_test"); MountableFile mountableFile = MountableFile.forHostPath(tempDirectory); assertThat(new File(mountableFile.getResolvedPath())).isDirectory(); @@ -455,7 +442,7 @@ public void changesInFolder() throws Exception { } @Test - public void folderAndFile() throws Exception { + void folderAndFile() throws Exception { Path tempDirectory = Files.createTempDirectory("reusable_test"); MountableFile mountableFile = MountableFile.forHostPath(tempDirectory); assertThat(new File(mountableFile.getResolvedPath())).isDirectory(); @@ -472,7 +459,7 @@ public void folderAndFile() throws Exception { } @Test - public void filePermissions() throws Exception { + void filePermissions() throws Exception { Path path = File.createTempFile("reusable_test", ".txt").toPath(); path.toFile().setExecutable(false); MountableFile mountableFile = MountableFile.forHostPath(path); @@ -487,7 +474,7 @@ public void filePermissions() throws Exception { } @Test - public void folderPermissions() throws Exception { + void folderPermissions() throws Exception { Path tempDirectory = Files.createTempDirectory("reusable_test"); MountableFile mountableFile = MountableFile.forHostPath(tempDirectory); assertThat(new File(mountableFile.getResolvedPath())).isDirectory(); @@ -505,12 +492,9 @@ public void folderPermissions() throws Exception { } } - @FieldDefaults(makeFinal = true) + @ExtendWith(MockTestcontainersConfigurationExtension.class) public abstract static class AbstractReusabilityTest { - @Rule - public MockTestcontainersConfigurationRule configurationMock = new MockTestcontainersConfigurationRule(); - protected DockerClient client = Mockito.mock(DockerClient.class); protected > T makeReusable(T container) { diff --git a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java index cc3a98dba47..f742b29890b 100644 --- a/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java +++ b/core/src/test/java/org/testcontainers/containers/output/ContainerLogsTest.java @@ -1,18 +1,18 @@ package org.testcontainers.containers.output; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import static org.assertj.core.api.Assertions.assertThat; -public class ContainerLogsTest { +class ContainerLogsTest { @Test - @Ignore("fails due to the timing of the shell's decision to flush") - public void getLogsReturnsAllLogsToDate() { + @Disabled("fails due to the timing of the shell's decision to flush") + void getLogsReturnsAllLogsToDate() { try (GenericContainer container = shortLivedContainer()) { container.start(); @@ -22,7 +22,7 @@ public void getLogsReturnsAllLogsToDate() { } @Test - public void getLogsContainsBothOutputTypes() { + void getLogsContainsBothOutputTypes() { try (GenericContainer container = shortLivedContainer()) { container.start(); @@ -35,7 +35,7 @@ public void getLogsContainsBothOutputTypes() { } @Test - public void getLogsReturnsStdOutToDate() { + void getLogsReturnsStdOutToDate() { try (GenericContainer container = shortLivedContainer()) { container.start(); @@ -47,7 +47,7 @@ public void getLogsReturnsStdOutToDate() { } @Test - public void getLogsReturnsStdErrToDate() { + void getLogsReturnsStdErrToDate() { try (GenericContainer container = shortLivedContainer()) { container.start(); @@ -59,7 +59,7 @@ public void getLogsReturnsStdErrToDate() { } @Test - public void getLogsForLongRunningContainer() throws InterruptedException { + void getLogsForLongRunningContainer() throws InterruptedException { try (GenericContainer container = longRunningContainer()) { container.start(); diff --git a/core/src/test/java/org/testcontainers/containers/output/FrameConsumerResultCallbackTest.java b/core/src/test/java/org/testcontainers/containers/output/FrameConsumerResultCallbackTest.java index f6e513c1fd8..33ae9fd17f5 100644 --- a/core/src/test/java/org/testcontainers/containers/output/FrameConsumerResultCallbackTest.java +++ b/core/src/test/java/org/testcontainers/containers/output/FrameConsumerResultCallbackTest.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.model.Frame; import com.github.dockerjava.api.model.StreamType; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -12,7 +12,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class FrameConsumerResultCallbackTest { +class FrameConsumerResultCallbackTest { private static final String FRAME_PAYLOAD = "\u001B[0;32mТест1\u001B[0m\n\u001B[1;33mTest2\u001B[0m\n\u001B[0;31mTest3\u001B[0m"; @@ -20,7 +20,7 @@ public class FrameConsumerResultCallbackTest { private static final String LOG_RESULT = "Тест1\nTest2\nTest3"; @Test - public void passStderrFrameWithoutColors() throws IOException { + void passStderrFrameWithoutColors() throws IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer(); callback.addConsumer(OutputFrame.OutputType.STDERR, consumer); @@ -30,7 +30,7 @@ public void passStderrFrameWithoutColors() throws IOException { } @Test - public void passStderrFrameWithColors() throws IOException { + void passStderrFrameWithColors() throws IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); callback.addConsumer(OutputFrame.OutputType.STDERR, consumer); @@ -40,7 +40,7 @@ public void passStderrFrameWithColors() throws IOException { } @Test - public void passStdoutFrameWithoutColors() throws IOException { + void passStdoutFrameWithoutColors() throws IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer(); callback.addConsumer(OutputFrame.OutputType.STDOUT, consumer); @@ -50,7 +50,7 @@ public void passStdoutFrameWithoutColors() throws IOException { } @Test - public void passStdoutFrameWithColors() throws IOException { + void passStdoutFrameWithColors() throws IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); callback.addConsumer(OutputFrame.OutputType.STDOUT, consumer); @@ -60,7 +60,7 @@ public void passStdoutFrameWithColors() throws IOException { } @Test - public void basicConsumer() throws IOException { + void basicConsumer() throws IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); BasicConsumer consumer = new BasicConsumer(); callback.addConsumer(OutputFrame.OutputType.STDOUT, consumer); @@ -70,7 +70,7 @@ public void basicConsumer() throws IOException { } @Test - public void passStdoutNull() throws IOException { + void passStdoutNull() throws IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); callback.addConsumer(OutputFrame.OutputType.STDOUT, consumer); @@ -80,7 +80,7 @@ public void passStdoutNull() throws IOException { } @Test - public void passStdoutEmptyLine() throws IOException { + void passStdoutEmptyLine() throws IOException { String payload = ""; FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); @@ -91,7 +91,7 @@ public void passStdoutEmptyLine() throws IOException { } @Test - public void passStdoutSingleLine() throws IOException { + void passStdoutSingleLine() throws IOException { String payload = "Test"; FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); @@ -102,7 +102,7 @@ public void passStdoutSingleLine() throws IOException { } @Test - public void passStdoutSingleLineWithNewline() throws IOException { + void passStdoutSingleLineWithNewline() throws IOException { String payload = "Test\n"; FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); ToStringConsumer consumer = new ToStringConsumer().withRemoveAnsiCodes(false); @@ -113,7 +113,7 @@ public void passStdoutSingleLineWithNewline() throws IOException { } @Test - public void passRawFrameWithoutColors() throws TimeoutException, IOException { + void passRawFrameWithoutColors() throws TimeoutException, IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); WaitingConsumer waitConsumer = new WaitingConsumer(); callback.addConsumer(OutputFrame.OutputType.STDOUT, waitConsumer); @@ -148,7 +148,7 @@ public void passRawFrameWithoutColors() throws TimeoutException, IOException { } @Test - public void passRawFrameWithColors() throws TimeoutException, IOException { + void passRawFrameWithColors() throws TimeoutException, IOException { FrameConsumerResultCallback callback = new FrameConsumerResultCallback(); WaitingConsumer waitConsumer = new WaitingConsumer().withRemoveAnsiCodes(false); callback.addConsumer(OutputFrame.OutputType.STDOUT, waitConsumer); @@ -203,7 +203,7 @@ public void passRawFrameWithColors() throws TimeoutException, IOException { } @Test - public void reconstructBreakedUnicode() throws IOException { + void reconstructBreakedUnicode() throws IOException { String payload = "Тест"; byte[] payloadBytes = payload.getBytes(StandardCharsets.UTF_8); byte[] bytes1 = new byte[(int) (payloadBytes.length * 0.6)]; diff --git a/core/src/test/java/org/testcontainers/containers/output/ToStringConsumerTest.java b/core/src/test/java/org/testcontainers/containers/output/ToStringConsumerTest.java index eaab250141c..45472771168 100644 --- a/core/src/test/java/org/testcontainers/containers/output/ToStringConsumerTest.java +++ b/core/src/test/java/org/testcontainers/containers/output/ToStringConsumerTest.java @@ -1,14 +1,15 @@ package org.testcontainers.containers.output; import org.apache.commons.lang3.RandomStringUtils; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.containers.Container.ExecResult; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import static org.assertj.core.api.Assertions.assertThat; -public class ToStringConsumerTest { +class ToStringConsumerTest { private static final String LARGE_PAYLOAD; @@ -22,7 +23,7 @@ public class ToStringConsumerTest { } @Test - public void newlines_are_not_added_to_exec_output() throws Exception { + void newlines_are_not_added_to_exec_output() throws Exception { try (GenericContainer container = new GenericContainer<>("alpine:3.17")) { container.withCommand("sleep", "2m"); container.start(); @@ -32,8 +33,9 @@ public void newlines_are_not_added_to_exec_output() throws Exception { } } - @Test(timeout = 60_000L) - public void newlines_are_not_added_to_exec_output_with_tty() throws Exception { + @Test + @Timeout(60) + void newlines_are_not_added_to_exec_output_with_tty() throws Exception { try (GenericContainer container = new GenericContainer<>("alpine:3.17")) { container.withCreateContainerCmdModifier(cmd -> { cmd.withAttachStdin(true).withStdinOpen(true).withTty(true); @@ -47,7 +49,7 @@ public void newlines_are_not_added_to_exec_output_with_tty() throws Exception { } @Test - public void newlines_are_not_added_to_container_output() { + void newlines_are_not_added_to_container_output() { try (GenericContainer container = new GenericContainer<>("alpine:3.17")) { container.withCommand("echo", "-n", LARGE_PAYLOAD); container.setStartupCheckStrategy(new OneShotStartupCheckStrategy()); @@ -60,7 +62,7 @@ public void newlines_are_not_added_to_container_output() { } @Test - public void newlines_are_not_added_to_container_output_with_tty() { + void newlines_are_not_added_to_container_output_with_tty() { try (GenericContainer container = new GenericContainer<>("alpine:3.17")) { container.withCreateContainerCmdModifier(cmd -> { cmd.withTty(true); diff --git a/core/src/test/java/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategyTest.java b/core/src/test/java/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategyTest.java index 7e3bf1d814f..fc7a60c2115 100644 --- a/core/src/test/java/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategyTest.java +++ b/core/src/test/java/org/testcontainers/containers/startupcheck/IsRunningStartupCheckStrategyTest.java @@ -1,24 +1,24 @@ package org.testcontainers.containers.startupcheck; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class IsRunningStartupCheckStrategyTest { +class IsRunningStartupCheckStrategyTest { @Test - public void testCommandQuickExitSuccess() { + void testCommandQuickExitSuccess() { try (GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE).withCommand("/bin/true")) { container.start(); // should start with no Exception } } @Test - @Ignore("This test can fail to throw an AssertionError if the container doesn't fail quickly enough") - public void testCommandQuickExitFailure() { + @Disabled("This test can fail to throw an AssertionError if the container doesn't fail quickly enough") + void testCommandQuickExitFailure() { try (GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE).withCommand("/bin/false")) { assertThatThrownBy(container::start) .hasStackTraceContaining("Container startup failed") @@ -27,7 +27,7 @@ public void testCommandQuickExitFailure() { } @Test - public void testCommandStaysRunning() { + void testCommandStaysRunning() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE).withCommand("/bin/sleep", "60") ) { 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 b7d9fd5a6fa..c494100544f 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 @@ -1,9 +1,9 @@ package org.testcontainers.containers.wait.internal; import com.google.common.collect.ImmutableSet; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.wait.strategy.WaitStrategyTarget; import java.net.ServerSocket; @@ -13,7 +13,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ExternalPortListeningCheckTest { +class ExternalPortListeningCheckTest { private ServerSocket listeningSocket1; @@ -23,7 +23,7 @@ public class ExternalPortListeningCheckTest { private WaitStrategyTarget mockContainer; - @Before + @BeforeEach public void setUp() throws Exception { listeningSocket1 = new ServerSocket(0); listeningSocket2 = new ServerSocket(0); @@ -36,7 +36,7 @@ public void setUp() throws Exception { } @Test - public void singleListening() { + void singleListening() { final ExternalPortListeningCheck check = new ExternalPortListeningCheck( mockContainer, ImmutableSet.of(listeningSocket1.getLocalPort()) @@ -48,7 +48,7 @@ public void singleListening() { } @Test - public void multipleListening() { + void multipleListening() { final ExternalPortListeningCheck check = new ExternalPortListeningCheck( mockContainer, ImmutableSet.of(listeningSocket1.getLocalPort(), listeningSocket2.getLocalPort()) @@ -60,7 +60,7 @@ public void multipleListening() { } @Test - public void oneNotListening() { + void oneNotListening() { final ExternalPortListeningCheck check = new ExternalPortListeningCheck( mockContainer, ImmutableSet.of(listeningSocket1.getLocalPort(), nonListeningSocket.getLocalPort()) @@ -71,7 +71,7 @@ public void oneNotListening() { .isInstanceOf(IllegalStateException.class); } - @After + @AfterEach public void tearDown() throws Exception { listeningSocket1.close(); listeningSocket2.close(); diff --git a/core/src/test/java/org/testcontainers/containers/wait/internal/InternalCommandPortListeningCheckTest.java b/core/src/test/java/org/testcontainers/containers/wait/internal/InternalCommandPortListeningCheckTest.java index d93eb90c339..936be73fd3e 100644 --- a/core/src/test/java/org/testcontainers/containers/wait/internal/InternalCommandPortListeningCheckTest.java +++ b/core/src/test/java/org/testcontainers/containers/wait/internal/InternalCommandPortListeningCheckTest.java @@ -1,48 +1,46 @@ package org.testcontainers.containers.wait.internal; import com.google.common.collect.ImmutableSet; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.TimeoutException; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.containers.GenericContainer; import org.testcontainers.images.builder.ImageFromDockerfile; import java.util.Arrays; +import java.util.List; import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.fail; -@RunWith(Parameterized.class) -public class InternalCommandPortListeningCheckTest { +@ParameterizedClass(name = "{index} - {0}") +@MethodSource("data") +class InternalCommandPortListeningCheckTest { - @Parameterized.Parameters(name = "{index} - {0}") - public static Iterable data() { + public static List data() { return Arrays.asList( - new Object[][] { - { "internal-port-check-dockerfile/Dockerfile-tcp" }, - { "internal-port-check-dockerfile/Dockerfile-nc" }, - { "internal-port-check-dockerfile/Dockerfile-bash" }, - } + "internal-port-check-dockerfile/Dockerfile-tcp", + "internal-port-check-dockerfile/Dockerfile-nc", + "internal-port-check-dockerfile/Dockerfile-bash" ); } - @Rule - public GenericContainer container; + public GenericContainer container; public InternalCommandPortListeningCheckTest(String dockerfile) { container = - new GenericContainer( + new GenericContainer<>( new ImageFromDockerfile() .withFileFromClasspath("Dockerfile", dockerfile) .withFileFromClasspath("nginx.conf", "internal-port-check-dockerfile/nginx.conf") ); + container.start(); } @Test - public void singleListening() { + void singleListening() { final InternalCommandPortListeningCheck check = new InternalCommandPortListeningCheck( container, ImmutableSet.of(8080) @@ -52,7 +50,7 @@ public void singleListening() { } @Test - public void nonListening() { + void nonListening() { final InternalCommandPortListeningCheck check = new InternalCommandPortListeningCheck( container, ImmutableSet.of(8080, 1234) @@ -65,7 +63,7 @@ public void nonListening() { } @Test - public void lowAndHighPortListening() { + void lowAndHighPortListening() { final InternalCommandPortListeningCheck check = new InternalCommandPortListeningCheck( container, ImmutableSet.of(100, 8080) diff --git a/core/src/test/java/org/testcontainers/containers/wait/strategy/DockerHealthcheckWaitStrategyTest.java b/core/src/test/java/org/testcontainers/containers/wait/strategy/DockerHealthcheckWaitStrategyTest.java index 0cbf257e9b5..653bbca2e33 100644 --- a/core/src/test/java/org/testcontainers/containers/wait/strategy/DockerHealthcheckWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/containers/wait/strategy/DockerHealthcheckWaitStrategyTest.java @@ -1,7 +1,7 @@ package org.testcontainers.containers.wait.strategy; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.containers.GenericContainer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -11,11 +11,11 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class DockerHealthcheckWaitStrategyTest { +class DockerHealthcheckWaitStrategyTest { private GenericContainer container; - @Before + @BeforeEach public void setUp() { // Using a Dockerfile here, since Dockerfile builder DSL doesn't support HEALTHCHECK container = @@ -31,12 +31,12 @@ public void setUp() { } @Test - public void startsOnceHealthy() { + void startsOnceHealthy() { container.start(); } @Test - public void containerStartFailsIfContainerIsUnhealthy() { + void containerStartFailsIfContainerIsUnhealthy() { container.withCommand("tail", "-f", "/dev/null"); assertThat(catchThrowable(container::start)) .as("Container launch fails when unhealthy") diff --git a/core/src/test/java/org/testcontainers/containers/wait/strategy/WaitAllStrategyTest.java b/core/src/test/java/org/testcontainers/containers/wait/strategy/WaitAllStrategyTest.java index 8b69553e5ab..aeebe425776 100644 --- a/core/src/test/java/org/testcontainers/containers/wait/strategy/WaitAllStrategyTest.java +++ b/core/src/test/java/org/testcontainers/containers/wait/strategy/WaitAllStrategyTest.java @@ -1,7 +1,7 @@ package org.testcontainers.containers.wait.strategy; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.InOrder; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -20,7 +20,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; -public class WaitAllStrategyTest { +class WaitAllStrategyTest { @Mock private GenericContainer container; @@ -34,7 +34,7 @@ public class WaitAllStrategyTest { @Mock private WaitStrategy strategy3; - @Before + @BeforeEach public void setUp() { MockitoAnnotations.initMocks(this); } @@ -43,7 +43,7 @@ public void setUp() { * Dummy-based tests, to check that timeout values are propagated correctly, without involving actual timing-sensitive code */ @Test - public void parentTimeoutApplies() { + void parentTimeoutApplies() { DummyStrategy child1 = new DummyStrategy(Duration.ofMillis(10)); child1.withStartupTimeout(Duration.ofMillis(20)); @@ -55,7 +55,7 @@ public void parentTimeoutApplies() { } @Test - public void parentTimeoutAppliesToMultipleChildren() { + void parentTimeoutAppliesToMultipleChildren() { Duration defaultInnerWait = Duration.ofMillis(2); Duration outerWait = Duration.ofMillis(6); @@ -73,7 +73,7 @@ public void parentTimeoutAppliesToMultipleChildren() { } @Test - public void parentTimeoutAppliesToAdditionalChildren() { + void parentTimeoutAppliesToAdditionalChildren() { Duration defaultInnerWait = Duration.ofMillis(2); Duration outerWait = Duration.ofMillis(20); @@ -94,7 +94,7 @@ public void parentTimeoutAppliesToAdditionalChildren() { * Mock-based tests to check overall behaviour, without involving timing-sensitive code */ @Test - public void childExecutionTest() { + void childExecutionTest() { final WaitStrategy underTest = new WaitAllStrategy().withStrategy(strategy1).withStrategy(strategy2); doNothing().when(strategy1).waitUntilReady(eq(container)); @@ -108,7 +108,7 @@ public void childExecutionTest() { } @Test - public void withoutOuterTimeoutShouldRelyOnInnerStrategies() { + void withoutOuterTimeoutShouldRelyOnInnerStrategies() { final WaitStrategy underTest = new WaitAllStrategy(WaitAllStrategy.Mode.WITH_INDIVIDUAL_TIMEOUTS_ONLY) .withStrategy(strategy1) .withStrategy(strategy2) @@ -132,7 +132,7 @@ public void withoutOuterTimeoutShouldRelyOnInnerStrategies() { } @Test - public void timeoutChangeShouldNotBePossibleWithIndividualTimeoutMode() { + void timeoutChangeShouldNotBePossibleWithIndividualTimeoutMode() { final WaitStrategy underTest = new WaitAllStrategy(WaitAllStrategy.Mode.WITH_INDIVIDUAL_TIMEOUTS_ONLY); assertThat( @@ -145,7 +145,7 @@ public void timeoutChangeShouldNotBePossibleWithIndividualTimeoutMode() { } @Test - public void shouldNotMessWithIndividualTimeouts() { + void shouldNotMessWithIndividualTimeouts() { new WaitAllStrategy(WaitAllStrategy.Mode.WITH_INDIVIDUAL_TIMEOUTS_ONLY) .withStrategy(strategy1) .withStrategy(strategy2); @@ -155,7 +155,7 @@ public void shouldNotMessWithIndividualTimeouts() { } @Test - public void shouldOverwriteIndividualTimeouts() { + void shouldOverwriteIndividualTimeouts() { Duration someSeconds = Duration.ofSeconds(23); new WaitAllStrategy().withStartupTimeout(someSeconds).withStrategy(strategy1).withStrategy(strategy2); diff --git a/core/src/test/java/org/testcontainers/dockerclient/AmbiguousImagePullTest.java b/core/src/test/java/org/testcontainers/dockerclient/AmbiguousImagePullTest.java index f67ad212d77..df351b9fd74 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/AmbiguousImagePullTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/AmbiguousImagePullTest.java @@ -1,14 +1,16 @@ package org.testcontainers.dockerclient; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.DockerRegistryContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.utility.DockerImageName; -public class AmbiguousImagePullTest { +class AmbiguousImagePullTest { - @Test(timeout = 30_000) - public void testNotUsingParse() { + @Test + @Timeout(30) + void testNotUsingParse() { try (DockerRegistryContainer registryContainer = new DockerRegistryContainer()) { registryContainer.start(); DockerImageName imageName = registryContainer.createImage("latest"); diff --git a/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java b/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java index 757816cb189..f3bc15d2c22 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/DockerClientConfigUtilsTest.java @@ -2,19 +2,20 @@ import com.github.dockerjava.api.DockerClient; import org.assertj.core.api.Assumptions; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.DockerClientFactory; import java.net.URI; import static org.assertj.core.api.Assertions.assertThat; -public class DockerClientConfigUtilsTest { +class DockerClientConfigUtilsTest { DockerClient client = DockerClientFactory.lazyClient(); @Test - public void getDockerHostIpAddressShouldReturnLocalhostWhenUnixSocket() { + void getDockerHostIpAddressShouldReturnLocalhostWhenUnixSocket() { Assumptions.assumeThat(DockerClientConfigUtils.IN_A_CONTAINER).as("in a container").isFalse(); String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress( @@ -26,7 +27,7 @@ public void getDockerHostIpAddressShouldReturnLocalhostWhenUnixSocket() { } @Test - public void getDockerHostIpAddressShouldReturnDockerHostIpWhenHttpsUri() { + void getDockerHostIpAddressShouldReturnDockerHostIpWhenHttpsUri() { String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress( client, URI.create("http://12.23.34.45"), @@ -36,7 +37,7 @@ public void getDockerHostIpAddressShouldReturnDockerHostIpWhenHttpsUri() { } @Test - public void getDockerHostIpAddressShouldReturnDockerHostIpWhenTcpUri() { + void getDockerHostIpAddressShouldReturnDockerHostIpWhenTcpUri() { String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress( client, URI.create("tcp://12.23.34.45"), @@ -46,7 +47,7 @@ public void getDockerHostIpAddressShouldReturnDockerHostIpWhenTcpUri() { } @Test - public void getDockerHostIpAddressShouldReturnNullWhenUnsupportedUriScheme() { + void getDockerHostIpAddressShouldReturnNullWhenUnsupportedUriScheme() { String actual = DockerClientProviderStrategy.resolveDockerHostIpAddress( client, URI.create("gopher://12.23.34.45"), @@ -55,8 +56,9 @@ public void getDockerHostIpAddressShouldReturnNullWhenUnsupportedUriScheme() { assertThat(actual).isNull(); } - @Test(timeout = 5_000) - public void getDefaultGateway() { + @Test + @Timeout(5) + void getDefaultGateway() { assertThat(DockerClientConfigUtils.getDefaultGateway()).isNotNull(); } } diff --git a/core/src/test/java/org/testcontainers/dockerclient/EnvironmentAndSystemPropertyClientProviderStrategyTest.java b/core/src/test/java/org/testcontainers/dockerclient/EnvironmentAndSystemPropertyClientProviderStrategyTest.java index 58bd6984401..be4dcd446a8 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/EnvironmentAndSystemPropertyClientProviderStrategyTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/EnvironmentAndSystemPropertyClientProviderStrategyTest.java @@ -2,13 +2,11 @@ import com.github.dockerjava.core.DefaultDockerClientConfig; import com.github.dockerjava.transport.SSLConfig; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.testcontainers.utility.MockTestcontainersConfigurationRule; +import org.testcontainers.utility.MockTestcontainersConfigurationExtension; import org.testcontainers.utility.TestcontainersConfiguration; import java.io.IOException; @@ -27,17 +25,14 @@ * Test that we can use Testcontainers configuration file to override settings. We assume that docker-java has test * coverage for detection of environment variables (e.g. DOCKER_HOST) and its own properties config file. */ -@RunWith(MockitoJUnitRunner.class) -public class EnvironmentAndSystemPropertyClientProviderStrategyTest { - - @Rule - public MockTestcontainersConfigurationRule mockConfig = new MockTestcontainersConfigurationRule(); +@ExtendWith(MockTestcontainersConfigurationExtension.class) +class EnvironmentAndSystemPropertyClientProviderStrategyTest { private URI defaultDockerHost; private com.github.dockerjava.core.SSLConfig defaultSSLConfig; - @Before + @BeforeEach public void checkEnvironmentClear() { // If docker-java picks up non-default settings from the environment, our test needs to know to expect those DefaultDockerClientConfig defaultConfig = DefaultDockerClientConfig.createDefaultConfigBuilder().build(); @@ -46,7 +41,7 @@ public void checkEnvironmentClear() { } @Test - public void testWhenConfigAbsent() { + void testWhenConfigAbsent() { Mockito .doReturn("auto") .when(TestcontainersConfiguration.getInstance()) @@ -72,7 +67,7 @@ public void testWhenConfigAbsent() { } @Test - public void testWhenDockerHostPresent() { + void testWhenDockerHostPresent() { Mockito .doReturn("auto") .when(TestcontainersConfiguration.getInstance()) @@ -98,7 +93,7 @@ public void testWhenDockerHostPresent() { } @Test - public void testWhenDockerHostAndSSLConfigPresent() throws IOException { + void testWhenDockerHostAndSSLConfigPresent() throws IOException { Path tempDir = Files.createTempDirectory("testcontainers-test"); String tempDirPath = tempDir.toAbsolutePath().toString(); @@ -129,7 +124,7 @@ public void testWhenDockerHostAndSSLConfigPresent() throws IOException { } @Test - public void applicableWhenIgnoringUserPropertiesAndConfigured() { + void applicableWhenIgnoringUserPropertiesAndConfigured() { Mockito .doReturn("autoIgnoringUserProperties") .when(TestcontainersConfiguration.getInstance()) @@ -147,7 +142,7 @@ public void applicableWhenIgnoringUserPropertiesAndConfigured() { } @Test - public void notApplicableWhenIgnoringUserPropertiesAndNotConfigured() { + void notApplicableWhenIgnoringUserPropertiesAndNotConfigured() { assumeThat(System.getenv("DOCKER_HOST")).isNull(); Mockito diff --git a/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java b/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java index 642eb6d7390..2976c56c7a9 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/EventStreamTest.java @@ -4,9 +4,8 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.core.command.EventsResultCallback; import org.jetbrains.annotations.NotNull; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.Timeout; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.DockerClientFactory; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; @@ -20,16 +19,14 @@ /** * Test that event streaming from the {@link DockerClient} works correctly */ -public class EventStreamTest { - - @Rule - public Timeout timeout = new Timeout(10, TimeUnit.SECONDS); +@Timeout(10) +class EventStreamTest { /** * Test that docker events can be streamed from the client. */ @Test - public void test() throws IOException, InterruptedException { + void test() throws IOException, InterruptedException { CountDownLatch latch = new CountDownLatch(1); try ( diff --git a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java index 42cff09c335..d5329430e71 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/ImagePullTest.java @@ -1,18 +1,13 @@ package org.testcontainers.dockerclient; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import org.testcontainers.utility.DockerImageName; -@RunWith(Parameterized.class) -public class ImagePullTest { +class ImagePullTest { - private final String image; - - @Parameterized.Parameters(name = "{0}") public static String[] parameters() { return new String[] { "alpine:latest", @@ -26,12 +21,9 @@ public static String[] parameters() { }; } - public ImagePullTest(String image) { - this.image = image; - } - - @Test - public void test() { + @ParameterizedTest(name = "{0}") + @MethodSource("parameters") + void test(String image) { try ( final GenericContainer container = new GenericContainer<>(DockerImageName.parse(image)) .withCommand("/bin/sh", "-c", "sleep 0") diff --git a/core/src/test/java/org/testcontainers/dockerclient/TestcontainersHostPropertyClientProviderStrategyTest.java b/core/src/test/java/org/testcontainers/dockerclient/TestcontainersHostPropertyClientProviderStrategyTest.java index 4ebdb300a2f..2c3d3ac40de 100644 --- a/core/src/test/java/org/testcontainers/dockerclient/TestcontainersHostPropertyClientProviderStrategyTest.java +++ b/core/src/test/java/org/testcontainers/dockerclient/TestcontainersHostPropertyClientProviderStrategyTest.java @@ -1,29 +1,20 @@ package org.testcontainers.dockerclient; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; -import org.mockito.junit.MockitoJUnitRunner; -import org.testcontainers.utility.MockTestcontainersConfigurationRule; +import org.testcontainers.utility.MockTestcontainersConfigurationExtension; import org.testcontainers.utility.TestcontainersConfiguration; -import java.net.URI; - import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; -@RunWith(MockitoJUnitRunner.class) -public class TestcontainersHostPropertyClientProviderStrategyTest { - - @Rule - public MockTestcontainersConfigurationRule mockConfig = new MockTestcontainersConfigurationRule(); - - private URI defaultDockerHost; +@ExtendWith(MockTestcontainersConfigurationExtension.class) +class TestcontainersHostPropertyClientProviderStrategyTest { @Test - public void tcHostPropertyIsProvided() { + void tcHostPropertyIsProvided() { Mockito .doReturn("tcp://127.0.0.1:9000") .when(TestcontainersConfiguration.getInstance()) @@ -37,7 +28,7 @@ public void tcHostPropertyIsProvided() { } @Test - public void tcHostPropertyIsNotProvided() { + void tcHostPropertyIsNotProvided() { Mockito.doReturn(null).when(TestcontainersConfiguration.getInstance()).getUserProperty(eq("tc.host"), isNull()); TestcontainersHostPropertyClientProviderStrategy strategy = new TestcontainersHostPropertyClientProviderStrategy(); diff --git a/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java b/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java index 0bdf969688b..254633ea6e7 100644 --- a/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/AgeBasedPullPolicyTest.java @@ -1,6 +1,6 @@ package org.testcontainers.images; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import java.time.Duration; @@ -10,12 +10,12 @@ import static org.assertj.core.api.Assertions.assertThat; -public class AgeBasedPullPolicyTest { +class AgeBasedPullPolicyTest { final DockerImageName imageName = DockerImageName.parse(UUID.randomUUID().toString()); @Test - public void shouldPull() { + void shouldPull() { ImageData imageData = ImageData.builder().createdAt(Instant.now().minus(2, ChronoUnit.HOURS)).build(); AgeBasedPullPolicy oneHour = new AgeBasedPullPolicy(Duration.of(1L, ChronoUnit.HOURS)); diff --git a/core/src/test/java/org/testcontainers/images/ImageDataTest.java b/core/src/test/java/org/testcontainers/images/ImageDataTest.java index 6ff75e9e355..b9fe0ae3c42 100644 --- a/core/src/test/java/org/testcontainers/images/ImageDataTest.java +++ b/core/src/test/java/org/testcontainers/images/ImageDataTest.java @@ -1,23 +1,23 @@ package org.testcontainers.images; import com.github.dockerjava.api.command.InspectImageResponse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.time.Instant; import static org.assertj.core.api.Assertions.assertThat; -public class ImageDataTest { +class ImageDataTest { @Test - public void shouldReadTimestampWithoutOffsetFromInspectImageResponse() { + void shouldReadTimestampWithoutOffsetFromInspectImageResponse() { final String timestamp = "2020-07-27T18:23:31.365190246Z"; final ImageData imageData = ImageData.from(new InspectImageResponse().withCreated(timestamp)); assertThat(imageData.getCreatedAt()).isEqualTo(Instant.parse(timestamp)); } @Test - public void shouldReadTimestampWithOffsetFromInspectImageResponse() { + void shouldReadTimestampWithOffsetFromInspectImageResponse() { final String timestamp = "2020-07-27T18:23:31.365190246+02:00"; final ImageData imageData = ImageData.from(new InspectImageResponse().withCreated(timestamp)); assertThat(imageData.getCreatedAt()).isEqualTo(Instant.parse("2020-07-27T16:23:31.365190246Z")); diff --git a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java index a885c035e5c..6c763de2962 100644 --- a/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/ImagePullPolicyTest.java @@ -1,8 +1,8 @@ package org.testcontainers.images; import com.github.dockerjava.api.exception.NotFoundException; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.testcontainers.DockerClientFactory; import org.testcontainers.DockerRegistryContainer; @@ -14,22 +14,26 @@ import static org.assertj.core.api.Assertions.fail; import static org.mockito.ArgumentMatchers.any; -public class ImagePullPolicyTest { +class ImagePullPolicyTest { - @ClassRule + @AutoClose public static DockerRegistryContainer registry = new DockerRegistryContainer(); private final DockerImageName imageName = registry.createImage(); + static { + registry.start(); + } + @Test - public void pullsByDefault() { + void pullsByDefault() { try (GenericContainer container = new GenericContainer<>(imageName).withExposedPorts(8080)) { container.start(); } } @Test - public void shouldAlwaysPull() { + void shouldAlwaysPull() { try (GenericContainer container = new GenericContainer<>(imageName).withExposedPorts(8080)) { container.start(); } @@ -52,7 +56,7 @@ public void shouldAlwaysPull() { } @Test - public void shouldSupportCustomPolicies() { + void shouldSupportCustomPolicies() { try ( // custom_image_pull_policy { GenericContainer container = new GenericContainer<>(imageName) @@ -72,7 +76,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma } @Test - public void shouldCheckPolicy() { + void shouldCheckPolicy() { ImagePullPolicy policy = Mockito.spy( new AbstractImagePullPolicy() { @Override @@ -93,7 +97,7 @@ protected boolean shouldPullCached(DockerImageName imageName, ImageData localIma } @Test - public void shouldNotForcePulling() { + void shouldNotForcePulling() { try ( GenericContainer container = new GenericContainer<>(imageName) .withImagePullPolicy(__ -> false) diff --git a/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java b/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java index 43c026ea294..a18d0130383 100644 --- a/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java +++ b/core/src/test/java/org/testcontainers/images/OverrideImagePullPolicyTest.java @@ -1,28 +1,26 @@ package org.testcontainers.images; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; import org.testcontainers.DockerRegistryContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.utility.FakeImagePullPolicy; -import org.testcontainers.utility.MockTestcontainersConfigurationRule; +import org.testcontainers.utility.MockTestcontainersConfigurationExtension; import org.testcontainers.utility.TestcontainersConfiguration; import static org.assertj.core.api.Assertions.assertThat; -public class OverrideImagePullPolicyTest { - - @Rule - public MockTestcontainersConfigurationRule config = new MockTestcontainersConfigurationRule(); +@ExtendWith(MockTestcontainersConfigurationExtension.class) +class OverrideImagePullPolicyTest { private ImagePullPolicy originalInstance; private ImagePullPolicy originalDefaultImplementation; - @Before + @BeforeEach public void setUp() { this.originalInstance = PullPolicy.instance; this.originalDefaultImplementation = PullPolicy.defaultImplementation; @@ -30,14 +28,14 @@ public void setUp() { PullPolicy.defaultImplementation = Mockito.mock(ImagePullPolicy.class); } - @After + @AfterEach public void tearDown() { PullPolicy.instance = originalInstance; PullPolicy.defaultImplementation = originalDefaultImplementation; } @Test - public void simpleConfigurationTest() { + void simpleConfigurationTest() { Mockito .doReturn(FakeImagePullPolicy.class.getCanonicalName()) .when(TestcontainersConfiguration.getInstance()) @@ -53,7 +51,7 @@ public void simpleConfigurationTest() { } @Test - public void alwaysPullConfigurationTest() { + void alwaysPullConfigurationTest() { Mockito .doReturn(AlwaysPullPolicy.class.getCanonicalName()) .when(TestcontainersConfiguration.getInstance()) diff --git a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java index f8c66860022..e881f0167e2 100644 --- a/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java +++ b/core/src/test/java/org/testcontainers/images/ParsedDockerfileTest.java @@ -1,17 +1,17 @@ package org.testcontainers.images; import com.google.common.collect.Sets; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.nio.file.Paths; import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; -public class ParsedDockerfileTest { +class ParsedDockerfileTest { @Test - public void doesSimpleParsing() { + void doesSimpleParsing() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM someimage", "RUN something") ); @@ -21,7 +21,7 @@ public void doesSimpleParsing() { } @Test - public void isCaseInsensitive() { + void isCaseInsensitive() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("from someimage", "RUN something") ); @@ -31,7 +31,7 @@ public void isCaseInsensitive() { } @Test - public void handlesTags() { + void handlesTags() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM someimage:tag", "RUN something") ); @@ -41,7 +41,7 @@ public void handlesTags() { } @Test - public void handlesDigests() { + void handlesDigests() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM someimage@sha256:abc123", "RUN something") ); @@ -51,7 +51,7 @@ public void handlesDigests() { } @Test - public void ignoringCommentedFromLines() { + void ignoringCommentedFromLines() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM someimage", "#FROM somethingelse") ); @@ -61,7 +61,7 @@ public void ignoringCommentedFromLines() { } @Test - public void ignoringBuildStageNames() { + void ignoringBuildStageNames() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM someimage --as=base", "RUN something", "FROM nextimage", "RUN something") ); @@ -71,7 +71,7 @@ public void ignoringBuildStageNames() { } @Test - public void ignoringPlatformArgs() { + void ignoringPlatformArgs() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM --platform=linux/amd64 someimage", "RUN something") ); @@ -81,7 +81,7 @@ public void ignoringPlatformArgs() { } @Test - public void ignoringExtraPlatformArgs() { + void ignoringExtraPlatformArgs() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("FROM --platform=linux/amd64 --somethingelse=value someimage", "RUN something") ); @@ -91,7 +91,7 @@ public void ignoringExtraPlatformArgs() { } @Test - public void handlesGracefullyIfNoFromLine() { + void handlesGracefullyIfNoFromLine() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile( Arrays.asList("RUN something", "# is this even a valid Dockerfile?") ); @@ -101,7 +101,7 @@ public void handlesGracefullyIfNoFromLine() { } @Test - public void handlesGracefullyIfDockerfileNotFound() { + void handlesGracefullyIfDockerfileNotFound() { final ParsedDockerfile parsedDockerfile = new ParsedDockerfile(Paths.get("nonexistent.Dockerfile")); assertThat(parsedDockerfile.getDependencyImageNames()) .as("handles missing Dockerfiles gracefully") diff --git a/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java b/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java index 9e4ac66fb53..156df3ae7d3 100644 --- a/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java +++ b/core/src/test/java/org/testcontainers/images/RemoteDockerImageTest.java @@ -1,6 +1,7 @@ package org.testcontainers.images; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.utility.Base58; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.LazyFuture; @@ -11,17 +12,17 @@ import static org.assertj.core.api.Assertions.assertThat; -public class RemoteDockerImageTest { +class RemoteDockerImageTest { @Test - public void toStringContainsOnlyImageName() { + void toStringContainsOnlyImageName() { String imageName = Base58.randomString(8).toLowerCase(); RemoteDockerImage remoteDockerImage = new RemoteDockerImage(DockerImageName.parse(imageName)); assertThat(remoteDockerImage.toString()).contains("imageName=" + imageName); } @Test - public void toStringWithExceptionContainsOnlyImageNameFuture() { + void toStringWithExceptionContainsOnlyImageNameFuture() { CompletableFuture imageNameFuture = new CompletableFuture<>(); imageNameFuture.completeExceptionally(new RuntimeException("arbitrary")); @@ -29,8 +30,9 @@ public void toStringWithExceptionContainsOnlyImageNameFuture() { assertThat(remoteDockerImage.toString()).contains("imageName=java.lang.RuntimeException: arbitrary"); } - @Test(timeout = 5000L) - public void toStringDoesntResolveImageNameFuture() { + @Test + @Timeout(5) + void toStringDoesntResolveImageNameFuture() { CompletableFuture imageNameFuture = new CompletableFuture<>(); // verify that we've set up the test properly @@ -47,8 +49,9 @@ public void toStringDoesntResolveImageNameFuture() { assertThat(remoteDockerImage.toString()).contains("imageName=" + imageName); } - @Test(timeout = 5000L) - public void toStringDoesntResolveLazyFuture() throws Exception { + @Test + @Timeout(5) + void toStringDoesntResolveLazyFuture() throws Exception { String imageName = Base58.randomString(8).toLowerCase(); AtomicBoolean resolved = new AtomicBoolean(false); Future imageNameFuture = new LazyFuture() { diff --git a/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java b/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java index b2c7075f4d2..fae6fc3193d 100644 --- a/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/DockerfileBuildTest.java @@ -1,8 +1,8 @@ package org.testcontainers.images.builder; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -10,20 +10,15 @@ import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class DockerfileBuildTest { +class DockerfileBuildTest { static final Path RESOURCE_PATH = Paths.get("src/test/resources/dockerfile-build-test"); - public String expectedFileContent; - - public ImageFromDockerfile image; - - @Parameterized.Parameters - public static Object[][] parameters() { + public static Stream parameters() { Map buildArgs = new HashMap<>(4); buildArgs.put("BUILD_IMAGE", "alpine:3.16"); buildArgs.put("BASE_IMAGE", "alpine"); @@ -31,55 +26,50 @@ public static Object[][] parameters() { buildArgs.put("UNUSED", "ignored"); //noinspection deprecation - return new Object[][] { + return Stream.of( // Dockerfile build without explicit per-file inclusion - new Object[] { + Arguments.of( "test1234", // spotless:off // docsShowRecursiveFileInclusion { new ImageFromDockerfile() - .withFileFromPath(".", RESOURCE_PATH), + .withFileFromPath(".", RESOURCE_PATH)), // } // spotless:on - }, // Dockerfile build using a non-standard Dockerfile - new Object[] { + Arguments.of( "test4567", - new ImageFromDockerfile().withFileFromPath(".", RESOURCE_PATH).withDockerfilePath("./Dockerfile-alt"), - }, + new ImageFromDockerfile().withFileFromPath(".", RESOURCE_PATH).withDockerfilePath("./Dockerfile-alt") + ), // Dockerfile build using withBuildArg() - new Object[] { + Arguments.of( "test7890", new ImageFromDockerfile() .withFileFromPath(".", RESOURCE_PATH) .withDockerfilePath("./Dockerfile-buildarg") - .withBuildArg("CUSTOM_ARG", "test7890"), - }, + .withBuildArg("CUSTOM_ARG", "test7890") + ), // Dockerfile build using withBuildArgs() with build args in FROM statement - new Object[] { + Arguments.of( "test1234", new ImageFromDockerfile() .withFileFromPath(".", RESOURCE_PATH) .withDockerfile(RESOURCE_PATH.resolve("Dockerfile-from-buildarg")) - .withBuildArgs(buildArgs), - }, + .withBuildArgs(buildArgs) + ), // Dockerfile build using withDockerfile(File) - new Object[] { + Arguments.of( "test4567", new ImageFromDockerfile() .withFileFromPath(".", RESOURCE_PATH) - .withDockerfile(RESOURCE_PATH.resolve("Dockerfile-alt")), - }, - }; - } - - public DockerfileBuildTest(String expectedFileContent, ImageFromDockerfile image) { - this.expectedFileContent = expectedFileContent; - this.image = image; + .withDockerfile(RESOURCE_PATH.resolve("Dockerfile-alt")) + ) + ); } - @Test - public void performTest() { + @ParameterizedTest + @MethodSource("parameters") + void performTest(String expectedFileContent, ImageFromDockerfile image) { try ( final GenericContainer container = new GenericContainer<>(image) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) diff --git a/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java b/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java index 8c6d288da99..6f7329f9dd2 100644 --- a/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/DockerignoreTest.java @@ -1,7 +1,7 @@ package org.testcontainers.images.builder; import com.github.dockerjava.api.exception.DockerClientException; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import org.testcontainers.utility.DockerImageName; @@ -12,12 +12,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; -public class DockerignoreTest { +class DockerignoreTest { private static final Path INVALID_DOCKERIGNORE_PATH = Paths.get("src/test/resources/dockerfile-build-invalid"); @Test - public void testInvalidDockerignore() throws Exception { + void testInvalidDockerignore() throws Exception { try { new ImageFromDockerfile() .withFileFromPath(".", INVALID_DOCKERIGNORE_PATH) @@ -33,7 +33,7 @@ public void testInvalidDockerignore() throws Exception { @SuppressWarnings("resource") @Test - public void testValidDockerignore() throws Exception { + void testValidDockerignore() throws Exception { ImageFromDockerfile img = new ImageFromDockerfile() .withFileFromPath(".", DockerfileBuildTest.RESOURCE_PATH) .withDockerfile(DockerfileBuildTest.RESOURCE_PATH.resolve("Dockerfile-currentdir")); diff --git a/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java b/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java index b761d984187..0ce8ec041bf 100644 --- a/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/ImageFromDockerfileTest.java @@ -2,16 +2,16 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.api.command.InspectImageResponse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.utility.Base58; import static org.assertj.core.api.Assertions.assertThat; -public class ImageFromDockerfileTest { +class ImageFromDockerfileTest { @Test - public void shouldAddDefaultLabels() { + void shouldAddDefaultLabels() { ImageFromDockerfile image = new ImageFromDockerfile().withDockerfileFromBuilder(it -> it.from("scratch")); String imageId = image.resolve(); @@ -25,7 +25,7 @@ public void shouldAddDefaultLabels() { } @Test - public void shouldNotAddSessionLabelIfDeleteOnExitIsFalse() { + void shouldNotAddSessionLabelIfDeleteOnExitIsFalse() { ImageFromDockerfile image = new ImageFromDockerfile( "localhost/testcontainers/" + Base58.randomString(16).toLowerCase(), false diff --git a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/AbstractStatementTest.java b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/AbstractStatementTest.java index 0c47d556137..28cb0407f25 100644 --- a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/AbstractStatementTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/AbstractStatementTest.java @@ -3,8 +3,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.exception.ExceptionUtils; -import org.junit.Rule; -import org.junit.rules.TestName; +import org.junit.jupiter.api.TestInfo; import org.rnorth.ducttape.Preconditions; import java.io.InputStream; @@ -14,13 +13,17 @@ public abstract class AbstractStatementTest { - @Rule - public TestName testName = new TestName(); + private final TestInfo testInfo; + + AbstractStatementTest(TestInfo testInfo) { + this.testInfo = testInfo; + } protected void assertStatement(Statement statement) { + String testName = testInfo.getTestMethod().get().getName(); String[] expectedLines = new String[0]; try { - String path = "fixtures/statements/" + getClass().getSimpleName() + "/" + testName.getMethodName(); + String path = "fixtures/statements/" + getClass().getSimpleName() + "/" + testName; InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path); Preconditions.check("inputStream is null for path " + path, inputStream != null); @@ -29,7 +32,7 @@ protected void assertStatement(Statement statement) { IOUtils.closeQuietly(inputStream); expectedLines = StringUtils.chomp(content.replaceAll("\r\n", "\n").trim()).split("\n"); } catch (Exception e) { - fail("can't load fixture '" + testName.getMethodName() + "'\n" + ExceptionUtils.getStackTrace(e)); + fail("can't load fixture '" + testName + "'\n" + ExceptionUtils.getStackTrace(e)); } StringBuilder builder = new StringBuilder(); diff --git a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/KeyValuesStatementTest.java b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/KeyValuesStatementTest.java index f446e48b42c..3ccd78faf7f 100644 --- a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/KeyValuesStatementTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/KeyValuesStatementTest.java @@ -1,14 +1,19 @@ package org.testcontainers.images.builder.dockerfile.statement; import com.google.common.collect.ImmutableMap; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; import java.util.Collections; -public class KeyValuesStatementTest extends AbstractStatementTest { +class KeyValuesStatementTest extends AbstractStatementTest { + + KeyValuesStatementTest(TestInfo testInfo) { + super(testInfo); + } @Test - public void multilineTest() throws Exception { + void multilineTest() throws Exception { ImmutableMap pairs = ImmutableMap .builder() .put("line1", "1") @@ -20,22 +25,22 @@ public void multilineTest() throws Exception { } @Test - public void keyWithSpacesTest() throws Exception { + void keyWithSpacesTest() throws Exception { assertStatement(new KeyValuesStatement("TEST", Collections.singletonMap("key with spaces", "1"))); } @Test - public void keyWithNewLinesTest() throws Exception { + void keyWithNewLinesTest() throws Exception { assertStatement(new KeyValuesStatement("TEST", Collections.singletonMap("key\nwith\nnewlines", "1"))); } @Test - public void keyWithTabsTest() throws Exception { + void keyWithTabsTest() throws Exception { assertStatement(new KeyValuesStatement("TEST", Collections.singletonMap("key\twith\ttab", "1"))); } @Test - public void valueIsEscapedTest() throws Exception { + void valueIsEscapedTest() throws Exception { ImmutableMap pairs = ImmutableMap .builder() .put("1", "value with spaces") diff --git a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/MultiArgsStatementTest.java b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/MultiArgsStatementTest.java index 50bc8bedd96..06d8fccccc0 100644 --- a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/MultiArgsStatementTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/MultiArgsStatementTest.java @@ -1,16 +1,21 @@ package org.testcontainers.images.builder.dockerfile.statement; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; -public class MultiArgsStatementTest extends AbstractStatementTest { +class MultiArgsStatementTest extends AbstractStatementTest { + + MultiArgsStatementTest(TestInfo testInfo) { + super(testInfo); + } @Test - public void simpleTest() throws Exception { + void simpleTest() { assertStatement(new MultiArgsStatement("TEST", "a", "b", "c")); } @Test - public void multilineTest() throws Exception { + void multilineTest() { assertStatement(new MultiArgsStatement("TEST", "some\nmultiline\nargument")); } } diff --git a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/RawStatementTest.java b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/RawStatementTest.java index 70724a03f09..d6964e0e5d7 100644 --- a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/RawStatementTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/RawStatementTest.java @@ -1,11 +1,16 @@ package org.testcontainers.images.builder.dockerfile.statement; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; -public class RawStatementTest extends AbstractStatementTest { +class RawStatementTest extends AbstractStatementTest { + + RawStatementTest(TestInfo testInfo) { + super(testInfo); + } @Test - public void simpleTest() throws Exception { + void simpleTest() throws Exception { assertStatement(new RawStatement("TEST", "value\nas\t\\\nis")); } } diff --git a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/SingleArgumentStatementTest.java b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/SingleArgumentStatementTest.java index dbdabab9fff..cf446ef1018 100644 --- a/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/SingleArgumentStatementTest.java +++ b/core/src/test/java/org/testcontainers/images/builder/dockerfile/statement/SingleArgumentStatementTest.java @@ -1,16 +1,21 @@ package org.testcontainers.images.builder.dockerfile.statement; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; -public class SingleArgumentStatementTest extends AbstractStatementTest { +class SingleArgumentStatementTest extends AbstractStatementTest { + + SingleArgumentStatementTest(TestInfo testInfo) { + super(testInfo); + } @Test - public void simpleTest() throws Exception { + void simpleTest() throws Exception { assertStatement(new SingleArgumentStatement("TEST", "hello")); } @Test - public void multilineTest() throws Exception { + void multilineTest() throws Exception { assertStatement(new SingleArgumentStatement("TEST", "hello\nworld")); } } diff --git a/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java b/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java index 4d919388eb7..fc28f771749 100644 --- a/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java +++ b/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java @@ -1,11 +1,11 @@ package org.testcontainers.junit; import com.github.dockerjava.api.model.Network; -import org.junit.After; -import org.junit.Assume; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.utility.TestEnvironment; @@ -25,13 +25,13 @@ public abstract class BaseComposeTest { private List existingNetworks = new ArrayList<>(); - @BeforeClass + @BeforeAll public static void checkVersion() { - Assume.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); + Assumptions.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); } @Test - public void simpleTest() { + void simpleTest() { Jedis jedis = new Jedis( getEnvironment().getServiceHost("redis-1", REDIS_PORT), getEnvironment().getServicePort("redis-1", REDIS_PORT) @@ -45,7 +45,7 @@ public void simpleTest() { } @Test - public void secondTest() { + void secondTest() { // used in manual checking for cleanup in between tests Jedis jedis = new Jedis( getEnvironment().getServiceHost("redis-1", REDIS_PORT), @@ -61,12 +61,12 @@ public void secondTest() { // However, @Rule creates a separate DockerComposeContainer instance per test, so this just shouldn't happen } - @Before + @BeforeEach public void captureNetworks() { existingNetworks.addAll(findAllNetworks()); } - @After + @AfterEach public void verifyNoNetworks() { assertThat(findAllNetworks()).as("The networks").isEqualTo(existingNetworks); } diff --git a/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java b/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java index c1aee4d7f2b..926fa301836 100644 --- a/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java +++ b/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java @@ -1,11 +1,11 @@ package org.testcontainers.junit; import com.github.dockerjava.api.model.Network; -import org.junit.After; -import org.junit.Assume; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Assumptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.utility.TestEnvironment; @@ -28,13 +28,13 @@ public abstract class BaseDockerComposeTest { private List existingNetworks = new ArrayList<>(); - @BeforeClass + @BeforeAll public static void checkVersion() { - Assume.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); + Assumptions.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); } @Test - public void simpleTest() { + void simpleTest() { Jedis jedis = new Jedis( getEnvironment().getServiceHost("redis_1", REDIS_PORT), getEnvironment().getServicePort("redis_1", REDIS_PORT) @@ -48,7 +48,7 @@ public void simpleTest() { } @Test - public void secondTest() { + void secondTest() { // used in manual checking for cleanup in between tests Jedis jedis = new Jedis( getEnvironment().getServiceHost("redis_1", REDIS_PORT), @@ -64,12 +64,12 @@ public void secondTest() { // However, @Rule creates a separate DockerComposeContainer instance per test, so this just shouldn't happen } - @Before + @BeforeEach public void captureNetworks() { existingNetworks.addAll(findAllNetworks()); } - @After + @AfterEach public void verifyNoNetworks() { assertThat(findAllNetworks()).as("The networks").isEqualTo(existingNetworks); } diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java index 453fe9207ad..8e5651903f6 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; import com.github.dockerjava.api.command.InspectContainerResponse; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerState; @@ -9,14 +9,14 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ComposeContainerOverrideTest { +class ComposeContainerOverrideTest { private static final File BASE = new File("src/test/resources/compose-override/compose.yml"); private static final File OVERRIDE = new File("src/test/resources/compose-override/compose-override.yml"); @Test - public void readEnvironment() { + void readEnvironment() { try (ComposeContainer compose = new ComposeContainer(BASE).withExposedService("redis", 6379)) { compose.start(); InspectContainerResponse container = compose @@ -28,7 +28,7 @@ public void readEnvironment() { } @Test - public void resetEnvironment() { + void resetEnvironment() { try (ComposeContainer compose = new ComposeContainer(BASE, OVERRIDE).withExposedService("redis", 6379)) { compose.start(); InspectContainerResponse container = compose diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java index b27f4b080da..dfe51acbebb 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java @@ -1,19 +1,23 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.ComposeContainer; import java.io.File; -public class ComposeContainerPortViaEnvTest extends BaseComposeTest { +class ComposeContainerPortViaEnvTest extends BaseComposeTest { - @Rule + @AutoClose public ComposeContainer environment = new ComposeContainer( new File("src/test/resources/v2-compose-test-port-via-env.yml") ) .withExposedService("redis-1", REDIS_PORT) .withEnv("REDIS_PORT", String.valueOf(REDIS_PORT)); + ComposeContainerPortViaEnvTest() { + this.environment.start(); + } + @Override protected ComposeContainer getEnvironment() { return environment; diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java index 83bc894b516..7614b49e303 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java @@ -1,10 +1,10 @@ package org.testcontainers.junit; -import org.junit.Assume; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; +import org.assertj.core.api.Assumptions; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.utility.TestEnvironment; import redis.clients.jedis.Jedis; @@ -13,18 +13,18 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ComposeContainerScalingTest { +class ComposeContainerScalingTest { private static final int REDIS_PORT = 6379; private Jedis[] clients = new Jedis[3]; - @BeforeClass + @BeforeAll public static void checkVersion() { - Assume.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); + Assumptions.assumeThat(TestEnvironment.dockerApiAtLeast("1.22")).isTrue(); } - @Rule + @AutoClose public ComposeContainer environment = new ComposeContainer( new File("src/test/resources/composev2/scaled-compose-test.yml") ) @@ -33,7 +33,11 @@ public static void checkVersion() { .withExposedService("redis-2", REDIS_PORT) // explicit service index .withExposedService("redis", 3, REDIS_PORT); // explicit service index via parameter - @Before + ComposeContainerScalingTest() { + environment.start(); + } + + @BeforeEach public void setupClients() { for (int i = 0; i < 3; i++) { String name = String.format("redis-%d", i + 1); @@ -44,7 +48,7 @@ public void setupClients() { } @Test - public void simpleTest() { + void simpleTest() { for (int i = 0; i < 3; i++) { clients[i].incr("somekey"); diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java index 39c7ff2baf5..2d87cd3aa49 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java @@ -1,7 +1,6 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.DockerComposeContainer; @@ -15,9 +14,8 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ComposeContainerTest extends BaseComposeTest { +class ComposeContainerTest extends BaseComposeTest { - @Rule // composeContainerConstructor { public ComposeContainer environment = new ComposeContainer( new File("src/test/resources/composev2/compose-test.yml") @@ -27,13 +25,17 @@ public class ComposeContainerTest extends BaseComposeTest { // } + ComposeContainerTest() { + environment.start(); + } + @Override protected ComposeContainer getEnvironment() { return environment; } @Test - public void testGetServiceHostAndPort() { + void testGetServiceHostAndPort() { // getServiceHostAndPort { String serviceHost = environment.getServiceHost("redis-1", REDIS_PORT); int serviceWithInstancePort = environment.getServicePort("redis-1", REDIS_PORT); @@ -48,7 +50,7 @@ public void testGetServiceHostAndPort() { } @Test - public void shouldRetrieveContainerByServiceName() { + void shouldRetrieveContainerByServiceName() { String existingServiceName = "db-1"; Optional result = environment.getContainerByServiceName(existingServiceName); assertThat(result) @@ -60,7 +62,7 @@ public void shouldRetrieveContainerByServiceName() { } @Test - public void shouldReturnEmptyResultOnNoneExistingService() { + void shouldReturnEmptyResultOnNoneExistingService() { String notExistingServiceName = "db-256"; Optional result = environment.getContainerByServiceName(notExistingServiceName); assertThat(result) @@ -69,7 +71,7 @@ public void shouldReturnEmptyResultOnNoneExistingService() { } @Test - public void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { + void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { String validYaml = "version: '2.2'\n" + "services:\n" + diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java index 65cc7b92aa5..1898f5d580b 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java @@ -1,8 +1,8 @@ package org.testcontainers.junit; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.ComposeContainer; @@ -15,35 +15,22 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -@RunWith(Parameterized.class) -public class ComposeContainerVolumeRemovalTest { +class ComposeContainerVolumeRemovalTest { - public ComposeContainerVolumeRemovalTest( - final boolean removeVolumes, - final boolean shouldVolumesBePresentAfterRunning - ) { - this.removeVolumes = removeVolumes; - this.shouldVolumesBePresentAfterRunning = shouldVolumesBePresentAfterRunning; + public static Stream params() { + return Stream.of(Arguments.of(true, false), Arguments.of(false, true)); } - public final boolean removeVolumes; - - public final boolean shouldVolumesBePresentAfterRunning; - - @Parameterized.Parameters(name = "removeVolumes = {0}") - public static Object[][] params() { - return new Object[][] { { true, false }, { false, true } }; - } - - @Test - public void performTest() { + @ParameterizedTest + @MethodSource("params") + void performTest(boolean removeVolumes, boolean shouldVolumesBePresentAfterRunning) { final File composeFile = new File("src/test/resources/v2-compose-test.yml"); final AtomicReference volumeName = new AtomicReference<>(""); try ( ComposeContainer environment = new ComposeContainer(composeFile) .withExposedService("redis", 6379) - .withRemoveVolumes(this.removeVolumes) + .withRemoveVolumes(removeVolumes) .withRemoveImages(ComposeContainer.RemoveImages.ALL) ) { environment.start(); @@ -58,7 +45,7 @@ public void performTest() { final boolean isVolumePresentAfterRunning = isVolumePresent(volumeName.get()); assertThat(isVolumePresentAfterRunning) .as("the container volume is present after running") - .isEqualTo(this.shouldVolumesBePresentAfterRunning); + .isEqualTo(shouldVolumesBePresentAfterRunning); }); } diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java index 7d13f72e300..589766f9184 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java @@ -1,9 +1,9 @@ package org.testcontainers.junit; import com.github.dockerjava.api.model.Container; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.ComposeContainer; @@ -15,36 +15,23 @@ import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class ComposeContainerWithBuildTest { +class ComposeContainerWithBuildTest { - public ComposeContainerWithBuildTest( - final ComposeContainer.RemoveImages removeMode, - final boolean shouldBuiltImageBePresentAfterRunning, - final boolean shouldPulledImageBePresentAfterRunning - ) { - this.removeMode = removeMode; - this.shouldBuiltImageBePresentAfterRunning = shouldBuiltImageBePresentAfterRunning; - this.shouldPulledImageBePresentAfterRunning = shouldPulledImageBePresentAfterRunning; - } - - public final ComposeContainer.RemoveImages removeMode; - - public final boolean shouldBuiltImageBePresentAfterRunning; - - public final boolean shouldPulledImageBePresentAfterRunning; - - @Parameterized.Parameters(name = "removeMode = {0}") - public static Object[][] params() { - return new Object[][] { - { null, true, true }, - { ComposeContainer.RemoveImages.LOCAL, false, true }, - { ComposeContainer.RemoveImages.ALL, false, false }, - }; + public static Stream params() { + return Stream.of( + Arguments.of(null, true, true), + Arguments.of(ComposeContainer.RemoveImages.LOCAL, false, true), + Arguments.of(ComposeContainer.RemoveImages.ALL, false, false) + ); } - @Test - public void performTest() { + @ParameterizedTest + @MethodSource("params") + void performTest( + ComposeContainer.RemoveImages removeMode, + boolean shouldBuiltImageBePresentAfterRunning, + boolean shouldPulledImageBePresentAfterRunning + ) { final File composeFile = new File("src/test/resources/compose-v2-build-test/docker-compose.yml"); final AtomicReference builtImageName = new AtomicReference<>(""); diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java index 2b1e2cd4081..33dc092cc51 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; import io.restassured.RestAssured; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerLaunchException; @@ -11,10 +11,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -public class ComposeContainerWithCopyFilesTest { +class ComposeContainerWithCopyFilesTest { @Test - public void testShouldCopyAllFilesByDefault() throws IOException { + void testShouldCopyAllFilesByDefault() throws IOException { try ( ComposeContainer environment = new ComposeContainer( new File("src/test/resources/compose-file-copy-inclusions/compose.yml") @@ -29,7 +29,7 @@ public void testShouldCopyAllFilesByDefault() throws IOException { } @Test - public void testWithFileCopyInclusionUsingFilePath() throws IOException { + void testWithFileCopyInclusionUsingFilePath() throws IOException { try ( ComposeContainer environment = new ComposeContainer( new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") @@ -47,7 +47,7 @@ public void testWithFileCopyInclusionUsingFilePath() throws IOException { } @Test - public void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { + void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { try ( // composeContainerWithCopyFiles { ComposeContainer environment = new ComposeContainer( @@ -66,7 +66,7 @@ public void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { } @Test - public void testShouldNotBeAbleToStartIfNeededEnvFileIsNotCopied() { + void testShouldNotBeAbleToStartIfNeededEnvFileIsNotCopied() { try ( ComposeContainer environment = new ComposeContainer( new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java index 9a6c581eb3b..e8bca173a54 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java @@ -2,92 +2,65 @@ import com.google.common.collect.ImmutableSet; import org.assertj.core.api.Assumptions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.utility.CommandLine; import java.io.File; import java.util.Set; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; /** * Tests the options associated with the docker-compose command. */ -@RunWith(Parameterized.class) -public class ComposeContainerWithOptionsTest { +class ComposeContainerWithOptionsTest { - public ComposeContainerWithOptionsTest( - final File composeFile, - final boolean localMode, - final Set options, - final boolean expectError - ) { - this.composeFile = composeFile; - this.localMode = localMode; - this.options = options; - this.expectError = expectError; - } - - private final File composeFile; - - private final boolean localMode; - - private final Set options; - - private final boolean expectError; - - @Parameterized.Parameters( - name = "docker-compose test [compose file: {0}, local: {1}, options: {2}, expected result: {3}]" - ) - public static Object[][] params() { - return new Object[][] { + public static Stream params() { + return Stream.of( // Test the happy day case. THe compatibility option should be accepted by docker-compose. - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, ImmutableSet.of("--compatibility"), - false, - }, + false + ), // Test with flags absent. Docker compose will warn but continue, ignoring the deploy block. - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, ImmutableSet.of(""), - false, - }, + false + ), // Test with a bad option. Compose will complain. - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, ImmutableSet.of("--bad-option"), - true, - }, + true + ), // Local compose - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), true, ImmutableSet.of("--compatibility"), - false, - }, - }; + false + ) + ); } - @Before - public void setUp() { - if (this.localMode) { + @ParameterizedTest(name = "docker-compose test [compose file: {0}, local: {1}, options: {2}, expected result: {3}]") + @MethodSource("params") + void performTest(File composeFile, boolean localMode, Set options, boolean expectError) { + if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(ComposeContainer.COMPOSE_EXECUTABLE)) .as("docker executable exists") .isTrue(); } - } - - @Test - public void performTest() { try ( ComposeContainer environment = new ComposeContainer(composeFile) .withOptions(options.stream().toArray(String[]::new)) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java index 1304413dce5..82a1a5e57ad 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java @@ -1,6 +1,6 @@ package org.testcontainers.junit; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; @@ -9,12 +9,12 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ComposeContainerWithWaitStrategies { +class ComposeContainerWithWaitStrategies { private static final int REDIS_PORT = 6379; @Test - public void testComposeContainerConstructor() { + void testComposeContainerConstructor() { try ( // composeContainerWithCombinedWaitStrategies { ComposeContainer compose = new ComposeContainer(new File("src/test/resources/composev2/compose-test.yml")) @@ -28,7 +28,7 @@ public void testComposeContainerConstructor() { } @Test - public void testComposeContainerWaitForPortWithTimeout() { + void testComposeContainerWaitForPortWithTimeout() { try ( // composeContainerWaitForPortWithTimeout { ComposeContainer compose = new ComposeContainer(new File("src/test/resources/composev2/compose-test.yml")) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java b/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java index 496ede74497..a5e8e77c12f 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import java.io.File; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class ComposeErrorHandlingTest { +class ComposeErrorHandlingTest { @Test - public void simpleTest() { + void simpleTest() { assertThat( catchThrowable(() -> { ComposeContainer environment = new ComposeContainer(new File("src/test/resources/invalid-compose.yml")) diff --git a/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java b/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java index d1724cb1e70..97ea43d38c9 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java @@ -1,9 +1,9 @@ package org.testcontainers.junit; -import org.junit.Assume; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; +import org.assertj.core.api.Assumptions; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; @@ -15,24 +15,28 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ComposePassthroughTest { +class ComposePassthroughTest { private final TestWaitStrategy waitStrategy = new TestWaitStrategy(); - @BeforeClass + @BeforeAll public static void checkVersion() { - Assume.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); + Assumptions.assumeThat(TestEnvironment.dockerApiAtLeast("1.22")).isTrue(); } - @Rule + @AutoClose public ComposeContainer compose = new ComposeContainer( new File("src/test/resources/v2-compose-test-passthrough.yml") ) .withEnv("foo", "bar") .withExposedService("alpine-1", 3000, waitStrategy); + ComposePassthroughTest() { + compose.start(); + } + @Test - public void testContainerInstanceProperties() { + void testContainerInstanceProperties() { final ContainerState container = waitStrategy.getContainer(); //check environment variable was set diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java index a77f80d227e..73553f70fdf 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java @@ -1,9 +1,8 @@ package org.testcontainers.junit; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.Description; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; @@ -16,61 +15,61 @@ import static org.assertj.core.api.Assertions.catchThrowable; import static org.assertj.core.api.Assertions.fail; -public class ComposeWaitStrategyTest { +class ComposeWaitStrategyTest { private static final int REDIS_PORT = 6379; private ComposeContainer environment; - @Before + @BeforeEach public final void setUp() { environment = new ComposeContainer(new File("src/test/resources/composev2/compose-test.yml")); } - @After + @AfterEach public final void cleanUp() { environment.stop(); } @Test - public void testWaitOnListeningPort() { + void testWaitOnListeningPort() { environment.withExposedService("redis-1", REDIS_PORT, Wait.forListeningPort()); try { - environment.starting(Description.createTestDescription(Object.class, "name")); + environment.start(); } catch (RuntimeException e) { fail("Docker compose should start after waiting for listening port with failed with: " + e); } } @Test - public void testWaitOnMultipleStrategiesPassing() { + void testWaitOnMultipleStrategiesPassing() { environment .withExposedService("redis-1", REDIS_PORT, Wait.forListeningPort()) .withExposedService("db-1", 3306, Wait.forLogMessage(".*ready for connections.*\\s", 1)) .withTailChildContainers(true); try { - environment.starting(Description.createTestDescription(Object.class, "name")); + environment.start(); } catch (RuntimeException e) { fail("Docker compose should start after waiting for listening port with failed with: " + e); } } @Test - public void testWaitingFails() { + void testWaitingFails() { environment.withExposedService( "redis-1", REDIS_PORT, Wait.forHttp("/test").withStartupTimeout(Duration.ofSeconds(10)) ); - assertThat(catchThrowable(() -> environment.starting(Description.createTestDescription(Object.class, "name")))) + assertThat(catchThrowable(() -> environment.start())) .as("waiting on an invalid http path times out") .isInstanceOf(RuntimeException.class); } @Test - public void testWaitOnOneOfMultipleStrategiesFailing() { + void testWaitOnOneOfMultipleStrategiesFailing() { environment .withExposedService( "redis-1", @@ -83,13 +82,13 @@ public void testWaitOnOneOfMultipleStrategiesFailing() { ) .withTailChildContainers(true); - assertThat(catchThrowable(() -> environment.starting(Description.createTestDescription(Object.class, "name")))) + assertThat(catchThrowable(() -> environment.start())) .as("waiting on one failing strategy to time out") .isInstanceOf(RuntimeException.class); } @Test - public void testWaitingForNonexistentServices() { + void testWaitingForNonexistentServices() { String existentServiceName = "db-1"; String nonexistentServiceName1 = "some-nonexistent_service-1"; String nonexistentServiceName2 = "some-nonexistent_service-2"; diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java index f94449bb39f..71d80918d7c 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java @@ -1,19 +1,23 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.ComposeContainer; import java.io.File; -public class ComposeWithIdentifierTest extends BaseComposeTest { +class ComposeWithIdentifierTest extends BaseComposeTest { - @Rule + @AutoClose public ComposeContainer environment = new ComposeContainer( "TEST", new File("src/test/resources/v2-compose-test.yml") ) .withExposedService("redis-1", REDIS_PORT); + ComposeWithIdentifierTest() { + environment.start(); + } + @Override protected ComposeContainer getEnvironment() { return this.environment; diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java index 3ce63b2a5fe..cfda1971600 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java @@ -1,18 +1,22 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.ComposeContainer; import java.io.File; -public class ComposeWithNetworkTest extends BaseComposeTest { +class ComposeWithNetworkTest extends BaseComposeTest { - @Rule + @AutoClose public ComposeContainer environment = new ComposeContainer( new File("src/test/resources/v2-compose-test-with-network.yml") ) .withExposedService("redis-1", REDIS_PORT); + ComposeWithNetworkTest() { + environment.start(); + } + @Override protected ComposeContainer getEnvironment() { return environment; diff --git a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java index 1aa017d6894..1acac36e6ad 100644 --- a/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/CopyFileToContainerTest.java @@ -2,8 +2,8 @@ import com.google.common.io.Files; import com.google.common.io.Resources; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.BindMode; import org.testcontainers.containers.GenericContainer; @@ -16,7 +16,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class CopyFileToContainerTest { +class CopyFileToContainerTest { private static String destinationOnHost; @@ -24,13 +24,13 @@ public class CopyFileToContainerTest { private static String fileName = "test-resource.txt"; - @Before + @BeforeEach public void setup() throws IOException { destinationOnHost = File.createTempFile("testcontainers", null).getAbsolutePath(); } @Test - public void checkFileCopied() throws IOException, InterruptedException { + void checkFileCopied() throws IOException, InterruptedException { try ( // copyToContainer { GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) @@ -55,7 +55,7 @@ public void checkFileCopied() throws IOException, InterruptedException { } @Test - public void shouldUseCopyForReadOnlyClasspathResources() throws Exception { + void shouldUseCopyForReadOnlyClasspathResources() throws Exception { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withCommand("sleep", "3000") @@ -68,7 +68,7 @@ public void shouldUseCopyForReadOnlyClasspathResources() throws Exception { } @Test - public void shouldUseCopyOnlyWithReadOnlyClasspathResources() { + void shouldUseCopyOnlyWithReadOnlyClasspathResources() { String resource = "/test_copy_to_container.txt"; GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withClasspathResourceMapping(resource, "/readOnly", BindMode.READ_ONLY) @@ -82,7 +82,7 @@ public void shouldUseCopyOnlyWithReadOnlyClasspathResources() { } @Test - public void shouldCreateFoldersStructureWithCopy() throws Exception { + void shouldCreateFoldersStructureWithCopy() throws Exception { String resource = "/test_copy_to_container.txt"; try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) diff --git a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java index effa9b06447..cbb305c30f8 100644 --- a/core/src/test/java/org/testcontainers/junit/DependenciesTest.java +++ b/core/src/test/java/org/testcontainers/junit/DependenciesTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; import lombok.Getter; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -18,10 +18,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class DependenciesTest { +class DependenciesTest { @Test - public void shouldWorkWithSimpleDependency() { + void shouldWorkWithSimpleDependency() { InvocationCountingStartable startable = new InvocationCountingStartable(); try ( @@ -37,7 +37,7 @@ public void shouldWorkWithSimpleDependency() { } @Test - public void shouldWorkWithMultipleDependencies() { + void shouldWorkWithMultipleDependencies() { InvocationCountingStartable startable1 = new InvocationCountingStartable(); InvocationCountingStartable startable2 = new InvocationCountingStartable(); @@ -54,7 +54,7 @@ public void shouldWorkWithMultipleDependencies() { } @Test - public void shouldStartEveryTime() { + void shouldStartEveryTime() { InvocationCountingStartable startable = new InvocationCountingStartable(); try ( @@ -76,7 +76,7 @@ public void shouldStartEveryTime() { } @Test - public void shouldStartTransitiveDependencies() { + void shouldStartTransitiveDependencies() { InvocationCountingStartable transitiveOfTransitiveStartable = new InvocationCountingStartable(); InvocationCountingStartable transitiveStartable = new InvocationCountingStartable(); transitiveStartable.getDependencies().add(transitiveOfTransitiveStartable); @@ -101,7 +101,7 @@ public void shouldStartTransitiveDependencies() { } @Test - public void shouldHandleDiamondDependencies() throws Exception { + void shouldHandleDiamondDependencies() throws Exception { InvocationCountingStartable a = new InvocationCountingStartable(); InvocationCountingStartable b = new InvocationCountingStartable(); InvocationCountingStartable c = new InvocationCountingStartable(); @@ -124,7 +124,7 @@ public void shouldHandleDiamondDependencies() throws Exception { } @Test - public void shouldHandleParallelStream() throws Exception { + void shouldHandleParallelStream() throws Exception { List startables = Stream .generate(InvocationCountingStartable::new) .limit(10) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java index 849e2a8e6a6..0cf523836a5 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java @@ -1,19 +1,23 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; -public class DockerComposeContainerPortViaEnvTest extends BaseDockerComposeTest { +class DockerComposeContainerPortViaEnvTest extends BaseDockerComposeTest { - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/v2-compose-test-port-via-env.yml") ) .withExposedService("redis_1", REDIS_PORT) .withEnv("REDIS_PORT", String.valueOf(REDIS_PORT)); + DockerComposeContainerPortViaEnvTest() { + environment.start(); + } + @Override protected DockerComposeContainer getEnvironment() { return environment; diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java index 5571e42dcf7..90256bb0f37 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java @@ -1,10 +1,10 @@ package org.testcontainers.junit; -import org.junit.Assume; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; +import org.assertj.core.api.Assumptions; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.utility.TestEnvironment; import redis.clients.jedis.Jedis; @@ -16,18 +16,18 @@ /** * Created by rnorth on 08/08/2015. */ -public class DockerComposeContainerScalingTest { +class DockerComposeContainerScalingTest { private static final int REDIS_PORT = 6379; private Jedis[] clients = new Jedis[3]; - @BeforeClass + @BeforeAll public static void checkVersion() { - Assume.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); + Assumptions.assumeThat(TestEnvironment.dockerApiAtLeast("1.22")).isTrue(); } - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/scaled-compose-test.yml") ) @@ -36,8 +36,9 @@ public static void checkVersion() { .withExposedService("redis_2", REDIS_PORT) // explicit service index .withExposedService("redis", 3, REDIS_PORT); // explicit service index via parameter - @Before + @BeforeEach public void setupClients() { + this.environment.start(); for (int i = 0; i < 3; i++) { String name = String.format("redis_%d", i + 1); @@ -47,7 +48,7 @@ public void setupClients() { } @Test - public void simpleTest() { + void simpleTest() { for (int i = 0; i < 3; i++) { clients[i].incr("somekey"); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java index 96989af90a4..568eaae53cf 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.DockerComposeContainer; @@ -17,22 +17,26 @@ /** * Created by rnorth on 08/08/2015. */ -public class DockerComposeContainerTest extends BaseDockerComposeTest { +class DockerComposeContainerTest extends BaseDockerComposeTest { - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/compose-test.yml") ) .withExposedService("redis_1", REDIS_PORT) .withExposedService("db_1", 3306); + DockerComposeContainerTest() { + environment.start(); + } + @Override protected DockerComposeContainer getEnvironment() { return environment; } @Test - public void testGetServicePort() { + void testGetServicePort() { int serviceWithInstancePort = environment.getServicePort("redis_1", REDIS_PORT); assertThat(serviceWithInstancePort).as("Port is set for service with instance number").isNotNull(); int serviceWithoutInstancePort = environment.getServicePort("redis", REDIS_PORT); @@ -41,7 +45,7 @@ public void testGetServicePort() { } @Test - public void shouldRetrieveContainerByServiceName() { + void shouldRetrieveContainerByServiceName() { String existingServiceName = "db_1"; Optional result = environment.getContainerByServiceName(existingServiceName); @@ -54,7 +58,7 @@ public void shouldRetrieveContainerByServiceName() { } @Test - public void shouldRetrieveContainerByServiceNameWithoutNumberedSuffix() { + void shouldRetrieveContainerByServiceNameWithoutNumberedSuffix() { String existingServiceName = "db"; Optional result = environment.getContainerByServiceName(existingServiceName); @@ -67,7 +71,7 @@ public void shouldRetrieveContainerByServiceNameWithoutNumberedSuffix() { } @Test - public void shouldReturnEmptyResultOnNoneExistingService() { + void shouldReturnEmptyResultOnNoneExistingService() { String notExistingServiceName = "db_256"; Optional result = environment.getContainerByServiceName(notExistingServiceName); assertThat(result) @@ -76,7 +80,7 @@ public void shouldReturnEmptyResultOnNoneExistingService() { } @Test - public void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { + void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { String validYaml = "version: '2.2'\n" + "services:\n" + diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java index 764000a3cae..557cc7e27db 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java @@ -1,8 +1,7 @@ package org.testcontainers.junit; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; @@ -15,35 +14,22 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.awaitility.Awaitility.await; -@RunWith(Parameterized.class) -public class DockerComposeContainerVolumeRemovalTest { +class DockerComposeContainerVolumeRemovalTest { - public DockerComposeContainerVolumeRemovalTest( - final boolean removeVolumes, - final boolean shouldVolumesBePresentAfterRunning - ) { - this.removeVolumes = removeVolumes; - this.shouldVolumesBePresentAfterRunning = shouldVolumesBePresentAfterRunning; - } - - public final boolean removeVolumes; - - public final boolean shouldVolumesBePresentAfterRunning; - - @Parameterized.Parameters(name = "removeVolumes = {0}") public static Object[][] params() { return new Object[][] { { true, false }, { false, true } }; } - @Test - public void performTest() { + @ParameterizedTest + @MethodSource("params") + void performTest(boolean removeVolumes, boolean shouldVolumesBePresentAfterRunning) { final File composeFile = new File("src/test/resources/compose-test.yml"); final AtomicReference volumeName = new AtomicReference<>(""); try ( DockerComposeContainer environment = new DockerComposeContainer<>(composeFile) .withExposedService("redis", 6379) - .withRemoveVolumes(this.removeVolumes) + .withRemoveVolumes(removeVolumes) .withRemoveImages(DockerComposeContainer.RemoveImages.ALL) ) { environment.start(); @@ -58,7 +44,7 @@ public void performTest() { final boolean isVolumePresentAfterRunning = isVolumePresent(volumeName.get()); assertThat(isVolumePresentAfterRunning) .as("the container volume is present after running") - .isEqualTo(this.shouldVolumesBePresentAfterRunning); + .isEqualTo(shouldVolumesBePresentAfterRunning); }); } diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java index ea7e35689d0..8f8da1e6450 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java @@ -1,9 +1,9 @@ package org.testcontainers.junit; import com.github.dockerjava.api.model.Container; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; @@ -15,36 +15,23 @@ import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class DockerComposeContainerWithBuildTest { +class DockerComposeContainerWithBuildTest { - public DockerComposeContainerWithBuildTest( - final DockerComposeContainer.RemoveImages removeMode, - final boolean shouldBuiltImageBePresentAfterRunning, - final boolean shouldPulledImageBePresentAfterRunning - ) { - this.removeMode = removeMode; - this.shouldBuiltImageBePresentAfterRunning = shouldBuiltImageBePresentAfterRunning; - this.shouldPulledImageBePresentAfterRunning = shouldPulledImageBePresentAfterRunning; - } - - public final DockerComposeContainer.RemoveImages removeMode; - - public final boolean shouldBuiltImageBePresentAfterRunning; - - public final boolean shouldPulledImageBePresentAfterRunning; - - @Parameterized.Parameters(name = "removeMode = {0}") - public static Object[][] params() { - return new Object[][] { - { null, true, true }, - { DockerComposeContainer.RemoveImages.LOCAL, false, true }, - { DockerComposeContainer.RemoveImages.ALL, false, false }, - }; + public static Stream params() { + return Stream.of( + Arguments.of(null, true, true), + Arguments.of(DockerComposeContainer.RemoveImages.LOCAL, false, true), + Arguments.of(DockerComposeContainer.RemoveImages.ALL, false, false) + ); } - @Test - public void performTest() { + @ParameterizedTest + @MethodSource("params") + void performTest( + DockerComposeContainer.RemoveImages removeMode, + boolean shouldBuiltImageBePresentAfterRunning, + boolean shouldPulledImageBePresentAfterRunning + ) { final File composeFile = new File("src/test/resources/compose-build-test/docker-compose.yml"); final AtomicReference builtImageName = new AtomicReference<>(""); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java index 46dd4c65b3c..69853a4e0d3 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; import io.restassured.RestAssured; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; @@ -9,10 +9,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class DockerComposeContainerWithCopyFilesTest { +class DockerComposeContainerWithCopyFilesTest { @Test - public void testShouldCopyAllFilesByDefault() throws IOException { + void testShouldCopyAllFilesByDefault() throws IOException { try ( DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/compose-file-copy-inclusions/compose.yml") @@ -27,7 +27,7 @@ public void testShouldCopyAllFilesByDefault() throws IOException { } @Test - public void testWithFileCopyInclusionUsingFilePath() throws IOException { + void testWithFileCopyInclusionUsingFilePath() throws IOException { try ( DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") @@ -45,7 +45,7 @@ public void testWithFileCopyInclusionUsingFilePath() throws IOException { } @Test - public void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { + void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { try ( DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java index ae5dbc1d0b4..d4b684ef010 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java @@ -2,83 +2,60 @@ import com.google.common.collect.ImmutableSet; import org.assertj.core.api.Assumptions; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.utility.CommandLine; import java.io.File; import java.util.Set; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; /** * Tests the options associated with the docker-compose command. */ -@RunWith(Parameterized.class) -public class DockerComposeContainerWithOptionsTest { +class DockerComposeContainerWithOptionsTest { - public DockerComposeContainerWithOptionsTest( - final File composeFile, - final boolean localMode, - final Set options, - final boolean expectError - ) { - this.composeFile = composeFile; - this.localMode = localMode; - this.options = options; - this.expectError = expectError; - } - - private final File composeFile; - - private final boolean localMode; - - private final Set options; - - private final boolean expectError; - - @Parameterized.Parameters( - name = "docker-compose test [compose file: {0}, local: {1}, options: {2}, expected result: {3}]" - ) - public static Object[][] params() { - return new Object[][] { + public static Stream params() { + return Stream.of( // Test the happy day case. THe compatibility option should be accepted by docker-compose. - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, ImmutableSet.of("--compatibility"), - false, - }, + false + ), // Test with flags absent. Docker compose will warn but continue, ignoring the deploy block. - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, ImmutableSet.of(""), - false, - }, + false + ), // Test with a bad option. Compose will complain. - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, ImmutableSet.of("--bad-option"), - true, - }, + true + ), // Local compose - { + Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), true, ImmutableSet.of("--compatibility"), - false, - }, - }; + false + ) + ); } - @Before - public void setUp() { - if (this.localMode) { + @ParameterizedTest(name = "docker-compose test [compose file: {0}, local: {1}, options: {2}, expected result: {3}]") + @MethodSource("params") + void performTest(File composeFile, boolean localMode, Set options, boolean expectError) { + if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) .as("docker-compose executable exists") @@ -87,10 +64,6 @@ public void setUp() { .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) .doesNotStartWith("Docker Compose version v2"); } - } - - @Test - public void performTest() { try ( DockerComposeContainer environment = new DockerComposeContainer<>(composeFile) .withOptions(options.stream().toArray(String[]::new)) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java index 63383bb7175..9d0f4a19f1e 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; @@ -8,10 +8,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class DockerComposeErrorHandlingTest { +class DockerComposeErrorHandlingTest { @Test - public void simpleTest() { + void simpleTest() { assertThat( catchThrowable(() -> { DockerComposeContainer environment = new DockerComposeContainer( diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java index 69b674bca71..2c77092e1bd 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java @@ -2,16 +2,16 @@ import com.github.dockerjava.api.DockerClient; import com.github.dockerjava.core.command.PullImageResultCallback; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; -public class DockerComposeLocalImageTest { +class DockerComposeLocalImageTest { @Test - public void usesLocalImageEvenWhenPullFails() throws InterruptedException { + void usesLocalImageEvenWhenPullFails() throws InterruptedException { tagImage("redis:6-alpine", "redis-local", "latest"); DockerComposeContainer composeContainer = new DockerComposeContainer( diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java index 97e686a9b92..a712fb19664 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.junit.runner.Description; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.output.OutputFrame.OutputType; @@ -10,10 +10,10 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -public class DockerComposeLogConsumerTest { +class DockerComposeLogConsumerTest { @Test - public void testLogConsumer() throws TimeoutException { + void testLogConsumer() throws TimeoutException { WaitingConsumer logConsumer = new WaitingConsumer(); DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/v2-compose-test.yml") diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java index 10a26306248..0bc8ace7ab7 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java @@ -1,9 +1,7 @@ package org.testcontainers.junit; -import org.junit.Assume; -import org.junit.BeforeClass; -import org.junit.Rule; -import org.junit.Test; +import org.assertj.core.api.Assumptions; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; @@ -18,35 +16,34 @@ /** * Created by rnorth on 11/06/2016. */ -public class DockerComposePassthroughTest { - - private final TestWaitStrategy waitStrategy = new TestWaitStrategy(); - - @BeforeClass - public static void checkVersion() { - Assume.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); - } - - @Rule - public DockerComposeContainer compose = new DockerComposeContainer( - new File("src/test/resources/v2-compose-test-passthrough.yml") - ) - .withEnv("foo", "bar") - .withExposedService("alpine_1", 3000, waitStrategy); +class DockerComposePassthroughTest { @Test - public void testContainerInstanceProperties() { - final ContainerState container = waitStrategy.getContainer(); - - //check environment variable was set - assertThat(Arrays.asList(Objects.requireNonNull(container.getContainerInfo().getConfig().getEnv()))) - .as("Environment variable set correctly") - .containsOnlyOnce("bar=bar"); - - //check other container properties - assertThat(container.getContainerId()).as("Container id is not null").isNotNull(); - assertThat(container.getMappedPort(3000)).as("Port mapped").isNotNull(); - assertThat(container.getExposedPorts()).containsExactly(3000); + void testContainerInstanceProperties() { + Assumptions.assumeThat(TestEnvironment.dockerApiAtLeast("1.22")).isTrue(); + + TestWaitStrategy waitStrategy = new TestWaitStrategy(); + try ( + DockerComposeContainer compose = new DockerComposeContainer( + new File("src/test/resources/v2-compose-test-passthrough.yml") + ) + .withEnv("foo", "bar") + .withExposedService("alpine_1", 3000, waitStrategy) + ) { + compose.start(); + + final ContainerState container = waitStrategy.getContainer(); + + //check environment variable was set + assertThat(Arrays.asList(Objects.requireNonNull(container.getContainerInfo().getConfig().getEnv()))) + .as("Environment variable set correctly") + .containsOnlyOnce("bar=bar"); + + //check other container properties + assertThat(container.getContainerId()).as("Container id is not null").isNotNull(); + assertThat(container.getMappedPort(3000)).as("Port mapped").isNotNull(); + assertThat(container.getExposedPorts()).containsExactly(3000); + } } /* diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java index ccca85407f3..2496b7ee0bc 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java @@ -1,34 +1,42 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class DockerComposeServiceTest extends BaseDockerComposeTest { +class DockerComposeServiceTest extends BaseDockerComposeTest { - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/compose-test.yml") ) .withServices("redis") .withExposedService("redis_1", REDIS_PORT); + DockerComposeServiceTest() { + environment.start(); + } + @Override protected DockerComposeContainer getEnvironment() { return environment; } - @Test(expected = IllegalArgumentException.class) - public void testDbIsNotStarting() { - environment.getServicePort("db_1", 10001); + @Test + void testDbIsNotStarting() { + assertThatThrownBy(() -> { + environment.getServicePort("db_1", 10001); + }) + .isInstanceOf(IllegalArgumentException.class); } @Test - public void testRedisIsStarting() { + void testRedisIsStarting() { assertThat(environment.getServicePort("redis_1", REDIS_PORT)).as("Redis server started").isNotNull(); } } diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java index f3dc2ee3cc8..c7b066b39b8 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; @@ -8,14 +8,18 @@ /** * Created by rnorth on 21/05/2016. */ -public class DockerComposeV2FormatTest extends BaseDockerComposeTest { +class DockerComposeV2FormatTest extends BaseDockerComposeTest { - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/v2-compose-test.yml") ) .withExposedService("redis_1", REDIS_PORT); + DockerComposeV2FormatTest() { + environment.start(); + } + @Override protected DockerComposeContainer getEnvironment() { return environment; diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java index 90c041b53b6..d8f4e57dbd9 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java @@ -1,19 +1,23 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; -public class DockerComposeV2FormatWithIdentifierTest extends BaseDockerComposeTest { +class DockerComposeV2FormatWithIdentifierTest extends BaseDockerComposeTest { - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( "TEST", new File("src/test/resources/v2-compose-test.yml") ) .withExposedService("redis_1", REDIS_PORT); + DockerComposeV2FormatWithIdentifierTest() { + environment.start(); + } + @Override protected DockerComposeContainer getEnvironment() { return this.environment; diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java index b28dfc3ee51..bc95f0229b7 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java @@ -1,18 +1,22 @@ package org.testcontainers.junit; -import org.junit.Rule; +import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.DockerComposeContainer; import java.io.File; -public class DockerComposeV2WithNetworkTest extends BaseDockerComposeTest { +class DockerComposeV2WithNetworkTest extends BaseDockerComposeTest { - @Rule + @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( new File("src/test/resources/v2-compose-test-with-network.yml") ) .withExposedService("redis_1", REDIS_PORT); + DockerComposeV2WithNetworkTest() { + environment.start(); + } + @Override protected DockerComposeContainer getEnvironment() { return environment; diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java index b110e776285..9f8c2c9ab49 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java @@ -1,9 +1,8 @@ package org.testcontainers.junit; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.Description; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; @@ -16,61 +15,61 @@ import static org.assertj.core.api.Assertions.catchThrowable; import static org.assertj.core.api.Assertions.fail; -public class DockerComposeWaitStrategyTest { +class DockerComposeWaitStrategyTest { private static final int REDIS_PORT = 6379; private DockerComposeContainer environment; - @Before + @BeforeEach public final void setUp() { environment = new DockerComposeContainer<>(new File("src/test/resources/compose-test.yml")); } - @After + @AfterEach public final void cleanUp() { environment.stop(); } @Test - public void testWaitOnListeningPort() { + void testWaitOnListeningPort() { environment.withExposedService("redis_1", REDIS_PORT, Wait.forListeningPort()); try { - environment.starting(Description.createTestDescription(Object.class, "name")); + environment.start(); } catch (RuntimeException e) { fail("Docker compose should start after waiting for listening port with failed with: " + e); } } @Test - public void testWaitOnMultipleStrategiesPassing() { + void testWaitOnMultipleStrategiesPassing() { environment .withExposedService("redis_1", REDIS_PORT, Wait.forListeningPort()) .withExposedService("db_1", 3306, Wait.forLogMessage(".*ready for connections.*\\s", 1)) .withTailChildContainers(true); try { - environment.starting(Description.createTestDescription(Object.class, "name")); + environment.start(); } catch (RuntimeException e) { fail("Docker compose should start after waiting for listening port with failed with: " + e); } } @Test - public void testWaitingFails() { + void testWaitingFails() { environment.withExposedService( "redis_1", REDIS_PORT, Wait.forHttp("/test").withStartupTimeout(Duration.ofSeconds(10)) ); - assertThat(catchThrowable(() -> environment.starting(Description.createTestDescription(Object.class, "name")))) + assertThat(catchThrowable(() -> environment.start())) .as("waiting on an invalid http path times out") .isInstanceOf(RuntimeException.class); } @Test - public void testWaitOnOneOfMultipleStrategiesFailing() { + void testWaitOnOneOfMultipleStrategiesFailing() { environment .withExposedService( "redis_1", @@ -83,13 +82,13 @@ public void testWaitOnOneOfMultipleStrategiesFailing() { ) .withTailChildContainers(true); - assertThat(catchThrowable(() -> environment.starting(Description.createTestDescription(Object.class, "name")))) + assertThat(catchThrowable(() -> environment.start())) .as("waiting on one failing strategy to time out") .isInstanceOf(RuntimeException.class); } @Test - public void testWaitingForNonexistentServices() { + void testWaitingForNonexistentServices() { String existentServiceName = "db_1"; String nonexistentServiceName1 = "some_nonexistent_service_1"; String nonexistentServiceName2 = "some_nonexistent_service_2"; diff --git a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java index b048e4716fd..c35809f74e9 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerNetworkModeTest.java @@ -2,7 +2,7 @@ import com.github.dockerjava.api.model.NetworkSettings; import lombok.extern.slf4j.Slf4j; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -14,10 +14,10 @@ * without other setup steps. */ @Slf4j -public class DockerNetworkModeTest { +class DockerNetworkModeTest { @Test - public void testNoNetworkContainer() { + void testNoNetworkContainer() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) @@ -33,7 +33,7 @@ public void testNoNetworkContainer() { } @Test - public void testHostNetworkContainer() { + void testHostNetworkContainer() { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) diff --git a/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java b/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java index 9ed143aca9c..61500ca7993 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerfileContainerTest.java @@ -4,8 +4,8 @@ import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -16,9 +16,9 @@ /** * Simple test case / demonstration of creating a fresh container image from a Dockerfile DSL */ -public class DockerfileContainerTest { +class DockerfileContainerTest { - @Rule + @AutoClose public GenericContainer dslContainer = new GenericContainer( new ImageFromDockerfile("tcdockerfile/nginx", false) .withDockerfileFromBuilder(builder -> { @@ -32,7 +32,9 @@ public class DockerfileContainerTest { .withExposedPorts(80); @Test - public void simpleDslTest() throws IOException { + void simpleDslTest() throws IOException { + dslContainer.start(); + String address = String.format("http://%s:%s", dslContainer.getHost(), dslContainer.getMappedPort(80)); CloseableHttpClient httpClient = HttpClientBuilder.create().build(); diff --git a/core/src/test/java/org/testcontainers/junit/DockerfileTest.java b/core/src/test/java/org/testcontainers/junit/DockerfileTest.java index 113fd7f4c63..9f85af8d209 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerfileTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerfileTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; import com.github.dockerjava.api.command.BuildImageCmd; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.containers.GenericContainer; @@ -16,12 +16,12 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -public class DockerfileTest { +class DockerfileTest { private static final Logger LOGGER = LoggerFactory.getLogger(DockerfileTest.class); @Test - public void simpleDockerfileWorks() { + void simpleDockerfileWorks() { ImageFromDockerfile image = new ImageFromDockerfile() .withFileFromString("folder/someFile.txt", "hello") .withFileFromClasspath("test.txt", "mappable-resource/test-resource.txt") @@ -31,7 +31,7 @@ public void simpleDockerfileWorks() { } @Test - public void customizableImage() { + void customizableImage() { ImageFromDockerfile image = new ImageFromDockerfile() { @Override protected void configure(BuildImageCmd buildImageCmd) { @@ -52,7 +52,7 @@ protected void configure(BuildImageCmd buildImageCmd) { } @Test - public void dockerfileBuilderWorks() { + void dockerfileBuilderWorks() { ImageFromDockerfile image = new ImageFromDockerfile() .withFileFromClasspath("test.txt", "mappable-resource/test-resource.txt") .withFileFromString("folder/someFile.txt", "hello") @@ -71,7 +71,7 @@ public void dockerfileBuilderWorks() { } @Test - public void filePermissions() throws TimeoutException { + void filePermissions() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); ImageFromDockerfile image = new ImageFromDockerfile() diff --git a/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java b/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java index a3dd21318d2..365229e5909 100644 --- a/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/ExecInContainerTest.java @@ -1,8 +1,8 @@ package org.testcontainers.junit; -import org.junit.Assume; -import org.junit.ClassRule; -import org.junit.Test; +import org.assertj.core.api.Assumptions; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.ExecConfig; import org.testcontainers.containers.GenericContainer; @@ -12,17 +12,21 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ExecInContainerTest { +class ExecInContainerTest { - @ClassRule + @AutoClose public static GenericContainer redis = new GenericContainer<>(TestImages.REDIS_IMAGE).withExposedPorts(6379); + static { + redis.start(); + } + @Test - public void shouldExecuteCommand() throws Exception { + void shouldExecuteCommand() throws Exception { // The older "lxc" execution driver doesn't support "exec". At the time of writing (2016/03/29), // that's the case for CircleCI. // Once they resolve the issue, this clause can be removed. - Assume.assumeTrue(TestEnvironment.dockerExecutionDriverSupportsExec()); + Assumptions.assumeThat(TestEnvironment.dockerExecutionDriverSupportsExec()).isTrue(); final GenericContainer.ExecResult result = redis.execInContainer("redis-cli", "role"); assertThat(result.getStdout()) @@ -33,11 +37,11 @@ public void shouldExecuteCommand() throws Exception { } @Test - public void shouldExecuteCommandWithUser() throws Exception { + void shouldExecuteCommandWithUser() throws Exception { // The older "lxc" execution driver doesn't support "exec". At the time of writing (2016/03/29), // that's the case for CircleCI. // Once they resolve the issue, this clause can be removed. - Assume.assumeTrue(TestEnvironment.dockerExecutionDriverSupportsExec()); + Assumptions.assumeThat(TestEnvironment.dockerExecutionDriverSupportsExec()).isTrue(); final GenericContainer.ExecResult result = redis.execInContainerWithUser("redis", "whoami"); assertThat(result.getStdout()) @@ -48,8 +52,8 @@ public void shouldExecuteCommandWithUser() throws Exception { } @Test - public void shouldExecuteCommandWithWorkdir() throws Exception { - Assume.assumeTrue(TestEnvironment.dockerExecutionDriverSupportsExec()); + void shouldExecuteCommandWithWorkdir() throws Exception { + Assumptions.assumeThat(TestEnvironment.dockerExecutionDriverSupportsExec()).isTrue(); final GenericContainer.ExecResult result = redis.execInContainer( ExecConfig.builder().workDir("/opt").command(new String[] { "pwd" }).build() @@ -58,8 +62,8 @@ public void shouldExecuteCommandWithWorkdir() throws Exception { } @Test - public void shouldExecuteCommandWithEnvVars() throws Exception { - Assume.assumeTrue(TestEnvironment.dockerExecutionDriverSupportsExec()); + void shouldExecuteCommandWithEnvVars() throws Exception { + Assumptions.assumeThat(TestEnvironment.dockerExecutionDriverSupportsExec()).isTrue(); final GenericContainer.ExecResult result = redis.execInContainer( ExecConfig diff --git a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java index 767deacfb00..f2c8117a905 100644 --- a/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java +++ b/core/src/test/java/org/testcontainers/junit/FileOperationsTest.java @@ -4,9 +4,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.CountingOutputStream; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.testcontainers.TestImages; import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; @@ -17,17 +16,18 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class FileOperationsTest { +class FileOperationsTest { - @Rule - public TemporaryFolder temporaryFolder = new TemporaryFolder(); + @TempDir + public Path temporaryFolder; @Test - public void copyFileToContainerFileTest() throws Exception { + void copyFileToContainerFileTest() throws Exception { try ( GenericContainer alpineCopyToContainer = new GenericContainer(TestImages.ALPINE_IMAGE) // .withCommand("top") @@ -36,7 +36,7 @@ public void copyFileToContainerFileTest() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt"); alpineCopyToContainer.copyFileToContainer(mountableFile, "/test.txt"); - File actualFile = new File(temporaryFolder.getRoot().getAbsolutePath() + "/test_copy_to_container.txt"); + File actualFile = new File(temporaryFolder.toFile().getAbsolutePath() + "/test_copy_to_container.txt"); alpineCopyToContainer.copyFileFromContainer("/test.txt", actualFile.getPath()); File expectedFile = new File(mountableFile.getResolvedPath()); @@ -45,8 +45,8 @@ public void copyFileToContainerFileTest() throws Exception { } @Test - public void copyLargeFilesToContainer() throws Exception { - File tempFile = temporaryFolder.newFile(); + void copyLargeFilesToContainer() throws Exception { + File tempFile = temporaryFolder.resolve("large-file").toFile(); try ( GenericContainer alpineCopyToContainer = new GenericContainer<>(TestImages.ALPINE_IMAGE) // .withCommand("sleep", "infinity") @@ -82,7 +82,7 @@ public void copyLargeFilesToContainer() throws Exception { } @Test - public void copyFileToContainerFolderTest() throws Exception { + void copyFileToContainerFolderTest() throws Exception { try ( GenericContainer alpineCopyToContainer = new GenericContainer(TestImages.ALPINE_IMAGE) // .withCommand("top") @@ -91,7 +91,7 @@ public void copyFileToContainerFolderTest() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt"); alpineCopyToContainer.copyFileToContainer(mountableFile, "/home/"); - File actualFile = new File(temporaryFolder.getRoot().getAbsolutePath() + "/test_copy_to_container.txt"); + File actualFile = new File(temporaryFolder.toFile().getAbsolutePath() + "/test_copy_to_container.txt"); alpineCopyToContainer.copyFileFromContainer("/home/test_copy_to_container.txt", actualFile.getPath()); File expectedFile = new File(mountableFile.getResolvedPath()); @@ -100,7 +100,7 @@ public void copyFileToContainerFolderTest() throws Exception { } @Test - public void copyFolderToContainerFolderTest() throws Exception { + void copyFolderToContainerFolderTest() throws Exception { try ( GenericContainer alpineCopyToContainer = new GenericContainer(TestImages.ALPINE_IMAGE) // .withCommand("top") @@ -109,7 +109,7 @@ public void copyFolderToContainerFolderTest() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("mappable-resource/"); alpineCopyToContainer.copyFileToContainer(mountableFile, "/home/test/"); - File actualFile = new File(temporaryFolder.getRoot().getAbsolutePath() + "/test_copy_to_container.txt"); + File actualFile = new File(temporaryFolder.toFile().getAbsolutePath() + "/test_copy_to_container.txt"); alpineCopyToContainer.copyFileFromContainer("/home/test/test-resource.txt", actualFile.getPath()); File expectedFile = new File(mountableFile.getResolvedPath() + "/test-resource.txt"); @@ -117,19 +117,25 @@ public void copyFolderToContainerFolderTest() throws Exception { } } - @Test(expected = NotFoundException.class) - public void copyFromContainerShouldFailBecauseNoFileTest() throws NotFoundException { - try ( - GenericContainer alpineCopyToContainer = new GenericContainer(TestImages.ALPINE_IMAGE) // - .withCommand("top") - ) { - alpineCopyToContainer.start(); - alpineCopyToContainer.copyFileFromContainer("/home/test.txt", "src/test/resources/copy-from/test.txt"); - } + @Test + void copyFromContainerShouldFailBecauseNoFileTest() { + assertThatThrownBy(() -> { + try ( + GenericContainer alpineCopyToContainer = new GenericContainer(TestImages.ALPINE_IMAGE) // + .withCommand("top") + ) { + alpineCopyToContainer.start(); + alpineCopyToContainer.copyFileFromContainer( + "/home/test.txt", + "src/test/resources/copy-from/test.txt" + ); + } + }) + .isInstanceOf(NotFoundException.class); } @Test - public void shouldCopyFileFromContainerTest() throws IOException { + void shouldCopyFileFromContainerTest() throws IOException { try ( GenericContainer alpineCopyToContainer = new GenericContainer(TestImages.ALPINE_IMAGE) // .withCommand("top") @@ -138,7 +144,7 @@ public void shouldCopyFileFromContainerTest() throws IOException { final MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt"); alpineCopyToContainer.copyFileToContainer(mountableFile, "/home/"); - File actualFile = new File(temporaryFolder.getRoot().getAbsolutePath() + "/test_copy_from_container.txt"); + File actualFile = new File(temporaryFolder.toFile().getAbsolutePath() + "/test_copy_from_container.txt"); alpineCopyToContainer.copyFileFromContainer("/home/test_copy_to_container.txt", actualFile.getPath()); File expectedFile = new File(mountableFile.getResolvedPath()); @@ -147,7 +153,7 @@ public void shouldCopyFileFromContainerTest() throws IOException { } @Test - public void copyFileOperationsShouldFailWhenNotStartedTest() { + void copyFileOperationsShouldFailWhenNotStartedTest() { try (GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE).withCommand("top")) { assertThatThrownBy(() -> { MountableFile mountableFile = MountableFile.forClasspathResource("test_copy_to_container.txt"); @@ -165,7 +171,7 @@ public void copyFileOperationsShouldFailWhenNotStartedTest() { } @Test - public void shouldCopyFileFromExitedContainerTest() throws IOException { + void shouldCopyFileFromExitedContainerTest() { try ( GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withCommand("sh", "-c", "echo -n 'Hello!' > /home/file_in_container.txt") diff --git a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java index a123b800f3a..38f1f5c9a6f 100644 --- a/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/FixedHostPortContainerTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit; import org.awaitility.Awaitility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.FixedHostPortGenericContainer; import org.testcontainers.containers.GenericContainer; @@ -20,7 +20,7 @@ * is managed completely within the test method to allow a free port to be found and assigned before the container * is started. */ -public class FixedHostPortContainerTest { +class FixedHostPortContainerTest { private static final String TEST_IMAGE = "alpine:3.17"; @@ -44,7 +44,7 @@ public class FixedHostPortContainerTest { ); @Test - public void testFixedHostPortMapping() throws IOException { + void testFixedHostPortMapping() throws IOException { // first find a free port on the docker host that will work for testing final Integer unusedHostPort; try ( diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java index 5a9d7c1616d..5719f3e0268 100644 --- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java +++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java @@ -14,10 +14,9 @@ import com.rabbitmq.client.Envelope; import org.apache.commons.io.FileUtils; import org.bson.Document; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Ignore; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; import org.rnorth.ducttape.RetryCountExceededException; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.TestImages; @@ -51,7 +50,7 @@ /** * Tests for GenericContainerRules */ -public class GenericContainerRuleTest { +class GenericContainerRuleTest { private static final int REDIS_PORT = 6379; @@ -68,7 +67,7 @@ public class GenericContainerRuleTest { /* * Test data setup */ - @BeforeClass + @BeforeAll public static void setupContent() throws FileNotFoundException { File contentFolder = new File(System.getProperty("user.home") + "/.tmp-test-container"); contentFolder.mkdir(); @@ -78,21 +77,18 @@ public static void setupContent() throws FileNotFoundException { /** * Redis */ - @ClassRule public static GenericContainer redis = new GenericContainer<>(TestImages.REDIS_IMAGE) .withExposedPorts(REDIS_PORT); /** * RabbitMQ */ - @ClassRule public static GenericContainer rabbitMq = new GenericContainer<>(TestImages.RABBITMQ_IMAGE) .withExposedPorts(RABBITMQ_PORT); /** * MongoDB */ - @ClassRule public static GenericContainer mongo = new GenericContainer<>(TestImages.MONGODB_IMAGE) .withExposedPorts(MONGO_PORT); @@ -100,7 +96,6 @@ public static void setupContent() throws FileNotFoundException { * Pass an environment variable to the container, then run a shell script that exposes the variable in a quick and * dirty way for testing. */ - @ClassRule public static GenericContainer alpineEnvVar = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts(80) .withEnv("MAGIC_NUMBER", "4") @@ -111,7 +106,6 @@ public static void setupContent() throws FileNotFoundException { * Pass environment variables to the container, then run a shell script that exposes the variables in a quick and * dirty way for testing. */ - @ClassRule public static GenericContainer alpineEnvVarFromMap = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts(80) .withEnv(ImmutableMap.of("FIRST", "42", "SECOND", "50")) @@ -120,7 +114,6 @@ public static void setupContent() throws FileNotFoundException { /** * Map a file on the classpath to a file in the container, and then expose the content for testing. */ - @ClassRule public static GenericContainer alpineClasspathResource = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts(80) .withClasspathResourceMapping("mappable-resource/test-resource.txt", "/content.txt", BindMode.READ_ONLY) @@ -129,7 +122,6 @@ public static void setupContent() throws FileNotFoundException { /** * Map a file on the classpath to a file in the container, and then expose the content for testing. */ - @ClassRule public static GenericContainer alpineClasspathResourceSelinux = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts(80) .withClasspathResourceMapping( @@ -143,14 +135,24 @@ public static void setupContent() throws FileNotFoundException { /** * Create a container with an extra host entry and expose the content of /etc/hosts for testing. */ - @ClassRule public static GenericContainer alpineExtrahost = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts(80) .withExtraHost("somehost", "192.168.1.10") .withCommand("/bin/sh", "-c", "while true; do cat /etc/hosts | nc -l -p 80; done"); + static { + redis.start(); + rabbitMq.start(); + mongo.start(); + alpineEnvVar.start(); + alpineEnvVarFromMap.start(); + alpineClasspathResource.start(); + alpineClasspathResourceSelinux.start(); + alpineExtrahost.start(); + } + @Test - public void testIsRunning() { + void testIsRunning() { try (GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE).withCommand("top")) { assertThat(container.isRunning()).as("Container is not started and not running").isFalse(); container.start(); @@ -159,7 +161,7 @@ public void testIsRunning() { } @Test - public void withTmpFsTest() throws Exception { + void withTmpFsTest() throws Exception { try ( GenericContainer container = new GenericContainer<>(TestImages.TINY_IMAGE) .withCommand("top") @@ -180,7 +182,7 @@ public void withTmpFsTest() throws Exception { } @Test - public void simpleRabbitMqTest() throws IOException, TimeoutException { + void simpleRabbitMqTest() throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost(rabbitMq.getHost()); factory.setPort(rabbitMq.getMappedPort(RABBITMQ_PORT)); @@ -230,7 +232,7 @@ public void handleDelivery( } @Test - public void simpleMongoDbTest() { + void simpleMongoDbTest() { MongoClient mongoClient = new MongoClient(mongo.getHost(), mongo.getMappedPort(MONGO_PORT)); MongoDatabase database = mongoClient.getDatabase("test"); MongoCollection collection = database.getCollection("testCollection"); @@ -243,21 +245,21 @@ public void simpleMongoDbTest() { } @Test - public void environmentAndCustomCommandTest() throws IOException { + void environmentAndCustomCommandTest() throws IOException { String line = getReaderForContainerPort80(alpineEnvVar).readLine(); assertThat(line).as("An environment variable can be passed into a command").isEqualTo("42"); } @Test - public void environmentFromMapTest() throws IOException { + void environmentFromMapTest() throws IOException { String line = getReaderForContainerPort80(alpineEnvVarFromMap).readLine(); assertThat(line).as("Environment variables can be passed into a command from a map").isEqualTo("42 and 50"); } @Test - public void customLabelTest() { + void customLabelTest() { try ( final GenericContainer alpineCustomLabel = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withLabel("our.custom", "label") @@ -285,7 +287,7 @@ public void customLabelTest() { } @Test - public void exceptionThrownWhenTryingToOverrideTestcontainersLabels() { + void exceptionThrownWhenTryingToOverrideTestcontainersLabels() { assertThat( catchThrowable(() -> { new GenericContainer<>(TestImages.ALPINE_IMAGE).withLabel("org.testcontainers.foo", "false"); @@ -296,7 +298,7 @@ public void exceptionThrownWhenTryingToOverrideTestcontainersLabels() { } @Test - public void customClasspathResourceMappingTest() throws IOException { + void customClasspathResourceMappingTest() throws IOException { // Note: This functionality doesn't work if you are running your build inside a Docker container; // in that case this test will fail. String line = getReaderForContainerPort80(alpineClasspathResource).readLine(); @@ -307,7 +309,7 @@ public void customClasspathResourceMappingTest() throws IOException { } @Test - public void customClasspathResourceMappingWithSelinuxTest() throws IOException { + void customClasspathResourceMappingWithSelinuxTest() throws IOException { String line = getReaderForContainerPort80(alpineClasspathResourceSelinux).readLine(); assertThat(line) .as("Resource on the classpath can be mapped using calls to withClasspathResourceMappingSelinux") @@ -315,7 +317,7 @@ public void customClasspathResourceMappingWithSelinuxTest() throws IOException { } @Test - public void exceptionThrownWhenMappedPortNotFound() { + void exceptionThrownWhenMappedPortNotFound() { assertThat(catchThrowable(() -> redis.getMappedPort(666))) .as("When the requested port is not mapped, getMappedPort() throws an exception") .isInstanceOf(IllegalArgumentException.class); @@ -331,8 +333,8 @@ protected static void writeStringToFile(File contentFolder, String filename, Str } @Test - @Ignore //TODO investigate intermittent failures - public void failFastWhenContainerHaltsImmediately() { + @Disabled //TODO investigate intermittent failures + void failFastWhenContainerHaltsImmediately() { long startingTimeNano = System.nanoTime(); final GenericContainer failsImmediately = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withCommand("/bin/sh", "-c", "return false") @@ -358,7 +360,7 @@ public void failFastWhenContainerHaltsImmediately() { } @Test - public void extraHostTest() throws IOException { + void extraHostTest() throws IOException { BufferedReader br = getReaderForContainerPort80(alpineExtrahost); // read hosts file from container @@ -375,7 +377,7 @@ public void extraHostTest() throws IOException { } @Test - public void createContainerCmdHookTest() { + void createContainerCmdHookTest() { // Use random name to avoid the conflicts between the tests String randomName = Base58.randomString(5); try ( @@ -410,7 +412,7 @@ private BufferedReader getReaderForContainerPort80(GenericContainer container) { } @Test - public void addExposedPortAfterWithExposedPortsTest() { + void addExposedPortAfterWithExposedPortsTest() { redis.addExposedPort(8987); assertThat(redis.getExposedPorts()).as("Both ports should be exposed").hasSize(2); assertThat(redis.getExposedPorts()).as("withExposedPort should be exposed").contains(REDIS_PORT); @@ -418,7 +420,7 @@ public void addExposedPortAfterWithExposedPortsTest() { } @Test - public void addingExposedPortTwiceShouldNotFail() { + void addingExposedPortTwiceShouldNotFail() { redis.addExposedPort(8987); redis.addExposedPort(8987); assertThat(redis.getExposedPorts()).as("Both ports should be exposed").hasSize(2); // 2 ports = de-duplicated port 8897 and original port 6379 @@ -427,7 +429,7 @@ public void addingExposedPortTwiceShouldNotFail() { } @Test - public void sharedMemorySetTest() { + void sharedMemorySetTest() { try ( GenericContainer containerWithSharedMemory = new GenericContainer<>(TestImages.TINY_IMAGE) .withSharedMemorySize(42L * FileUtils.ONE_MB) diff --git a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java index aff9b29cbe7..2978777aae7 100644 --- a/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java +++ b/core/src/test/java/org/testcontainers/junit/NonExistentImagePullTest.java @@ -1,6 +1,7 @@ package org.testcontainers.junit; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.containers.ContainerFetchException; import org.testcontainers.containers.GenericContainer; import org.testcontainers.utility.DockerImageName; @@ -11,10 +12,11 @@ /** * Created by rnorth on 20/03/2016. */ -public class NonExistentImagePullTest { +class NonExistentImagePullTest { - @Test(timeout = 60_000L) - public void pullingNonExistentImageFailsGracefully() { + @Test + @Timeout(60) + void pullingNonExistentImageFailsGracefully() { assertThat( catchThrowable(() -> { new GenericContainer<>(DockerImageName.parse("testcontainers/nonexistent:latest")).getDockerImageName(); diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java index 17b1d247cbb..42fc7ff584b 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamTest.java @@ -1,7 +1,9 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.TestImages; @@ -21,16 +23,26 @@ /** * Simple test for following container output. */ -public class OutputStreamTest { +class OutputStreamTest { + + private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamTest.class); - @Rule public GenericContainer container = new GenericContainer(TestImages.ALPINE_IMAGE) .withCommand("ping -c 5 127.0.0.1"); - private static final Logger LOGGER = LoggerFactory.getLogger(OutputStreamTest.class); + @BeforeEach + void setUp() { + container.start(); + } + + @AfterEach + void tearDown() { + container.stop(); + } - @Test(timeout = 60_000L) - public void testFetchStdout() throws TimeoutException { + @Test + @Timeout(value = 60) + void testFetchStdout() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, OutputFrame.OutputType.STDOUT); @@ -42,8 +54,9 @@ public void testFetchStdout() throws TimeoutException { ); } - @Test(timeout = 60_000L) - public void testFetchStdoutWithTimeout() { + @Test + @Timeout(value = 60) + void testFetchStdoutWithTimeout() { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, OutputFrame.OutputType.STDOUT); @@ -65,8 +78,9 @@ public void testFetchStdoutWithTimeout() { .isInstanceOf(TimeoutException.class); } - @Test(timeout = 60_000L) - public void testFetchStdoutWithNoLimit() throws TimeoutException { + @Test + @Timeout(value = 60) + void testFetchStdoutWithNoLimit() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, OutputFrame.OutputType.STDOUT); @@ -76,8 +90,9 @@ public void testFetchStdoutWithNoLimit() throws TimeoutException { }); } - @Test(timeout = 60_000L) - public void testLogConsumer() throws TimeoutException { + @Test + @Timeout(value = 60) + void testLogConsumer() throws TimeoutException { WaitingConsumer waitingConsumer = new WaitingConsumer(); Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(LOGGER); @@ -89,8 +104,9 @@ public void testLogConsumer() throws TimeoutException { }); } - @Test(timeout = 60_000L) - public void testToStringConsumer() throws TimeoutException { + @Test + @Timeout(value = 60) + void testToStringConsumer() throws TimeoutException { WaitingConsumer waitingConsumer = new WaitingConsumer(); ToStringConsumer toStringConsumer = new ToStringConsumer(); diff --git a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java index c340f26d3fb..a6dbfa06343 100644 --- a/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java +++ b/core/src/test/java/org/testcontainers/junit/OutputStreamWithTTYTest.java @@ -1,9 +1,10 @@ package org.testcontainers.junit; import lombok.extern.slf4j.Slf4j; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.Timeout; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.output.OutputFrame; @@ -20,19 +21,22 @@ import static org.assertj.core.api.Assertions.catchThrowable; @Slf4j -public class OutputStreamWithTTYTest { +@Timeout(10) +class OutputStreamWithTTYTest { - @Rule + @AutoClose public GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withCommand("ls -1") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCreateContainerCmdModifier(command -> command.withTty(true)); - @Rule - public Timeout globalTimeout = Timeout.seconds(10); + @BeforeEach + void setUp() { + container.start(); + } @Test - public void testFetchStdout() throws TimeoutException { + void testFetchStdout() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, OutputFrame.OutputType.STDOUT); @@ -47,7 +51,7 @@ public void testFetchStdout() throws TimeoutException { } @Test - public void testFetchStdoutWithTimeout() { + void testFetchStdoutWithTimeout() { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, OutputFrame.OutputType.STDOUT); @@ -70,7 +74,7 @@ public void testFetchStdoutWithTimeout() { } @Test - public void testFetchStdoutWithNoLimit() throws TimeoutException { + void testFetchStdoutWithNoLimit() throws TimeoutException { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer, OutputFrame.OutputType.STDOUT); @@ -81,7 +85,7 @@ public void testFetchStdoutWithNoLimit() throws TimeoutException { } @Test - public void testLogConsumer() throws TimeoutException { + void testLogConsumer() throws TimeoutException { WaitingConsumer waitingConsumer = new WaitingConsumer(); Slf4jLogConsumer logConsumer = new Slf4jLogConsumer(log); @@ -94,7 +98,7 @@ public void testLogConsumer() throws TimeoutException { } @Test - public void testToStringConsumer() throws TimeoutException { + void testToStringConsumer() throws TimeoutException { WaitingConsumer waitingConsumer = new WaitingConsumer(); ToStringConsumer toStringConsumer = new ToStringConsumer(); diff --git a/core/src/test/java/org/testcontainers/junit/ParameterizedDockerfileContainerTest.java b/core/src/test/java/org/testcontainers/junit/ParameterizedDockerfileContainerTest.java index 8437123f97a..0f98a35893b 100644 --- a/core/src/test/java/org/testcontainers/junit/ParameterizedDockerfileContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/ParameterizedDockerfileContainerTest.java @@ -1,24 +1,26 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.GenericContainer; import org.testcontainers.images.builder.ImageFromDockerfile; +import java.util.stream.Stream; + import static org.assertj.core.api.Assertions.assertThat; /** * Simple test case / demonstration of creating a fresh container image from a Dockerfile DSL when the test * is parameterized. */ -@RunWith(Parameterized.class) -public class ParameterizedDockerfileContainerTest { +@ParameterizedClass(name = "{0}") +@MethodSource("data") +class ParameterizedDockerfileContainerTest { private final String expectedVersion; - @Rule public GenericContainer container; public ParameterizedDockerfileContainerTest(String baseImage, String expectedVersion) { @@ -34,22 +36,22 @@ public ParameterizedDockerfileContainerTest(String baseImage, String expectedVer }) ) .withCommand("top"); + container.start(); this.expectedVersion = expectedVersion; } - @Parameterized.Parameters(name = "{0}") - public static Object[][] data() { - return new Object[][] { // - { "alpine:3.12", "3.12" }, - { "alpine:3.13", "3.13" }, - { "alpine:3.14", "3.14" }, - { "alpine:3.15", "3.15" }, - { "alpine:3.16", "3.16" }, - }; + public static Stream data() { + return Stream.of( + Arguments.of("alpine:3.12", "3.12"), + Arguments.of("alpine:3.13", "3.13"), + Arguments.of("alpine:3.14", "3.14"), + Arguments.of("alpine:3.15", "3.15"), + Arguments.of("alpine:3.16", "3.16") + ); } @Test - public void simpleTest() throws Exception { + void simpleTest() throws Exception { final String release = container.execInContainer("cat", "/etc/alpine-release").getStdout(); assertThat(release).as("/etc/alpine-release starts with " + expectedVersion).startsWith(expectedVersion); diff --git a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java index 05f65e1f493..a31b38e06ed 100644 --- a/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java +++ b/core/src/test/java/org/testcontainers/junit/WorkingDirectoryTest.java @@ -1,7 +1,6 @@ package org.testcontainers.junit; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; @@ -11,16 +10,19 @@ /** * Created by rnorth on 26/07/2016. */ -public class WorkingDirectoryTest { +class WorkingDirectoryTest { - @ClassRule public static GenericContainer container = new GenericContainer(TestImages.ALPINE_IMAGE) .withWorkingDirectory("/etc") .withStartupCheckStrategy(new OneShotStartupCheckStrategy()) .withCommand("ls", "-al"); + static { + container.start(); + } + @Test - public void checkOutput() { + void checkOutput() { String listing = container.getLogs(); assertThat(listing).as("Directory listing contains expected /etc content").contains("hostname"); diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java index 6c2dbb50244..fa97bbc25c3 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/AbstractWaitStrategyTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit.wait.strategy; import org.jetbrains.annotations.NotNull; -import org.junit.Before; +import org.junit.jupiter.api.BeforeEach; import org.rnorth.ducttape.RetryCountExceededException; import org.testcontainers.TestImages; import org.testcontainers.containers.ContainerLaunchException; @@ -36,7 +36,7 @@ public abstract class AbstractWaitStrategyTest { @NotNull protected abstract W buildWaitStrategy(final AtomicBoolean ready); - @Before + @BeforeEach public void setUp() { ready = new AtomicBoolean(false); } diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java index bed23566899..15b6aa74961 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/HostPortWaitStrategyTest.java @@ -1,9 +1,7 @@ package org.testcontainers.junit.wait.strategy; -import org.junit.ClassRule; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.testcontainers.TestImages; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.Wait; @@ -14,32 +12,35 @@ * Test wait strategy with overloaded waitingFor methods. * Other implementations of WaitStrategy are tested through backwards compatible wait strategy tests */ -@RunWith(Enclosed.class) -public class HostPortWaitStrategyTest { +class HostPortWaitStrategyTest { - public static class DefaultHostPortWaitStrategyTest { + @Nested + class DefaultHostPortWaitStrategyTest { - @ClassRule - public static GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE) + public GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts() .withCommand("sh", "-c", "while true; do nc -lp 8080; done") .withExposedPorts(8080) .waitingFor(Wait.forListeningPort().withStartupTimeout(Duration.ofSeconds(10))); @Test - public void testWaiting() {} + void testWaiting() { + container.start(); + } } - public static class ExplicitHostPortWaitStrategyTest { + @Nested + class ExplicitHostPortWaitStrategyTest { - @ClassRule - public static GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE) + public GenericContainer container = new GenericContainer<>(TestImages.ALPINE_IMAGE) .withExposedPorts() .withCommand("sh", "-c", "while true; do nc -lp 8080; done") .withExposedPorts(8080) .waitingFor(Wait.forListeningPorts(8080).withStartupTimeout(Duration.ofSeconds(10))); @Test - public void testWaiting() {} + void testWaiting() { + container.start(); + } } } diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java index 91c94009086..89a12ec3aea 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java @@ -2,7 +2,7 @@ import org.assertj.core.api.Assertions; import org.jetbrains.annotations.NotNull; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.rnorth.ducttape.RetryCountExceededException; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; @@ -18,7 +18,7 @@ /** * Tests for {@link HttpWaitStrategy}. */ -public class HttpWaitStrategyTest extends AbstractWaitStrategyTest { +class HttpWaitStrategyTest extends AbstractWaitStrategyTest { /** * newline sequence indicating end of the HTTP header. @@ -31,7 +31,7 @@ public class HttpWaitStrategyTest extends AbstractWaitStrategyTest headers = new HashMap<>(); headers.put("baz", "boo"); try ( @@ -64,7 +64,7 @@ public void testWaitUntilReadyWithSuccessWithCustomHeaders() { * certificate validation chains (to support self-signed certificates for example). */ @Test - public void testWaitUntilReadyWithTlsAndAllowUnsecure() { + void testWaitUntilReadyWithTlsAndAllowUnsecure() { try ( GenericContainer container = startContainerWithCommand( createHttpsShellCommand("200 OK", GOOD_RESPONSE_BODY, 8080), @@ -80,7 +80,7 @@ public void testWaitUntilReadyWithTlsAndAllowUnsecure() { * This 401 response is checked with a lambda using {@link HttpWaitStrategy#forStatusCodeMatching(Predicate)} */ @Test - public void testWaitUntilReadyWithUnauthorizedWithLambda() { + void testWaitUntilReadyWithUnauthorizedWithLambda() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("401 UNAUTHORIZED", GOOD_RESPONSE_BODY), @@ -96,7 +96,7 @@ public void testWaitUntilReadyWithUnauthorizedWithLambda() { * This 401 response is checked with many status codes using {@link HttpWaitStrategy#forStatusCode(int)} */ @Test - public void testWaitUntilReadyWithManyStatusCodes() { + void testWaitUntilReadyWithManyStatusCodes() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("401 UNAUTHORIZED", GOOD_RESPONSE_BODY), @@ -113,7 +113,7 @@ public void testWaitUntilReadyWithManyStatusCodes() { * and a lambda using {@link HttpWaitStrategy#forStatusCodeMatching(Predicate)} */ @Test - public void testWaitUntilReadyWithManyStatusCodesAndLambda() { + void testWaitUntilReadyWithManyStatusCodesAndLambda() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("401 UNAUTHORIZED", GOOD_RESPONSE_BODY), @@ -133,7 +133,7 @@ public void testWaitUntilReadyWithManyStatusCodesAndLambda() { * and {@link HttpWaitStrategy#forStatusCodeMatching(Predicate)} */ @Test - public void testWaitUntilReadyWithTimeoutAndWithManyStatusCodesAndLambda() { + void testWaitUntilReadyWithTimeoutAndWithManyStatusCodesAndLambda() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("401 UNAUTHORIZED", GOOD_RESPONSE_BODY), @@ -152,7 +152,7 @@ public void testWaitUntilReadyWithTimeoutAndWithManyStatusCodesAndLambda() { * Test case for: https://github.com/testcontainers/testcontainers-java/issues/880 */ @Test - public void testWaitUntilReadyWithTimeoutAndWithLambdaShouldNotMatchOk() { + void testWaitUntilReadyWithTimeoutAndWithLambdaShouldNotMatchOk() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("200 OK", GOOD_RESPONSE_BODY), @@ -168,7 +168,7 @@ public void testWaitUntilReadyWithTimeoutAndWithLambdaShouldNotMatchOk() { * response from the container within the timeout period. */ @Test - public void testWaitUntilReadyWithTimeout() { + void testWaitUntilReadyWithTimeout() { waitUntilReadyAndTimeout(createShellCommand("400 Bad Request", GOOD_RESPONSE_BODY)); } @@ -177,7 +177,7 @@ public void testWaitUntilReadyWithTimeout() { * from the container within the timeout period. */ @Test - public void testWaitUntilReadyWithTimeoutAndBadResponseBody() { + void testWaitUntilReadyWithTimeoutAndBadResponseBody() { waitUntilReadyAndTimeout(createShellCommand("200 OK", "Bad Response")); } @@ -185,7 +185,7 @@ public void testWaitUntilReadyWithTimeoutAndBadResponseBody() { * Expects the WaitStrategy probing the right port. */ @Test - public void testWaitUntilReadyWithSpecificPort() { + void testWaitUntilReadyWithSpecificPort() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("200 OK", GOOD_RESPONSE_BODY, 9090), @@ -200,7 +200,7 @@ public void testWaitUntilReadyWithSpecificPort() { } @Test - public void testWaitUntilReadyWithTimeoutCausedByReadTimeout() { + void testWaitUntilReadyWithTimeoutCausedByReadTimeout() { try ( GenericContainer container = startContainerWithCommand( createShellCommand("0 Connection Refused", GOOD_RESPONSE_BODY, 9090), @@ -217,7 +217,7 @@ public void testWaitUntilReadyWithTimeoutCausedByReadTimeout() { * The exceptions we should see in the stacktrace ('/' means 'caused by'): ContainerLaunchException / TimeoutException / RuntimeException / SSLHandshakeException / ValidatorException (in sun.* package so not accessible) / SunCertPathBuilderException (in sun.* package so not accessible). */ @Test - public void testWaitUntilReadyWithTimeoutCausedBySslHandshakeError() { + void testWaitUntilReadyWithTimeoutCausedBySslHandshakeError() { try ( GenericContainer container = new GenericContainer<>( new ImageFromDockerfile() diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/LogMessageWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/LogMessageWaitStrategyTest.java index 5dd9623107b..537254a60a1 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/LogMessageWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/LogMessageWaitStrategyTest.java @@ -1,9 +1,9 @@ package org.testcontainers.junit.wait.strategy; import org.jetbrains.annotations.NotNull; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,12 +11,12 @@ /** * Tests for {@link LogMessageWaitStrategy}. */ -@RunWith(Parameterized.class) -public class LogMessageWaitStrategyTest extends AbstractWaitStrategyTest { +@ParameterizedClass(name = "{0}") +@MethodSource("parameters") +class LogMessageWaitStrategyTest extends AbstractWaitStrategyTest { private final String pattern; - @Parameterized.Parameters(name = "{0}") public static Object[] parameters() { return new String[] { ".*ready.*\\s", // previous recommended style (explicit line ending) @@ -32,7 +32,7 @@ public LogMessageWaitStrategyTest(String pattern) { private static final String READY_MESSAGE = "I'm ready!"; @Test - public void testWaitUntilReady_Success() { + void testWaitUntilReady_Success() { waitUntilReadyAndSucceed( "echo -e \"" + READY_MESSAGE + @@ -46,7 +46,7 @@ public void testWaitUntilReady_Success() { } @Test - public void testWaitUntilReady_Timeout() { + void testWaitUntilReady_Timeout() { waitUntilReadyAndTimeout("echo -e \"" + READY_MESSAGE + "\";" + "echo -e \"foobar\";" + "sleep 300"); } diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/ShellStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/ShellStrategyTest.java index 0a85037cc14..20b08a5f396 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/ShellStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/ShellStrategyTest.java @@ -1,7 +1,7 @@ package org.testcontainers.junit.wait.strategy; import org.jetbrains.annotations.NotNull; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.wait.strategy.ShellStrategy; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,17 +9,17 @@ /** * Tests for {@link ShellStrategy}. */ -public class ShellStrategyTest extends AbstractWaitStrategyTest { +class ShellStrategyTest extends AbstractWaitStrategyTest { private static final String LOCK_FILE = "/tmp/ready.lock"; @Test - public void testWaitUntilReady_Success() { + void testWaitUntilReady_Success() { waitUntilReadyAndSucceed(String.format("touch %s; sleep 300", LOCK_FILE)); } @Test - public void testWaitUntilReady_Timeout() { + void testWaitUntilReady_Timeout() { waitUntilReadyAndTimeout("sleep 300"); } diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index 0e00dd87bf7..1f6fbc1551a 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -2,10 +2,9 @@ import com.github.dockerjava.api.model.AuthConfig; import org.intellij.lang.annotations.Language; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.ClassRule; -import org.junit.Test; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.mockito.Mockito; import org.testcontainers.DockerRegistryContainer; import org.testcontainers.TestImages; @@ -37,7 +36,6 @@ public class AuthenticatedImagePullTest { /** * Containerised docker image registry, with simple hardcoded credentials */ - @ClassRule public static DockerRegistryContainer authenticatedRegistry = new DockerRegistryContainer( new ImageFromDockerfile() .withDockerfileFromBuilder(builder -> { @@ -54,8 +52,10 @@ public class AuthenticatedImagePullTest { private final DockerImageName testImageName = authenticatedRegistry.createImage(); - @BeforeClass + @BeforeAll public static void beforeClass() throws Exception { + authenticatedRegistry.start(); + originalAuthLocatorSingleton = RegistryAuthLocator.instance(); String testRegistryAddress = authenticatedRegistry.getEndpoint(); @@ -77,13 +77,13 @@ public static void beforeClass() throws Exception { .thenReturn(authConfig); } - @AfterClass + @AfterAll public static void tearDown() { RegistryAuthLocator.setInstance(originalAuthLocatorSingleton); } @Test - public void testThatAuthLocatorIsUsedForContainerCreation() { + void testThatAuthLocatorIsUsedForContainerCreation() { // actually start a container, which will require an authenticated pull try ( final GenericContainer container = new GenericContainer<>(testImageName) @@ -96,7 +96,7 @@ public void testThatAuthLocatorIsUsedForContainerCreation() { } @Test - public void testThatAuthLocatorIsUsedForDockerfileBuild() throws IOException { + void testThatAuthLocatorIsUsedForDockerfileBuild() throws IOException { // Prepare a simple temporary Dockerfile which requires our custom private image Path tempFile = getLocalTempFile(".Dockerfile"); String dockerFileContent = "FROM " + testImageName.asCanonicalNameString(); @@ -116,7 +116,7 @@ public void testThatAuthLocatorIsUsedForDockerfileBuild() throws IOException { } @Test - public void testThatAuthLocatorIsUsedForDockerComposePull() throws IOException { + void testThatAuthLocatorIsUsedForDockerComposePull() throws IOException { // Prepare a simple temporary Docker Compose manifest which requires our custom private image Path tempFile = getLocalTempFile(".docker-compose.yml"); @Language("yaml") diff --git a/core/src/test/java/org/testcontainers/utility/ClasspathScannerTest.java b/core/src/test/java/org/testcontainers/utility/ClasspathScannerTest.java index e775a2cd492..63812c998e3 100644 --- a/core/src/test/java/org/testcontainers/utility/ClasspathScannerTest.java +++ b/core/src/test/java/org/testcontainers/utility/ClasspathScannerTest.java @@ -1,7 +1,7 @@ package org.testcontainers.utility; -import org.junit.BeforeClass; -import org.junit.Test; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import java.io.IOException; import java.net.URL; @@ -15,7 +15,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class ClasspathScannerTest { +class ClasspathScannerTest { private static URL FILE_A; @@ -27,7 +27,7 @@ public class ClasspathScannerTest { private static URL FILE_C; - @BeforeClass + @BeforeAll public static void setUp() throws Exception { FILE_A = new URL("file:///a/someName"); FILE_B = new URL("file:///b/someName"); @@ -37,7 +37,7 @@ public static void setUp() throws Exception { } @Test - public void realClassLoaderLookupOccurs() { + void realClassLoaderLookupOccurs() { // look for a resource that we know exists only once final List foundURLs = ClasspathScanner.scanFor("expectedClasspathFile.txt").collect(Collectors.toList()); @@ -45,7 +45,7 @@ public void realClassLoaderLookupOccurs() { } @Test - public void multipleResultsOnOneClassLoaderAreFound() throws IOException { + void multipleResultsOnOneClassLoaderAreFound() throws IOException { final ClassLoader firstMockClassLoader = mock(ClassLoader.class); when(firstMockClassLoader.getResources(eq("someName"))) .thenReturn(Collections.enumeration(Arrays.asList(FILE_A, FILE_B))); @@ -57,7 +57,7 @@ public void multipleResultsOnOneClassLoaderAreFound() throws IOException { } @Test - public void orderIsAlphabeticalForDeterminism() throws IOException { + void orderIsAlphabeticalForDeterminism() throws IOException { final ClassLoader firstMockClassLoader = mock(ClassLoader.class); when(firstMockClassLoader.getResources(eq("someName"))) .thenReturn(Collections.enumeration(Arrays.asList(FILE_B, JAR_A, JAR_B, FILE_A))); @@ -71,7 +71,7 @@ public void orderIsAlphabeticalForDeterminism() throws IOException { } @Test - public void multipleClassLoadersAreQueried() throws IOException { + void multipleClassLoadersAreQueried() throws IOException { final ClassLoader firstMockClassLoader = mock(ClassLoader.class); when(firstMockClassLoader.getResources(eq("someName"))) .thenReturn(Collections.enumeration(Arrays.asList(FILE_A, FILE_B))); diff --git a/core/src/test/java/org/testcontainers/utility/ComparableVersionTest.java b/core/src/test/java/org/testcontainers/utility/ComparableVersionTest.java index cd95d8a5f3d..dadf3983926 100644 --- a/core/src/test/java/org/testcontainers/utility/ComparableVersionTest.java +++ b/core/src/test/java/org/testcontainers/utility/ComparableVersionTest.java @@ -1,32 +1,20 @@ package org.testcontainers.utility; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; import java.util.Arrays; import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) -public class ComparableVersionTest { +class ComparableVersionTest { - private final int[] expected; - - private final String given; - - public ComparableVersionTest(final String given, final int[] expected) { - this.given = given; - this.expected = expected; - } - - @Test - public void shouldParseVersions() { + @ParameterizedTest(name = "Parsed version: {0}={1}") + @MethodSource("data") + void shouldParseVersions(String given, int[] expected) { assertThat(ComparableVersion.parseVersion(given)).containsExactly(expected); } - @Parameters(name = "Parsed version: {0}={1}") public static Iterable data() { return Arrays.asList( new Object[][] { diff --git a/core/src/test/java/org/testcontainers/utility/DefaultImageNameSubstitutorTest.java b/core/src/test/java/org/testcontainers/utility/DefaultImageNameSubstitutorTest.java index 90f7745edd7..143455d5b16 100644 --- a/core/src/test/java/org/testcontainers/utility/DefaultImageNameSubstitutorTest.java +++ b/core/src/test/java/org/testcontainers/utility/DefaultImageNameSubstitutorTest.java @@ -1,14 +1,15 @@ package org.testcontainers.utility; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mockito; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.eq; -public class DefaultImageNameSubstitutorTest { +@ExtendWith(MockTestcontainersConfigurationExtension.class) +class DefaultImageNameSubstitutorTest { public static final DockerImageName ORIGINAL_IMAGE = DockerImageName.parse("foo"); @@ -16,16 +17,13 @@ public class DefaultImageNameSubstitutorTest { private ConfigurationFileImageNameSubstitutor underTest; - @Rule - public MockTestcontainersConfigurationRule config = new MockTestcontainersConfigurationRule(); - - @Before + @BeforeEach public void setUp() { underTest = new ConfigurationFileImageNameSubstitutor(TestcontainersConfiguration.getInstance()); } @Test - public void testConfigurationLookup() { + void testConfigurationLookup() { Mockito .doReturn(SUBSTITUTE_IMAGE) .when(TestcontainersConfiguration.getInstance()) diff --git a/core/src/test/java/org/testcontainers/utility/DirectoryTarResourceTest.java b/core/src/test/java/org/testcontainers/utility/DirectoryTarResourceTest.java index a56315085ae..bfd3641adeb 100644 --- a/core/src/test/java/org/testcontainers/utility/DirectoryTarResourceTest.java +++ b/core/src/test/java/org/testcontainers/utility/DirectoryTarResourceTest.java @@ -1,7 +1,7 @@ package org.testcontainers.utility; import org.assertj.core.api.Condition; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.startupcheck.OneShotStartupCheckStrategy; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -11,10 +11,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class DirectoryTarResourceTest { +class DirectoryTarResourceTest { @Test - public void simpleRecursiveFileTest() { + void simpleRecursiveFileTest() { // 'src' is expected to be the project base directory, so all source code/resources should be copied in File directory = new File("src"); @@ -41,7 +41,7 @@ public void simpleRecursiveFileTest() { } @Test - public void simpleRecursiveFileWithPermissionTest() { + void simpleRecursiveFileWithPermissionTest() { try ( GenericContainer container = new GenericContainer( new ImageFromDockerfile() @@ -67,7 +67,7 @@ public void simpleRecursiveFileWithPermissionTest() { } @Test - public void simpleRecursiveClasspathResourceTest() { + void simpleRecursiveClasspathResourceTest() { // This test combines the copying of classpath resources from JAR files with the recursive TAR approach, to allow JARed classpath resources to be copied in to an image try ( diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java index dd17981111f..dc7bf9ba1ab 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java @@ -1,21 +1,21 @@ package org.testcontainers.utility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -public class DockerImageNameCompatibilityTest { +class DockerImageNameCompatibilityTest { @Test - public void testPlainImage() { + void testPlainImage() { DockerImageName subject = DockerImageName.parse("foo"); assertThat(subject.isCompatibleWith(DockerImageName.parse("bar"))).as("image name foo != bar").isFalse(); } @Test - public void testNoTagTreatedAsWildcard() { + void testNoTagTreatedAsWildcard() { final DockerImageName subject = DockerImageName.parse("foo:4.5.6"); /* foo:1.2.3 != foo:4.5.6 @@ -28,7 +28,7 @@ public void testNoTagTreatedAsWildcard() { } @Test - public void testImageWithAutomaticCompatibilityForFullPath() { + void testImageWithAutomaticCompatibilityForFullPath() { DockerImageName subject = DockerImageName.parse("repo/foo:1.2.3"); assertThat(subject.isCompatibleWith(DockerImageName.parse("repo/foo"))) @@ -37,7 +37,7 @@ public void testImageWithAutomaticCompatibilityForFullPath() { } @Test - public void testImageWithClaimedCompatibility() { + void testImageWithClaimedCompatibility() { DockerImageName subject = DockerImageName.parse("foo").asCompatibleSubstituteFor("bar"); assertThat(subject.isCompatibleWith(DockerImageName.parse("bar"))).as("foo(bar) ~= bar").isTrue(); @@ -45,14 +45,14 @@ public void testImageWithClaimedCompatibility() { } @Test - public void testImageWithClaimedCompatibilityAndVersion() { + void testImageWithClaimedCompatibilityAndVersion() { DockerImageName subject = DockerImageName.parse("foo:1.2.3").asCompatibleSubstituteFor("bar"); assertThat(subject.isCompatibleWith(DockerImageName.parse("bar"))).as("foo:1.2.3(bar) ~= bar").isTrue(); } @Test - public void testImageWithClaimedCompatibilityForFullPath() { + void testImageWithClaimedCompatibilityForFullPath() { DockerImageName subject = DockerImageName.parse("foo").asCompatibleSubstituteFor("registry/repo/bar"); assertThat(subject.isCompatibleWith(DockerImageName.parse("registry/repo/bar"))) @@ -67,7 +67,7 @@ public void testImageWithClaimedCompatibilityForFullPath() { } @Test - public void testImageWithClaimedCompatibilityForVersion() { + void testImageWithClaimedCompatibilityForVersion() { DockerImageName subject = DockerImageName.parse("foo").asCompatibleSubstituteFor("bar:1.2.3"); assertThat(subject.isCompatibleWith(DockerImageName.parse("bar"))).as("foo(bar:1.2.3) ~= bar").isTrue(); @@ -86,19 +86,19 @@ public void testImageWithClaimedCompatibilityForVersion() { } @Test - public void testAssertMethodAcceptsCompatible() { + void testAssertMethodAcceptsCompatible() { DockerImageName subject = DockerImageName.parse("foo").asCompatibleSubstituteFor("bar"); subject.assertCompatibleWith(DockerImageName.parse("bar")); } @Test - public void testAssertMethodAcceptsCompatibleLibraryPrefix() { + void testAssertMethodAcceptsCompatibleLibraryPrefix() { DockerImageName subject = DockerImageName.parse("library/foo"); subject.assertCompatibleWith(DockerImageName.parse("foo")); } @Test - public void testAssertMethodRejectsIncompatible() { + void testAssertMethodRejectsIncompatible() { DockerImageName subject = DockerImageName.parse("foo"); assertThatThrownBy(() -> subject.assertCompatibleWith(DockerImageName.parse("bar"))) .isInstanceOf(IllegalStateException.class) diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index b1a0cbc980f..7d6f8cd2633 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -1,19 +1,20 @@ package org.testcontainers.utility; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; -@RunWith(Enclosed.class) -public class DockerImageNameTest { +class DockerImageNameTest { - @RunWith(Parameterized.class) - public static class ValidNames { + @Nested + class ValidNames { - @Parameterized.Parameters(name = "{0}") public static String[] getNames() { return new String[] { "myname:latest", @@ -30,19 +31,16 @@ public static String[] getNames() { }; } - @Parameterized.Parameter - public String imageName; - - @Test - public void testValidNameAccepted() { + @ParameterizedTest + @MethodSource("getNames") + void testValidNameAccepted(String imageName) { DockerImageName.parse(imageName).assertValid(); } } - @RunWith(Parameterized.class) - public static class InvalidNames { + @Nested + class InvalidNames { - @Parameterized.Parameters(name = "{0}") public static String[] getNames() { return new String[] { ":latest", @@ -53,62 +51,58 @@ public static String[] getNames() { }; } - @Parameterized.Parameter - public String imageName; - - @Test(expected = IllegalArgumentException.class) - public void testInvalidNameRejected() { - DockerImageName.parse(imageName).assertValid(); + @ParameterizedTest + @MethodSource("getNames") + void testInvalidNameRejected(String imageName) { + assertThatThrownBy(() -> DockerImageName.parse(imageName).assertValid()) + .isInstanceOf(IllegalArgumentException.class); } } - @RunWith(Parameterized.class) - public static class Parsing { - - @Parameterized.Parameters(name = "{0}{1}{2}{3}{4}") - public static String[][] getNames() { - return new String[][] { - { "", "", "myname", ":", null }, - { "", "", "myname", ":", "latest" }, - { "", "", "repo/myname", ":", null }, - { "", "", "repo/myname", ":", "latest" }, - { "registry.foo.com:1234", "/", "my-name", ":", null }, - { "registry.foo.com:1234", "/", "my-name", ":", "1.0" }, - { "registry.foo.com", "/", "my-name", ":", "1.0" }, - { "registry.foo.com:1234", "/", "repo_here/my-name", ":", null }, - { "registry.foo.com:1234", "/", "repo_here/my-name", ":", "1.0" }, - { "1.2.3.4:1234", "/", "repo_here/my-name", ":", null }, - { "1.2.3.4:1234", "/", "repo_here/my-name", ":", "1.0" }, - { "1.2.3.4:1234", "/", "my-name", ":", null }, - { "1.2.3.4:1234", "/", "my-name", ":", "1.0" }, - { "", "", "myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "", "", "repo/myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "registry.foo.com:1234", "/", "repo-here/my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "registry.foo.com:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - { "1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd" }, - }; + @Nested + class Parsing { + + public static Stream getNames() { + return Stream.of( + Arguments.of("", "", "myname", ":", null), + Arguments.of("", "", "myname", ":", "latest"), + Arguments.of("", "", "repo/myname", ":", null), + Arguments.of("", "", "repo/myname", ":", "latest"), + Arguments.of("registry.foo.com:1234", "/", "my-name", ":", null), + Arguments.of("registry.foo.com:1234", "/", "my-name", ":", "1.0"), + Arguments.of("registry.foo.com", "/", "my-name", ":", "1.0"), + Arguments.of("registry.foo.com:1234", "/", "repo_here/my-name", ":", null), + Arguments.of("registry.foo.com:1234", "/", "repo_here/my-name", ":", "1.0"), + Arguments.of("1.2.3.4:1234", "/", "repo_here/my-name", ":", null), + Arguments.of("1.2.3.4:1234", "/", "repo_here/my-name", ":", "1.0"), + Arguments.of("1.2.3.4:1234", "/", "my-name", ":", null), + Arguments.of("1.2.3.4:1234", "/", "my-name", ":", "1.0"), + Arguments.of("", "", "myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of("", "", "repo/myname", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of( + "registry.foo.com:1234", + "/", + "repo-here/my-name", + "@", + "sha256:1234abcd1234abcd1234abcd1234abcd" + ), + Arguments.of("registry.foo.com:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of("1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of("1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of("1.2.3.4", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd"), + Arguments.of("1.2.3.4:1234", "/", "my-name", "@", "sha256:1234abcd1234abcd1234abcd1234abcd") + ); } - @Parameterized.Parameter(0) - public String registry; - - @Parameterized.Parameter(1) - public String registrySeparator; - - @Parameterized.Parameter(2) - public String repo; - - @Parameterized.Parameter(3) - public String versionSeparator; - - @Parameterized.Parameter(4) - public String version; - - @Test - public void testParsing() { + @ParameterizedTest + @MethodSource("getNames") + void testParsing( + String registry, + String registrySeparator, + String repo, + String versionSeparator, + String version + ) { final String unversionedPart = registry + registrySeparator + repo; String combined; diff --git a/core/src/test/java/org/testcontainers/utility/DockerLoggerFactoryTest.java b/core/src/test/java/org/testcontainers/utility/DockerLoggerFactoryTest.java index 17f0f3d7160..cf3352902ec 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerLoggerFactoryTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerLoggerFactoryTest.java @@ -4,16 +4,16 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.read.ListAppender; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -public class DockerLoggerFactoryTest { +class DockerLoggerFactoryTest { private static final Logger LOGGER = (Logger) DockerLoggerFactory.getLogger("dockerImageName"); @Test - public void debugIsNotSwallowedForContainerLogs() { + void debugIsNotSwallowedForContainerLogs() { ListAppender listAppender = new ListAppender<>(); listAppender.start(); LOGGER.addAppender(listAppender); diff --git a/core/src/test/java/org/testcontainers/utility/DockerStatusTest.java b/core/src/test/java/org/testcontainers/utility/DockerStatusTest.java index 304bbc4190d..543cbdfeba1 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerStatusTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerStatusTest.java @@ -1,26 +1,25 @@ package org.testcontainers.utility; import com.github.dockerjava.api.command.InspectContainerResponse; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import org.mockito.Mockito; import java.time.Duration; import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -/** - * - */ -@RunWith(Parameterized.class) -public class DockerStatusTest { +@ParameterizedClass +@MethodSource("parameters") +class DockerStatusTest { - private final DateTimeFormatter dateTimeFormatter; + private DateTimeFormatter dateTimeFormatter; private static final Instant now = Instant.now(); @@ -52,16 +51,15 @@ public DockerStatusTest(DateTimeFormatter dateTimeFormatter) { paused = buildState(false, true, buildTimestamp(now.minusMillis(100)), DockerStatus.DOCKER_TIMESTAMP_ZERO); } - @Parameterized.Parameters - public static Object[][] parameters() { - return new Object[][] { - { DateTimeFormatter.ISO_INSTANT }, - { DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.of("America/New_York")) }, - }; + public static Stream parameters() { + return Stream.of( + DateTimeFormatter.ISO_INSTANT, + DateTimeFormatter.ISO_OFFSET_DATE_TIME.withZone(ZoneId.of("America/New_York")) + ); } @Test - public void testRunning() throws Exception { + void testRunning() { assertThat(DockerStatus.isContainerRunning(running, minimumDuration, now)).isTrue(); assertThat(DockerStatus.isContainerRunning(runningVariant, minimumDuration, now)).isTrue(); assertThat(DockerStatus.isContainerRunning(shortRunning, minimumDuration, now)).isFalse(); @@ -72,7 +70,7 @@ public void testRunning() throws Exception { } @Test - public void testStopped() throws Exception { + void testStopped() { assertThat(DockerStatus.isContainerStopped(running)).isFalse(); assertThat(DockerStatus.isContainerStopped(runningVariant)).isFalse(); assertThat(DockerStatus.isContainerStopped(shortRunning)).isFalse(); diff --git a/core/src/test/java/org/testcontainers/utility/FilterRegistryTest.java b/core/src/test/java/org/testcontainers/utility/FilterRegistryTest.java index 2741edb5cee..af71e49664e 100644 --- a/core/src/test/java/org/testcontainers/utility/FilterRegistryTest.java +++ b/core/src/test/java/org/testcontainers/utility/FilterRegistryTest.java @@ -1,6 +1,6 @@ package org.testcontainers.utility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.utility.ResourceReaper.FilterRegistry; import java.io.ByteArrayInputStream; @@ -15,7 +15,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class FilterRegistryTest { +class FilterRegistryTest { private static final List> FILTERS = Arrays.asList( new SimpleEntry<>("key1!", "value2?"), @@ -31,7 +31,7 @@ public class FilterRegistryTest { private static final String NEW_LINE = "\n"; @Test - public void registerReturnsTrueIfAcknowledgementIsReadFromInputStream() throws IOException { + void registerReturnsTrueIfAcknowledgementIsReadFromInputStream() throws IOException { FilterRegistry registry = new FilterRegistry(inputStream(ACKNOWLEDGEMENT), anyOutputStream()); boolean successful = registry.register(FILTERS); @@ -40,7 +40,7 @@ public void registerReturnsTrueIfAcknowledgementIsReadFromInputStream() throws I } @Test - public void registerReturnsFalseIfNoAcknowledgementIsReadFromInputStream() throws IOException { + void registerReturnsFalseIfNoAcknowledgementIsReadFromInputStream() throws IOException { FilterRegistry registry = new FilterRegistry(inputStream(NO_ACKNOWLEDGEMENT), anyOutputStream()); boolean successful = registry.register(FILTERS); @@ -49,7 +49,7 @@ public void registerReturnsFalseIfNoAcknowledgementIsReadFromInputStream() throw } @Test - public void registerWritesUrlEncodedFiltersAndNewlineToOutputStream() throws IOException { + void registerWritesUrlEncodedFiltersAndNewlineToOutputStream() throws IOException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); FilterRegistry registry = new FilterRegistry(anyInputStream(), outputStream); diff --git a/core/src/test/java/org/testcontainers/utility/ImageNameSubstitutorTest.java b/core/src/test/java/org/testcontainers/utility/ImageNameSubstitutorTest.java index 6c29e26c58f..e6a0c294c77 100644 --- a/core/src/test/java/org/testcontainers/utility/ImageNameSubstitutorTest.java +++ b/core/src/test/java/org/testcontainers/utility/ImageNameSubstitutorTest.java @@ -1,10 +1,10 @@ package org.testcontainers.utility; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mockito; import org.testcontainers.containers.GenericContainer; @@ -20,19 +20,17 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.eq; -public class ImageNameSubstitutorTest { +@ExtendWith(MockTestcontainersConfigurationExtension.class) +class ImageNameSubstitutorTest { - @Rule - public TemporaryFolder tempFolder = new TemporaryFolder(); - - @Rule - public MockTestcontainersConfigurationRule config = new MockTestcontainersConfigurationRule(); + @TempDir + public Path tempFolder; private ImageNameSubstitutor originalInstance; private ImageNameSubstitutor originalDefaultImplementation; - @Before + @BeforeEach public void setUp() throws Exception { originalInstance = ImageNameSubstitutor.instance; originalDefaultImplementation = ImageNameSubstitutor.defaultImplementation; @@ -46,14 +44,14 @@ public void setUp() throws Exception { Mockito.doReturn("default implementation").when(ImageNameSubstitutor.defaultImplementation).getDescription(); } - @After + @AfterEach public void tearDown() throws Exception { ImageNameSubstitutor.instance = originalInstance; ImageNameSubstitutor.defaultImplementation = originalDefaultImplementation; } @Test - public void simpleConfigurationTest() { + void simpleConfigurationTest() { Mockito .doReturn(FakeImageSubstitutor.class.getCanonicalName()) .when(TestcontainersConfiguration.getInstance()) @@ -68,7 +66,7 @@ public void simpleConfigurationTest() { } @Test - public void testWorksWithoutConfiguredImplementation() { + void testWorksWithoutConfiguredImplementation() { Mockito.doReturn(null).when(TestcontainersConfiguration.getInstance()).getImageSubstitutorClassName(); final ImageNameSubstitutor imageNameSubstitutor = ImageNameSubstitutor.instance(); @@ -80,7 +78,7 @@ public void testWorksWithoutConfiguredImplementation() { } @Test - public void testImageNameSubstitutorToString() { + void testImageNameSubstitutorToString() { Mockito .doReturn(FakeImageSubstitutor.class.getCanonicalName()) .when(TestcontainersConfiguration.getInstance()) @@ -95,8 +93,8 @@ public void testImageNameSubstitutorToString() { } @Test - public void testImageNameSubstitutorFromServiceLoader() throws IOException { - Path tempDir = this.tempFolder.newFolder("image-name-substitutor-test").toPath(); + void testImageNameSubstitutorFromServiceLoader() throws IOException { + Path tempDir = this.tempFolder.resolve("image-name-substitutor-test"); Path metaInfDir = Paths.get(tempDir.toString(), "META-INF", "services"); Files.createDirectories(metaInfDir); diff --git a/core/src/test/java/org/testcontainers/utility/LazyFutureTest.java b/core/src/test/java/org/testcontainers/utility/LazyFutureTest.java index 822109ff9cd..afc78076b43 100644 --- a/core/src/test/java/org/testcontainers/utility/LazyFutureTest.java +++ b/core/src/test/java/org/testcontainers/utility/LazyFutureTest.java @@ -2,7 +2,8 @@ import com.google.common.util.concurrent.Futures; import lombok.SneakyThrows; -import org.junit.Test; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.Timeout; import java.util.Collections; import java.util.List; @@ -18,10 +19,10 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class LazyFutureTest { +class LazyFutureTest { @Test - public void testLaziness() throws Exception { + void testLaziness() throws Exception { AtomicInteger counter = new AtomicInteger(); Future lazyFuture = new LazyFuture() { @@ -39,8 +40,9 @@ protected Integer resolve() { assertThat(lazyFuture.get()).as("result of resolve() must be cached").isEqualTo(1); } - @Test(timeout = 5_000) - public void timeoutWorks() { + @Test + @Timeout(5) + void timeoutWorks() { Future lazyFuture = new LazyFuture() { @Override @SneakyThrows(InterruptedException.class) @@ -55,8 +57,9 @@ protected Void resolve() { .isInstanceOf(TimeoutException.class); } - @Test(timeout = 5_000) - public void testThreadSafety() throws Exception { + @Test + @Timeout(5) + void testThreadSafety() throws Exception { final int numOfThreads = 3; CountDownLatch latch = new CountDownLatch(numOfThreads); AtomicInteger counter = new AtomicInteger(); diff --git a/core/src/test/java/org/testcontainers/utility/LicenseAcceptanceTest.java b/core/src/test/java/org/testcontainers/utility/LicenseAcceptanceTest.java index 63da017c88e..c0ca63c06bc 100644 --- a/core/src/test/java/org/testcontainers/utility/LicenseAcceptanceTest.java +++ b/core/src/test/java/org/testcontainers/utility/LicenseAcceptanceTest.java @@ -1,17 +1,20 @@ package org.testcontainers.utility; -import org.junit.Test; +import org.junit.jupiter.api.Test; -public class LicenseAcceptanceTest { +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class LicenseAcceptanceTest { @Test - public void testForExistingNames() { + void testForExistingNames() { LicenseAcceptance.assertLicenseAccepted("a"); LicenseAcceptance.assertLicenseAccepted("b"); } - @Test(expected = IllegalStateException.class) - public void testForMissingNames() { - LicenseAcceptance.assertLicenseAccepted("c"); + @Test + void testForMissingNames() { + assertThatThrownBy(() -> LicenseAcceptance.assertLicenseAccepted("c")) + .isInstanceOf(IllegalStateException.class); } } diff --git a/core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationExtension.java b/core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationExtension.java new file mode 100644 index 00000000000..a94e6b7772e --- /dev/null +++ b/core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationExtension.java @@ -0,0 +1,39 @@ +package org.testcontainers.utility; + +import org.junit.jupiter.api.extension.AfterEachCallback; +import org.junit.jupiter.api.extension.BeforeEachCallback; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.mockito.Mockito; + +import java.util.concurrent.atomic.AtomicReference; + +/** + * This {@link org.junit.jupiter.api.extension.Extension} applies a spy on {@link TestcontainersConfiguration} + * for testing features that depend on the global configuration. + */ +public class MockTestcontainersConfigurationExtension implements BeforeEachCallback, AfterEachCallback { + + private static final ExtensionContext.Namespace NS = ExtensionContext.Namespace.create( + MockTestcontainersConfigurationExtension.class + ); + + static AtomicReference REF = TestcontainersConfiguration.getInstanceField(); + + @Override + public void beforeEach(ExtensionContext context) throws Exception { + TestcontainersConfiguration previous = REF.get(); + if (previous == null) { + previous = TestcontainersConfiguration.getInstance(); + } + REF.set(Mockito.spy(previous)); + context.getStore(NS).put(context.getUniqueId(), previous); + } + + @Override + public void afterEach(ExtensionContext context) throws Exception { + TestcontainersConfiguration previous = context + .getStore(NS) + .remove(context.getUniqueId(), TestcontainersConfiguration.class); + REF.set(previous); + } +} diff --git a/core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationRule.java b/core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationRule.java deleted file mode 100644 index ba467f13897..00000000000 --- a/core/src/test/java/org/testcontainers/utility/MockTestcontainersConfigurationRule.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.testcontainers.utility; - -import org.jetbrains.annotations.NotNull; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; -import org.mockito.Mockito; - -import java.util.concurrent.atomic.AtomicReference; - -/** - * This {@link TestRule} applies a spy on {@link TestcontainersConfiguration} - * for testing features that depend on the global configuration. - */ -public class MockTestcontainersConfigurationRule implements TestRule { - - static AtomicReference REF = TestcontainersConfiguration.getInstanceField(); - - @NotNull - @Override - public Statement apply(@NotNull Statement base, @NotNull Description description) { - return new Statement() { - @Override - public void evaluate() throws Throwable { - TestcontainersConfiguration previous = REF.get(); - if (previous == null) { - previous = TestcontainersConfiguration.getInstance(); - } - REF.set(Mockito.spy(previous)); - - try { - base.evaluate(); - } finally { - REF.set(previous); - } - } - }; - } -} diff --git a/core/src/test/java/org/testcontainers/utility/MountableFileTest.java b/core/src/test/java/org/testcontainers/utility/MountableFileTest.java index fbfb537ef87..72db429c263 100644 --- a/core/src/test/java/org/testcontainers/utility/MountableFileTest.java +++ b/core/src/test/java/org/testcontainers/utility/MountableFileTest.java @@ -5,7 +5,7 @@ import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.jetbrains.annotations.NotNull; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -17,7 +17,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class MountableFileTest { +class MountableFileTest { private static final int TEST_FILE_MODE = 0532; @@ -26,35 +26,35 @@ public class MountableFileTest { private static final int BASE_DIR_MODE = 0040000; @Test - public void forClasspathResource() throws Exception { + void forClasspathResource() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("mappable-resource/test-resource.txt"); performChecks(mountableFile); } @Test - public void forClasspathResourceWithAbsolutePath() throws Exception { + void forClasspathResourceWithAbsolutePath() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("/mappable-resource/test-resource.txt"); performChecks(mountableFile); } @Test - public void forClasspathResourceFromJar() throws Exception { + void forClasspathResourceFromJar() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("META-INF/dummy_unique_name.txt"); performChecks(mountableFile); } @Test - public void forClasspathResourceFromJarWithAbsolutePath() throws Exception { + void forClasspathResourceFromJarWithAbsolutePath() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("/META-INF/dummy_unique_name.txt"); performChecks(mountableFile); } @Test - public void forHostPath() throws Exception { + void forHostPath() throws Exception { final Path file = createTempFile("somepath"); final MountableFile mountableFile = MountableFile.forHostPath(file.toString()); @@ -62,7 +62,7 @@ public void forHostPath() throws Exception { } @Test - public void forHostPathWithSpaces() throws Exception { + void forHostPathWithSpaces() throws Exception { final Path file = createTempFile("some path"); final MountableFile mountableFile = MountableFile.forHostPath(file.toString()); @@ -75,7 +75,7 @@ public void forHostPathWithSpaces() throws Exception { } @Test - public void forHostPathWithPlus() throws Exception { + void forHostPathWithPlus() throws Exception { final Path file = createTempFile("some+path"); final MountableFile mountableFile = MountableFile.forHostPath(file.toString()); @@ -88,7 +88,7 @@ public void forHostPathWithPlus() throws Exception { } @Test - public void forClasspathResourceWithPermission() throws Exception { + void forClasspathResourceWithPermission() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource( "mappable-resource/test-resource.txt", TEST_FILE_MODE @@ -99,7 +99,7 @@ public void forClasspathResourceWithPermission() throws Exception { } @Test - public void forHostFilePathWithPermission() throws Exception { + void forHostFilePathWithPermission() throws Exception { final Path file = createTempFile("somepath"); final MountableFile mountableFile = MountableFile.forHostPath(file.toString(), TEST_FILE_MODE); performChecks(mountableFile); @@ -107,7 +107,7 @@ public void forHostFilePathWithPermission() throws Exception { } @Test - public void forHostDirPathWithPermission() throws Exception { + void forHostDirPathWithPermission() throws Exception { final Path dir = createTempDir(); final MountableFile mountableFile = MountableFile.forHostPath(dir.toString(), TEST_FILE_MODE); performChecks(mountableFile); @@ -115,7 +115,7 @@ public void forHostDirPathWithPermission() throws Exception { } @Test - public void noTrailingSlashesInTarEntryNames() throws Exception { + void noTrailingSlashesInTarEntryNames() throws Exception { final MountableFile mountableFile = MountableFile.forClasspathResource("mappable-resource/test-resource.txt"); @Cleanup diff --git a/core/src/test/java/org/testcontainers/utility/PrefixingImageNameSubstitutorTest.java b/core/src/test/java/org/testcontainers/utility/PrefixingImageNameSubstitutorTest.java index 04786119e36..6eb6c62905c 100644 --- a/core/src/test/java/org/testcontainers/utility/PrefixingImageNameSubstitutorTest.java +++ b/core/src/test/java/org/testcontainers/utility/PrefixingImageNameSubstitutorTest.java @@ -1,7 +1,7 @@ package org.testcontainers.utility; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; @@ -9,20 +9,20 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -public class PrefixingImageNameSubstitutorTest { +class PrefixingImageNameSubstitutorTest { private TestcontainersConfiguration mockConfiguration; private PrefixingImageNameSubstitutor underTest; - @Before + @BeforeEach public void setUp() { mockConfiguration = mock(TestcontainersConfiguration.class); underTest = new PrefixingImageNameSubstitutor(mockConfiguration); } @Test - public void testHappyPath() { + void testHappyPath() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/our-mirror/"); @@ -34,7 +34,7 @@ public void testHappyPath() { } @Test - public void hubIoRegistryIsNotChanged() { + void hubIoRegistryIsNotChanged() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/our-mirror/"); @@ -44,7 +44,7 @@ public void hubIoRegistryIsNotChanged() { } @Test - public void hubComRegistryIsNotChanged() { + void hubComRegistryIsNotChanged() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/our-mirror/"); @@ -56,7 +56,7 @@ public void hubComRegistryIsNotChanged() { } @Test - public void thirdPartyRegistriesNotAffected() { + void thirdPartyRegistriesNotAffected() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/our-mirror/"); @@ -68,7 +68,7 @@ public void thirdPartyRegistriesNotAffected() { } @Test - public void testNoDoublePrefixing() { + void testNoDoublePrefixing() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/our-mirror/"); @@ -80,7 +80,7 @@ public void testNoDoublePrefixing() { } @Test - public void testHandlesEmptyValue() { + void testHandlesEmptyValue() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn(""); @@ -92,7 +92,7 @@ public void testHandlesEmptyValue() { } @Test - public void testHandlesRegistryOnlyWithTrailingSlash() { + void testHandlesRegistryOnlyWithTrailingSlash() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/"); @@ -104,7 +104,7 @@ public void testHandlesRegistryOnlyWithTrailingSlash() { } @Test - public void testCombinesLiterallyForRegistryOnlyWithoutTrailingSlash() { + void testCombinesLiterallyForRegistryOnlyWithoutTrailingSlash() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com"); @@ -116,7 +116,7 @@ public void testCombinesLiterallyForRegistryOnlyWithoutTrailingSlash() { } @Test - public void testCombinesLiterallyForBothPartsWithoutTrailingSlash() { + void testCombinesLiterallyForBothPartsWithoutTrailingSlash() { when(mockConfiguration.getEnvVarOrProperty(eq(PrefixingImageNameSubstitutor.PREFIX_PROPERTY_KEY), any())) .thenReturn("someregistry.com/our-mirror"); diff --git a/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java b/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java index ed986b05015..6988cfd86a8 100644 --- a/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java +++ b/core/src/test/java/org/testcontainers/utility/RegistryAuthLocatorTest.java @@ -5,7 +5,7 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.SystemUtils; import org.jetbrains.annotations.NotNull; -import org.junit.Test; +import org.junit.jupiter.api.Test; import java.io.File; import java.io.IOException; @@ -17,10 +17,10 @@ import static org.assertj.core.api.Assertions.assertThat; -public class RegistryAuthLocatorTest { +class RegistryAuthLocatorTest { @Test - public void lookupAuthConfigWithoutCredentials() throws URISyntaxException, IOException { + void lookupAuthConfigWithoutCredentials() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-empty.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -36,7 +36,7 @@ public void lookupAuthConfigWithoutCredentials() throws URISyntaxException, IOEx } @Test - public void lookupAuthConfigWithBasicAuthCredentials() throws URISyntaxException, IOException { + void lookupAuthConfigWithBasicAuthCredentials() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-basic-auth.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -52,7 +52,7 @@ public void lookupAuthConfigWithBasicAuthCredentials() throws URISyntaxException } @Test - public void lookupAuthConfigWithJsonKeyCredentials() throws URISyntaxException, IOException { + void lookupAuthConfigWithJsonKeyCredentials() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-json-key.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -68,8 +68,7 @@ public void lookupAuthConfigWithJsonKeyCredentials() throws URISyntaxException, } @Test - public void lookupAuthConfigWithJsonKeyCredentialsPartialMatchShouldGiveNoResult() - throws URISyntaxException, IOException { + void lookupAuthConfigWithJsonKeyCredentialsPartialMatchShouldGiveNoResult() throws URISyntaxException, IOException { // contains entry for registry.example.com final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-json-key.json"); @@ -83,7 +82,7 @@ public void lookupAuthConfigWithJsonKeyCredentialsPartialMatchShouldGiveNoResult } @Test - public void lookupAuthConfigUsingStore() throws URISyntaxException, IOException { + void lookupAuthConfigUsingStore() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-store.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -103,7 +102,7 @@ public void lookupAuthConfigUsingStore() throws URISyntaxException, IOException } @Test - public void lookupAuthConfigUsingHelper() throws URISyntaxException, IOException { + void lookupAuthConfigUsingHelper() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-helper.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -123,7 +122,7 @@ public void lookupAuthConfigUsingHelper() throws URISyntaxException, IOException } @Test - public void lookupAuthConfigUsingHelperWithToken() throws URISyntaxException, IOException { + void lookupAuthConfigUsingHelperWithToken() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-helper-using-token.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -140,7 +139,7 @@ public void lookupAuthConfigUsingHelperWithToken() throws URISyntaxException, IO } @Test - public void lookupUsingHelperEmptyAuth() throws URISyntaxException, IOException { + void lookupUsingHelperEmptyAuth() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-empty-auth-with-helper.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -160,7 +159,7 @@ public void lookupUsingHelperEmptyAuth() throws URISyntaxException, IOException } @Test - public void lookupNonEmptyAuthWithHelper() throws URISyntaxException, IOException { + void lookupNonEmptyAuthWithHelper() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-existing-auth-with-helper.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -180,7 +179,7 @@ public void lookupNonEmptyAuthWithHelper() throws URISyntaxException, IOExceptio } @Test - public void lookupAuthConfigUsingHelperNoServerUrl() throws URISyntaxException, IOException { + void lookupAuthConfigUsingHelperNoServerUrl() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-helper-no-server-url.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -200,7 +199,7 @@ public void lookupAuthConfigUsingHelperNoServerUrl() throws URISyntaxException, } @Test - public void lookupAuthConfigUsingHelperNoServerUrlWithToken() throws URISyntaxException, IOException { + void lookupAuthConfigUsingHelperNoServerUrlWithToken() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator( "config-with-helper-no-server-url-using-token.json" ); @@ -219,7 +218,7 @@ public void lookupAuthConfigUsingHelperNoServerUrlWithToken() throws URISyntaxEx } @Test - public void lookupAuthConfigWithCredentialsNotFound() throws URISyntaxException, IOException { + void lookupAuthConfigWithCredentialsNotFound() throws URISyntaxException, IOException { Map notFoundMessagesReference = new HashMap<>(); final RegistryAuthLocator authLocator = createTestAuthLocator( "config-with-store.json", @@ -245,7 +244,7 @@ public void lookupAuthConfigWithCredentialsNotFound() throws URISyntaxException, } @Test - public void lookupAuthConfigWithCredStoreEmpty() throws URISyntaxException, IOException { + void lookupAuthConfigWithCredStoreEmpty() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-with-store-empty.json"); DockerImageName dockerImageName = DockerImageName.parse("registry2.example.com/org/repo"); @@ -255,7 +254,7 @@ public void lookupAuthConfigWithCredStoreEmpty() throws URISyntaxException, IOEx } @Test - public void lookupAuthConfigFromEnvVarWithCredStoreEmpty() throws URISyntaxException, IOException { + void lookupAuthConfigFromEnvVarWithCredStoreEmpty() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator(null, "config-with-store-empty.json"); DockerImageName dockerImageName = DockerImageName.parse("registry2.example.com/org/repo"); @@ -265,7 +264,7 @@ public void lookupAuthConfigFromEnvVarWithCredStoreEmpty() throws URISyntaxExcep } @Test - public void lookupAuthConfigWithoutConfigFile() throws URISyntaxException, IOException { + void lookupAuthConfigWithoutConfigFile() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator(null); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -281,7 +280,7 @@ public void lookupAuthConfigWithoutConfigFile() throws URISyntaxException, IOExc } @Test - public void lookupAuthConfigRespectsCheckOrderPreference() throws URISyntaxException, IOException { + void lookupAuthConfigRespectsCheckOrderPreference() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator("config-empty.json", "config-basic-auth.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( @@ -297,7 +296,7 @@ public void lookupAuthConfigRespectsCheckOrderPreference() throws URISyntaxExcep } @Test - public void lookupAuthConfigFromEnvironmentVariable() throws URISyntaxException, IOException { + void lookupAuthConfigFromEnvironmentVariable() throws URISyntaxException, IOException { final RegistryAuthLocator authLocator = createTestAuthLocator(null, "config-basic-auth.json"); final AuthConfig authConfig = authLocator.lookupAuthConfig( diff --git a/core/src/test/java/org/testcontainers/utility/ResourceReaperTest.java b/core/src/test/java/org/testcontainers/utility/ResourceReaperTest.java index 77c5d528ba4..7b0c463d056 100644 --- a/core/src/test/java/org/testcontainers/utility/ResourceReaperTest.java +++ b/core/src/test/java/org/testcontainers/utility/ResourceReaperTest.java @@ -5,7 +5,7 @@ import lombok.SneakyThrows; import org.awaitility.Awaitility; import org.awaitility.core.ConditionFactory; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.GenericContainer; import org.zeroturnaround.exec.ProcessExecutor; @@ -21,17 +21,17 @@ import static org.assertj.core.api.Assertions.assertThat; -public class ResourceReaperTest { +class ResourceReaperTest { @Test - public void shouldCleanupWithRyuk() { + void shouldCleanupWithRyuk() { Map labels = runProcess(processExecutor -> {}); assertCleanup(labels); } @Test - public void shouldCleanupWithJVM() { + void shouldCleanupWithJVM() { Map labels = runProcess(processExecutor -> { processExecutor.environment("TESTCONTAINERS_RYUK_DISABLED", "true"); }); diff --git a/core/src/test/java/org/testcontainers/utility/TestEnvironmentTest.java b/core/src/test/java/org/testcontainers/utility/TestEnvironmentTest.java index 4bd9e1b8edb..874f623cc08 100644 --- a/core/src/test/java/org/testcontainers/utility/TestEnvironmentTest.java +++ b/core/src/test/java/org/testcontainers/utility/TestEnvironmentTest.java @@ -1,37 +1,37 @@ package org.testcontainers.utility; -import org.junit.Test; +import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; /** * Created by rnorth on 03/07/2016. */ -public class TestEnvironmentTest { +class TestEnvironmentTest { @Test - public void testCompareVersionGreaterThanSameMajor() { + void testCompareVersionGreaterThanSameMajor() { assertThat(new ComparableVersion("1.22").compareTo(new ComparableVersion("1.20")) > 0) .as("1.22 > 1.20") .isTrue(); } @Test - public void testCompareVersionEqual() { + void testCompareVersionEqual() { assertThat(new ComparableVersion("1.20")) .as("1.20 == 1.20") .isEqualByComparingTo(new ComparableVersion("1.20")); } @Test - public void testCompareVersionGreaterThan() { + void testCompareVersionGreaterThan() { assertThat(new ComparableVersion("2.10").compareTo(new ComparableVersion("1.20")) > 0) .as("2.10 > 1.20") .isTrue(); } @Test - public void testCompareVersionIgnoresExcessLength() { + void testCompareVersionIgnoresExcessLength() { assertThat(new ComparableVersion("1.20")) .as("1.20 == 1.20.3") .isEqualByComparingTo(new ComparableVersion("1.20.3")); diff --git a/core/src/test/java/org/testcontainers/utility/TestcontainersConfigurationTest.java b/core/src/test/java/org/testcontainers/utility/TestcontainersConfigurationTest.java index fcc0a654ef5..4e0520af5ba 100644 --- a/core/src/test/java/org/testcontainers/utility/TestcontainersConfigurationTest.java +++ b/core/src/test/java/org/testcontainers/utility/TestcontainersConfigurationTest.java @@ -1,7 +1,7 @@ package org.testcontainers.utility; -import org.junit.Before; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import java.util.HashMap; import java.util.Map; @@ -10,7 +10,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class TestcontainersConfigurationTest { +class TestcontainersConfigurationTest { private Properties userProperties; @@ -18,7 +18,7 @@ public class TestcontainersConfigurationTest { private Map environment; - @Before + @BeforeEach public void setUp() { userProperties = new Properties(); classpathProperties = new Properties(); @@ -26,7 +26,7 @@ public void setUp() { } @Test - public void shouldSubstituteImageNamesFromClasspathProperties() { + void shouldSubstituteImageNamesFromClasspathProperties() { classpathProperties.setProperty("ryuk.container.image", "foo:version"); assertThat(newConfig().getConfiguredSubstituteImage(DockerImageName.parse("testcontainers/ryuk:any"))) .as("an image name can be pulled from classpath properties") @@ -34,7 +34,7 @@ public void shouldSubstituteImageNamesFromClasspathProperties() { } @Test - public void shouldSubstituteImageNamesFromUserProperties() { + void shouldSubstituteImageNamesFromUserProperties() { userProperties.setProperty("ryuk.container.image", "foo:version"); assertThat(newConfig().getConfiguredSubstituteImage(DockerImageName.parse("testcontainers/ryuk:any"))) .as("an image name can be pulled from user properties") @@ -42,7 +42,7 @@ public void shouldSubstituteImageNamesFromUserProperties() { } @Test - public void shouldSubstituteImageNamesFromEnvironmentVariables() { + void shouldSubstituteImageNamesFromEnvironmentVariables() { environment.put("TESTCONTAINERS_RYUK_CONTAINER_IMAGE", "foo:version"); assertThat(newConfig().getConfiguredSubstituteImage(DockerImageName.parse("testcontainers/ryuk:any"))) .as("an image name can be pulled from an environment variable") @@ -50,7 +50,7 @@ public void shouldSubstituteImageNamesFromEnvironmentVariables() { } @Test - public void shouldApplySettingsInOrder() { + void shouldApplySettingsInOrder() { assertThat(newConfig().getEnvVarOrProperty("key", "default")) .as("precedence order for multiple sources of the same value is correct") .isEqualTo("default"); @@ -75,7 +75,7 @@ public void shouldApplySettingsInOrder() { } @Test - public void shouldNotReadChecksFromClasspathProperties() { + void shouldNotReadChecksFromClasspathProperties() { assertThat(newConfig().isDisableChecks()).as("checks enabled by default").isFalse(); classpathProperties.setProperty("checks.disable", "true"); @@ -83,7 +83,7 @@ public void shouldNotReadChecksFromClasspathProperties() { } @Test - public void shouldReadChecksFromUserProperties() { + void shouldReadChecksFromUserProperties() { assertThat(newConfig().isDisableChecks()).as("checks enabled by default").isFalse(); userProperties.setProperty("checks.disable", "true"); @@ -91,7 +91,7 @@ public void shouldReadChecksFromUserProperties() { } @Test - public void shouldReadChecksFromEnvironment() { + void shouldReadChecksFromEnvironment() { assertThat(newConfig().isDisableChecks()).as("checks enabled by default").isFalse(); userProperties.remove("checks.disable"); @@ -100,7 +100,7 @@ public void shouldReadChecksFromEnvironment() { } @Test - public void shouldReadDockerSettingsFromEnvironmentWithoutTestcontainersPrefix() { + void shouldReadDockerSettingsFromEnvironmentWithoutTestcontainersPrefix() { userProperties.remove("docker.foo"); environment.put("DOCKER_FOO", "some value"); assertThat(newConfig().getEnvVarOrUserProperty("docker.foo", "default")) @@ -109,7 +109,7 @@ public void shouldReadDockerSettingsFromEnvironmentWithoutTestcontainersPrefix() } @Test - public void shouldNotReadDockerSettingsFromEnvironmentWithTestcontainersPrefix() { + void shouldNotReadDockerSettingsFromEnvironmentWithTestcontainersPrefix() { userProperties.remove("docker.foo"); environment.put("TESTCONTAINERS_DOCKER_FOO", "some value"); assertThat(newConfig().getEnvVarOrUserProperty("docker.foo", "default")) @@ -118,7 +118,7 @@ public void shouldNotReadDockerSettingsFromEnvironmentWithTestcontainersPrefix() } @Test - public void shouldReadDockerSettingsFromUserProperties() { + void shouldReadDockerSettingsFromUserProperties() { environment.remove("DOCKER_FOO"); userProperties.put("docker.foo", "some value"); assertThat(newConfig().getEnvVarOrUserProperty("docker.foo", "default")) @@ -127,7 +127,7 @@ public void shouldReadDockerSettingsFromUserProperties() { } @Test - public void shouldNotReadSettingIfCorrespondingEnvironmentVarIsEmptyString() { + void shouldNotReadSettingIfCorrespondingEnvironmentVarIsEmptyString() { environment.put("DOCKER_FOO", ""); assertThat(newConfig().getEnvVarOrUserProperty("docker.foo", "default")) .as("reads unprefixed env vars for docker. settings") @@ -135,7 +135,7 @@ public void shouldNotReadSettingIfCorrespondingEnvironmentVarIsEmptyString() { } @Test - public void shouldNotReadDockerClientStrategyFromClasspathProperties() { + void shouldNotReadDockerClientStrategyFromClasspathProperties() { String currentValue = newConfig().getDockerClientStrategyClassName(); classpathProperties.setProperty("docker.client.strategy", UUID.randomUUID().toString()); @@ -145,7 +145,7 @@ public void shouldNotReadDockerClientStrategyFromClasspathProperties() { } @Test - public void shouldReadDockerClientStrategyFromUserProperties() { + void shouldReadDockerClientStrategyFromUserProperties() { userProperties.setProperty("docker.client.strategy", "foo"); assertThat(newConfig().getDockerClientStrategyClassName()) .as("Docker client strategy is changed by user property") @@ -153,7 +153,7 @@ public void shouldReadDockerClientStrategyFromUserProperties() { } @Test - public void shouldReadDockerClientStrategyFromEnvironment() { + void shouldReadDockerClientStrategyFromEnvironment() { userProperties.remove("docker.client.strategy"); environment.put("TESTCONTAINERS_DOCKER_CLIENT_STRATEGY", "foo"); assertThat(newConfig().getDockerClientStrategyClassName()) @@ -162,7 +162,7 @@ public void shouldReadDockerClientStrategyFromEnvironment() { } @Test - public void shouldNotUseImplicitDockerClientStrategyWhenDockerHostAndStrategyAreBothSet() { + void shouldNotUseImplicitDockerClientStrategyWhenDockerHostAndStrategyAreBothSet() { userProperties.put("docker.client.strategy", "foo"); userProperties.put("docker.host", "tcp://1.2.3.4:5678"); assertThat(newConfig().getDockerClientStrategyClassName()) @@ -191,7 +191,7 @@ public void shouldNotUseImplicitDockerClientStrategyWhenDockerHostAndStrategyAre } @Test - public void shouldNotReadReuseFromClasspathProperties() { + void shouldNotReadReuseFromClasspathProperties() { assertThat(newConfig().environmentSupportsReuse()).as("no reuse by default").isFalse(); classpathProperties.setProperty("testcontainers.reuse.enable", "true"); @@ -201,7 +201,7 @@ public void shouldNotReadReuseFromClasspathProperties() { } @Test - public void shouldReadReuseFromUserProperties() { + void shouldReadReuseFromUserProperties() { assertThat(newConfig().environmentSupportsReuse()).as("no reuse by default").isFalse(); userProperties.setProperty("testcontainers.reuse.enable", "true"); @@ -209,7 +209,7 @@ public void shouldReadReuseFromUserProperties() { } @Test - public void shouldReadReuseFromEnvironment() { + void shouldReadReuseFromEnvironment() { assertThat(newConfig().environmentSupportsReuse()).as("no reuse by default").isFalse(); userProperties.remove("testcontainers.reuse.enable"); @@ -218,7 +218,7 @@ public void shouldReadReuseFromEnvironment() { } @Test - public void shouldTrimImageNames() { + void shouldTrimImageNames() { userProperties.setProperty("ryuk.container.image", " testcontainers/ryuk:0.3.2 "); assertThat(newConfig().getRyukImage()) .as("trailing whitespace was not removed from image name property") From 2d15014fc6f5357071e58d91a93901ef6f59059c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 24 Sep 2025 16:47:01 -0600 Subject: [PATCH 0834/1224] Move Selenium tests to JUnit Jupiter (#10804) --- modules/selenium/build.gradle | 7 +++ .../junit/BaseWebDriverContainerTest.java | 10 ++-- .../junit/BrowserWebDriverContainerTest.java | 16 +++--- ...ChromeRecordingWebDriverContainerTest.java | 54 +++++++++---------- .../junit/ChromeWebDriverContainerTest.java | 16 +++--- .../ContainerWithoutCapabilitiesTest.java | 18 ++++--- ...stomWaitTimeoutWebDriverContainerTest.java | 12 ++--- .../junit/EdgeWebDriverContainerTest.java | 13 +++-- .../junit/FirefoxWebDriverContainerTest.java | 16 +++--- .../LocalServerWebDriverContainerTest.java | 13 +++-- .../junit/SeleniumStartTest.java | 15 +++--- .../junit/SeleniumUtilsTest.java | 8 +-- ...ecificImageNameWebDriverContainerTest.java | 9 ++-- 13 files changed, 102 insertions(+), 105 deletions(-) diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index d324b0d7d39..b4eff2f2656 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -6,6 +6,9 @@ dependencies { provided 'org.seleniumhq.selenium:selenium-remote-driver:4.10.0' provided 'org.seleniumhq.selenium:selenium-chrome-driver:4.10.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform('org.seleniumhq.selenium:selenium-bom:4.13.0') testImplementation 'org.seleniumhq.selenium:selenium-firefox-driver' testImplementation 'org.seleniumhq.selenium:selenium-edge-driver' @@ -17,3 +20,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' } + +test { + useJUnitPlatform() +} diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java index 97124802de1..bb35b664301 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java @@ -1,6 +1,5 @@ package org.testcontainers.junit; -import org.junit.ClassRule; import org.openqa.selenium.By; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebElement; @@ -15,15 +14,10 @@ import static org.assertj.core.api.Assertions.assertThat; -/** - * - */ public class BaseWebDriverContainerTest { - @ClassRule public static Network NETWORK = Network.newNetwork(); - @ClassRule public static GenericContainer HELLO_WORLD = new GenericContainer<>( DockerImageName.parse("testcontainers/helloworld:1.1.0") ) @@ -32,6 +26,10 @@ public class BaseWebDriverContainerTest { .withExposedPorts(8080, 8081) .waitingFor(new HttpWaitStrategy()); + static { + HELLO_WORLD.start(); + } + protected static void doSimpleExplore(BrowserWebDriverContainer rule, Capabilities capabilities) { RemoteWebDriver driver = new RemoteWebDriver(rule.getSeleniumAddress(), capabilities); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30)); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java index 370d9cffedb..d41b59fe7ed 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java @@ -3,8 +3,7 @@ import com.github.dockerjava.api.command.InspectContainerResponse; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.SystemUtils; -import org.junit.Assume; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.firefox.FirefoxOptions; import org.testcontainers.containers.BrowserWebDriverContainer; @@ -14,15 +13,16 @@ import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assumptions.assumeThat; -public class BrowserWebDriverContainerTest { +class BrowserWebDriverContainerTest { private static final String NO_PROXY_KEY = "no_proxy"; private static final String NO_PROXY_VALUE = "localhost,.noproxy-domain.com"; @Test - public void honorPresetNoProxyEnvironment() { + void honorPresetNoProxyEnvironment() { try ( BrowserWebDriverContainer chromeWithNoProxySet = (BrowserWebDriverContainer) new BrowserWebDriverContainer() .withCapabilities(new ChromeOptions()) @@ -36,7 +36,7 @@ public void honorPresetNoProxyEnvironment() { } @Test - public void provideDefaultNoProxyEnvironmentIfNotSet() { + void provideDefaultNoProxyEnvironmentIfNotSet() { try ( BrowserWebDriverContainer chromeWithoutNoProxySet = new BrowserWebDriverContainer() .withCapabilities(new ChromeOptions()) @@ -49,8 +49,8 @@ public void provideDefaultNoProxyEnvironmentIfNotSet() { } @Test - public void createContainerWithShmVolume() { - Assume.assumeFalse("SHM isn't mounted on Windows", SystemUtils.IS_OS_WINDOWS); + void createContainerWithShmVolume() { + assumeThat(SystemUtils.IS_OS_WINDOWS).isTrue(); try ( BrowserWebDriverContainer webDriverContainer = new BrowserWebDriverContainer() .withCapabilities(new FirefoxOptions()) @@ -66,7 +66,7 @@ public void createContainerWithShmVolume() { } @Test - public void createContainerWithoutShmVolume() { + void createContainerWithoutShmVolume() { try ( BrowserWebDriverContainer webDriverContainer = new BrowserWebDriverContainer<>() .withSharedMemorySize(512 * FileUtils.ONE_MB) diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java index 8723d951d3e..2c6fa241469 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java @@ -1,11 +1,9 @@ package org.testcontainers.junit; import com.google.common.io.PatternFilenameFilter; -import org.junit.Rule; -import org.junit.Test; -import org.junit.experimental.runners.Enclosed; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.openqa.selenium.chrome.ChromeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.containers.BrowserWebDriverContainer.VncRecordingMode; @@ -20,6 +18,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Path; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.Optional; @@ -27,8 +26,7 @@ import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Enclosed.class) -public class ChromeRecordingWebDriverContainerTest extends BaseWebDriverContainerTest { +class ChromeRecordingWebDriverContainerTest extends BaseWebDriverContainerTest { /** * Guaranty a minimum video length for FFmpeg re-encoding. @@ -36,14 +34,15 @@ public class ChromeRecordingWebDriverContainerTest extends BaseWebDriverContaine */ private static final int MINIMUM_VIDEO_DURATION_MILLISECONDS = 200; - public static class ChromeThatRecordsAllTests { + @Nested + class ChromeThatRecordsAllTests { - @Rule - public TemporaryFolder vncRecordingDirectory = new TemporaryFolder(); + @TempDir + public Path vncRecordingDirectory; @Test - public void recordingTestThatShouldBeRecordedAndRetainedInFlvFormatAsDefault() throws InterruptedException { - File target = vncRecordingDirectory.getRoot(); + void recordingTestThatShouldBeRecordedAndRetainedInFlvFormatAsDefault() throws InterruptedException { + File target = vncRecordingDirectory.toFile(); try ( // recordAll { // To do this, simply add extra parameters to the rule constructor, so video will default to FLV format: @@ -80,12 +79,12 @@ public String getFilesystemFriendlyName() { Optional.empty() ); - return vncRecordingDirectory.getRoot().listFiles(new PatternFilenameFilter(fileNamePattern)); + return vncRecordingDirectory.toFile().listFiles(new PatternFilenameFilter(fileNamePattern)); } @Test - public void recordingTestShouldHaveFlvExtension() throws InterruptedException { - File target = vncRecordingDirectory.getRoot(); + void recordingTestShouldHaveFlvExtension() throws InterruptedException { + File target = vncRecordingDirectory.toFile(); try ( // recordFlv { // Set (explicitly) FLV format for recorded video: @@ -102,8 +101,8 @@ public void recordingTestShouldHaveFlvExtension() throws InterruptedException { } @Test - public void recordingTestShouldHaveMp4Extension() throws InterruptedException { - File target = vncRecordingDirectory.getRoot(); + void recordingTestShouldHaveMp4Extension() throws InterruptedException { + File target = vncRecordingDirectory.toFile(); try ( // recordMp4 { // Set MP4 format for recorded video: @@ -120,12 +119,12 @@ public void recordingTestShouldHaveMp4Extension() throws InterruptedException { } @Test - public void recordingTestThatShouldHaveCorrectDuration() throws IOException, InterruptedException { + void recordingTestThatShouldHaveCorrectDuration() throws IOException, InterruptedException { MountableFile mountableFile; try ( BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() .withCapabilities(new ChromeOptions()) - .withRecordingMode(VncRecordingMode.RECORD_ALL, vncRecordingDirectory.getRoot()) + .withRecordingMode(VncRecordingMode.RECORD_ALL, vncRecordingDirectory.toFile()) .withRecordingFileFactory(new DefaultRecordingFileFactory()) .withNetwork(NETWORK) ) { @@ -159,13 +158,14 @@ public void recordingTestThatShouldHaveCorrectDuration() throws IOException, Int } } - public static class ChromeThatRecordsFailingTests { + @Nested + class ChromeThatRecordsFailingTests { - @Rule - public TemporaryFolder vncRecordingDirectory = new TemporaryFolder(); + @TempDir + public Path vncRecordingDirectory; @Test - public void recordingTestThatShouldBeRecordedButNotPersisted() { + void recordingTestThatShouldBeRecordedButNotPersisted() { try ( // withRecordingFileFactory { BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() @@ -183,8 +183,8 @@ public void recordingTestThatShouldBeRecordedButNotPersisted() { } @Test - public void recordingTestThatShouldBeRecordedAndRetained() throws InterruptedException { - File target = vncRecordingDirectory.getRoot(); + void recordingTestThatShouldBeRecordedAndRetained() throws InterruptedException { + File target = vncRecordingDirectory.toFile(); try ( // recordFailing { // or if you only want videos for test failures: @@ -214,11 +214,11 @@ public String getFilesystemFriendlyName() { Optional.of(new RuntimeException("Force writing of video file.")) ); - String[] files = vncRecordingDirectory.getRoot().list(new PatternFilenameFilter("FAILED-.*\\.flv")); + String[] files = vncRecordingDirectory.toFile().list(new PatternFilenameFilter("FAILED-.*\\.flv")); assertThat(files).as("recorded file count").hasSize(1); } } - private static class CustomRecordingFileFactory extends DefaultRecordingFileFactory {} + class CustomRecordingFileFactory extends DefaultRecordingFileFactory {} } } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java index 2f0bfc27b0d..33809568aa6 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java @@ -1,30 +1,26 @@ package org.testcontainers.junit; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; -/** - * - */ -public class ChromeWebDriverContainerTest extends BaseWebDriverContainerTest { +class ChromeWebDriverContainerTest extends BaseWebDriverContainerTest { // junitRule { - @Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() .withCapabilities(new ChromeOptions()) // } .withNetwork(NETWORK); - @Before + @BeforeEach public void checkBrowserIsIndeedChrome() { + chrome.start(); assertBrowserNameIs(chrome, "chrome", new ChromeOptions()); } @Test - public void simpleExploreTest() { + void simpleExploreTest() { doSimpleExplore(chrome, new ChromeOptions()); } } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java index f5c03fb32d1..2ffc407a9e4 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java @@ -1,22 +1,28 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; -public class ContainerWithoutCapabilitiesTest extends BaseWebDriverContainerTest { +class ContainerWithoutCapabilitiesTest extends BaseWebDriverContainerTest { - @Rule + @AutoClose public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>().withNetwork(NETWORK); + @BeforeEach + public void setUp() { + chrome.start(); + } + @Test - public void chromeIsStartedIfNoCapabilitiesProvided() { + void chromeIsStartedIfNoCapabilitiesProvided() { assertBrowserNameIs(chrome, "chrome", new ChromeOptions()); } @Test - public void simpleExploreTestWhenNoCapabilitiesProvided() { + void simpleExploreTestWhenNoCapabilitiesProvided() { doSimpleExplore(chrome, new ChromeOptions()); } } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java index 43639010e59..757be9a3a3d 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java @@ -1,26 +1,22 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; import java.time.Duration; import java.time.temporal.ChronoUnit; -/** - * - */ -public class CustomWaitTimeoutWebDriverContainerTest extends BaseWebDriverContainerTest { +class CustomWaitTimeoutWebDriverContainerTest extends BaseWebDriverContainerTest { - @Rule public BrowserWebDriverContainer chromeWithCustomTimeout = new BrowserWebDriverContainer<>() .withCapabilities(new ChromeOptions()) .withStartupTimeout(Duration.of(30, ChronoUnit.SECONDS)) .withNetwork(NETWORK); @Test - public void simpleExploreTest() { + void simpleExploreTest() { + chromeWithCustomTimeout.start(); doSimpleExplore(chromeWithCustomTimeout, new ChromeOptions()); } } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java index f1935fa84ee..40904cff369 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java @@ -1,27 +1,26 @@ package org.testcontainers.junit; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.openqa.selenium.edge.EdgeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; -public class EdgeWebDriverContainerTest extends BaseWebDriverContainerTest { +class EdgeWebDriverContainerTest extends BaseWebDriverContainerTest { // junitRule { - @Rule public BrowserWebDriverContainer edge = new BrowserWebDriverContainer<>() .withCapabilities(new EdgeOptions()) // } .withNetwork(NETWORK); - @Before + @BeforeEach public void checkBrowserIsIndeedMSEdge() { + edge.start(); assertBrowserNameIs(edge, "msedge", new EdgeOptions()); } @Test - public void simpleExploreTest() { + void simpleExploreTest() { doSimpleExplore(edge, new EdgeOptions()); } } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java index 211800b8fad..e5003f6ae12 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java @@ -1,30 +1,26 @@ package org.testcontainers.junit; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.openqa.selenium.firefox.FirefoxOptions; import org.testcontainers.containers.BrowserWebDriverContainer; -/** - * - */ -public class FirefoxWebDriverContainerTest extends BaseWebDriverContainerTest { +class FirefoxWebDriverContainerTest extends BaseWebDriverContainerTest { // junitRule { - @Rule public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer<>() .withCapabilities(new FirefoxOptions()) // } .withNetwork(NETWORK); - @Before + @BeforeEach public void checkBrowserIsIndeedFirefox() { + firefox.start(); assertBrowserNameIs(firefox, "firefox", new FirefoxOptions()); } @Test - public void simpleExploreTest() { + void simpleExploreTest() { doSimpleExplore(firefox, new FirefoxOptions()); } } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java index 8d29cb57310..0c93fde97dc 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java @@ -1,8 +1,7 @@ package org.testcontainers.junit; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; import org.mortbay.jetty.Server; import org.mortbay.jetty.bio.SocketConnector; import org.mortbay.jetty.handler.ResourceHandler; @@ -18,17 +17,17 @@ * Test that a browser running in a container can access a web server hosted on the host machine (i.e. the one running * the tests) */ -public class LocalServerWebDriverContainerTest { +class LocalServerWebDriverContainerTest { - @Rule public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() .withAccessToHost(true) .withCapabilities(new ChromeOptions()); private int localPort; - @Before + @BeforeEach public void setupLocalServer() throws Exception { + chrome.start(); // Set up a local Jetty HTTP server Server server = new Server(); server.addConnector(new SocketConnector()); @@ -42,7 +41,7 @@ public void setupLocalServer() throws Exception { } @Test - public void testConnection() { + void testConnection() { // getWebDriver { RemoteWebDriver driver = new RemoteWebDriver(chrome.getSeleniumAddress(), new ChromeOptions()); // } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumStartTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumStartTest.java index b399cabf9ed..a1923b0264e 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumStartTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumStartTest.java @@ -1,8 +1,9 @@ package org.testcontainers.junit; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.Parameter; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import org.openqa.selenium.chrome.ChromeOptions; import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.utility.DockerImageName; @@ -10,19 +11,19 @@ /** * Simple test to check that readiness detection works correctly across major versions of the containers. */ -@RunWith(Parameterized.class) +@ParameterizedClass(name = "tag: {0}") +@MethodSource("data") public class SeleniumStartTest { - @Parameterized.Parameters(name = "tag: {0}") public static String[] data() { return new String[] { "4.0.0", "3.4.0", "2.53.0" }; } - @Parameterized.Parameter + @Parameter public String tag; @Test - public void testAdditionalStartupString() { + void testAdditionalStartupString() { final DockerImageName imageName = DockerImageName.parse("selenium/standalone-chrome").withTag(tag); try ( BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>(imageName) diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumUtilsTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumUtilsTest.java index 6208cb3a5bb..b9c2125f93b 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumUtilsTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/SeleniumUtilsTest.java @@ -1,6 +1,6 @@ package org.testcontainers.junit; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.testcontainers.containers.SeleniumUtils; import java.io.IOException; @@ -11,15 +11,15 @@ /** * Created by Julien LAMY */ -public class SeleniumUtilsTest { +class SeleniumUtilsTest { @Test - public void detectSeleniumVersionUnder3() throws IOException { + void detectSeleniumVersionUnder3() throws IOException { checkSeleniumVersionDetected("manifests/MANIFEST-2.45.0.MF", "2.45.0"); } @Test - public void detectSeleniumVersionUpper3() throws IOException { + void detectSeleniumVersionUpper3() throws IOException { checkSeleniumVersionDetected("manifests/MANIFEST-3.5.2.MF", "3.5.2"); } diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java index 9f0d9035f44..f8e6c739b82 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java @@ -1,22 +1,21 @@ package org.testcontainers.junit; -import org.junit.Rule; -import org.junit.Test; +import org.junit.jupiter.api.Test; import org.openqa.selenium.firefox.FirefoxOptions; import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.utility.DockerImageName; -public class SpecificImageNameWebDriverContainerTest extends BaseWebDriverContainerTest { +class SpecificImageNameWebDriverContainerTest extends BaseWebDriverContainerTest { private static final DockerImageName FIREFOX_IMAGE = DockerImageName.parse("selenium/standalone-firefox:4.10.0"); - @Rule public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer<>(FIREFOX_IMAGE) .withCapabilities(new FirefoxOptions()) .withNetwork(NETWORK); @Test - public void simpleExploreTest() { + void simpleExploreTest() { + firefox.start(); doSimpleExplore(firefox, new FirefoxOptions()); } } From 6472f4bf4996b3c7d1f7b41a6038e95117bc1b34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 25 Sep 2025 19:10:34 -0600 Subject: [PATCH 0835/1224] Fix missing junit4 leftovers (#10808) --- .../jdbc/AbstractJDBCDriverTest.java | 4 ++-- ...tLifecycleAwareExceptionCapturingTest.java | 6 ++--- .../junit/mariadb/SimpleMariaDBTest.java | 3 +-- .../containers/RecordingFileFactory.java | 10 -------- .../DefaultRecordingFileFactoryTest.java | 23 ++++++++----------- 5 files changed, 16 insertions(+), 30 deletions(-) diff --git a/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java b/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java index ff844b8988b..95f9d5d1ad4 100644 --- a/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java +++ b/modules/jdbc-test/src/main/java/org/testcontainers/jdbc/AbstractJDBCDriverTest.java @@ -17,7 +17,7 @@ import java.util.EnumSet; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assume.assumeFalse; +import static org.assertj.core.api.Assumptions.assumeThat; @ParameterizedClass @MethodSource("data") @@ -207,7 +207,7 @@ private HikariDataSource verifyCharacterSet(String jdbcUrl) throws SQLException } private void performTestForCustomIniFile(HikariDataSource dataSource) throws SQLException { - assumeFalse(SystemUtils.IS_OS_WINDOWS); + assumeThat(SystemUtils.IS_OS_WINDOWS).isFalse(); Statement statement = dataSource.getConnection().createStatement(); statement.execute("SELECT @@GLOBAL.innodb_max_undo_log_size"); ResultSet resultSet = statement.getResultSet(); diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java index b64f2f3c328..0e7a750ce22 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java @@ -7,7 +7,7 @@ import org.junit.jupiter.api.TestMethodOrder; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assume.assumeTrue; +import static org.assertj.core.api.Assumptions.assumeThat; // The order of @ExtendsWith and @Testcontainers is crucial in order for the tests @Testcontainers @@ -24,7 +24,7 @@ class TestLifecycleAwareExceptionCapturingTest { void failing_test_should_pass_throwable_to_testContainer() { startedTestContainer = testContainer; // Force an exception that is captured by the test container without failing the test itself - assumeTrue(false); + assumeThat(false).isTrue(); } @Test @@ -32,6 +32,6 @@ void failing_test_should_pass_throwable_to_testContainer() { void should_have_captured_thrownException() { Throwable capturedThrowable = startedTestContainer.getCapturedThrowable(); assertThat(capturedThrowable).isInstanceOf(AssumptionViolatedException.class); - assertThat(capturedThrowable.getMessage()).isEqualTo("got: , expected: is "); + assertThat(capturedThrowable.getMessage()).contains("Expecting value to be true but was false"); } } 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 9b7fab4daaf..4e88c8981eb 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 @@ -19,7 +19,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; -import static org.junit.Assume.assumeFalse; class SimpleMariaDBTest extends AbstractContainerDatabaseTest { @@ -58,7 +57,7 @@ void testSpecificVersion() throws SQLException { @Test void testMariaDBWithCustomIniFile() throws SQLException { - assumeFalse(SystemUtils.IS_OS_WINDOWS); + assumeThat(SystemUtils.IS_OS_WINDOWS).isFalse(); try ( MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>( diff --git a/modules/selenium/src/main/java/org/testcontainers/containers/RecordingFileFactory.java b/modules/selenium/src/main/java/org/testcontainers/containers/RecordingFileFactory.java index 31946dac59e..9f3795f7cb8 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/RecordingFileFactory.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/RecordingFileFactory.java @@ -1,20 +1,10 @@ package org.testcontainers.containers; -import org.junit.runner.Description; import org.testcontainers.containers.VncRecordingContainer.VncRecordingFormat; import java.io.File; public interface RecordingFileFactory { - @Deprecated - default File recordingFileForTest(File vncRecordingDirectory, Description description, boolean succeeded) { - return recordingFileForTest( - vncRecordingDirectory, - description.getTestClass().getSimpleName() + "-" + description.getMethodName(), - succeeded - ); - } - default File recordingFileForTest( File vncRecordingDirectory, String prefix, diff --git a/modules/selenium/src/test/java/org/testcontainers/containers/DefaultRecordingFileFactoryTest.java b/modules/selenium/src/test/java/org/testcontainers/containers/DefaultRecordingFileFactoryTest.java index aa894810930..03540e54b01 100644 --- a/modules/selenium/src/test/java/org/testcontainers/containers/DefaultRecordingFileFactoryTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/containers/DefaultRecordingFileFactoryTest.java @@ -1,10 +1,10 @@ package org.testcontainers.containers; import lombok.Value; -import org.junit.Test; -import org.junit.runner.Description; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInfo; +import org.junit.jupiter.params.ParameterizedClass; +import org.junit.jupiter.params.provider.MethodSource; import java.io.File; import java.nio.file.Files; @@ -17,9 +17,10 @@ import static org.assertj.core.api.Assertions.assertThat; -@RunWith(Parameterized.class) +@ParameterizedClass +@MethodSource("data") @Value -public class DefaultRecordingFileFactoryTest { +class DefaultRecordingFileFactoryTest { private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("YYYYMMdd-HHmmss"); @@ -31,7 +32,6 @@ public class DefaultRecordingFileFactoryTest { private final boolean success; - @Parameterized.Parameters public static Collection data() { Collection args = new ArrayList<>(); args.add(new Object[] { "testMethod1", "FAILED", Boolean.FALSE }); @@ -40,13 +40,10 @@ public static Collection data() { } @Test - public void recordingFileThatShouldDescribeTheTestResultAtThePresentTime() throws Exception { + public void recordingFileThatShouldDescribeTheTestResultAtThePresentTime(TestInfo testInfo) throws Exception { File vncRecordingDirectory = Files.createTempDirectory("recording").toFile(); - Description description = Description.createTestDescription( - getClass().getCanonicalName(), - methodName, - Test.class - ); + String className = testInfo.getTestClass().orElseThrow(IllegalStateException::new).getSimpleName(); + String description = className + "-" + methodName; File recordingFile = factory.recordingFileForTest(vncRecordingDirectory, description, success); From c7622b4aee381b8258dee0abb8be297da9e2e40f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 25 Sep 2025 20:04:43 -0600 Subject: [PATCH 0836/1224] Remove JUnit 4 support (#10805) Fixes #970 --- core/build.gradle | 23 +++++++- .../containers/ComposeContainer.java | 30 +--------- .../containers/DockerComposeContainer.java | 32 +---------- .../FailureDetectingExternalResource.java | 50 ----------------- .../containers/GenericContainer.java | 56 ------------------- .../testcontainers/containers/Network.java | 11 +--- .../containers/ExposedHostTest.java | 7 --- .../FailureDetectingExternalResourceTest.java | 28 ---------- .../junit/DockerComposeLogConsumerTest.java | 5 +- ...tLifecycleAwareExceptionCapturingTest.java | 4 +- settings.gradle | 2 - 11 files changed, 29 insertions(+), 219 deletions(-) delete mode 100644 core/src/main/java/org/testcontainers/containers/FailureDetectingExternalResource.java delete mode 100644 core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java diff --git a/core/build.gradle b/core/build.gradle index b4eeae7b0c5..1768cb703ff 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -49,13 +49,33 @@ tasks.japicmp { classExcludes = [ "org.testcontainers.utility.RyukResourceReaper", + "org.testcontainers.containers.FailureDetectingExternalResource", + "org.testcontainers.containers.ComposeContainer", + "org.testcontainers.containers.DockerComposeContainer", + "org.testcontainers.containers.GenericContainer" ] methodExcludes = [ "org.testcontainers.containers.Container#getDockerClient()", "org.testcontainers.containers.ContainerState#getDockerClient()", "org.testcontainers.containers.ContainerState#execInContainer(org.testcontainers.containers.ExecConfig)", - "org.testcontainers.containers.ContainerState#execInContainer(java.nio.charset.Charset,org.testcontainers.containers.ExecConfig)" + "org.testcontainers.containers.ContainerState#execInContainer(java.nio.charset.Charset,org.testcontainers.containers.ExecConfig)", + "org.testcontainers.containers.ComposeContainer#apply(org.junit.runners.model.Statement, org.junit.runner.Description)", + "org.testcontainers.containers.ComposeContainer#failed(java.lang.Throwable, org.junit.runner.Description)", + "org.testcontainers.containers.ComposeContainer#finished(org.junit.runner.Description)", + "org.testcontainers.containers.ComposeContainer#starting(org.junit.runner.Description)", + "org.testcontainers.containers.ComposeContainer#succeeded(org.junit.runner.Description)", + "org.testcontainers.containers.DockerComposeContainer#apply(org.junit.runners.model.Statement, org.junit.runner.Description)", + "org.testcontainers.containers.DockerComposeContainer#failed(java.lang.Throwable, org.junit.runner.Description)", + "org.testcontainers.containers.DockerComposeContainer#finished(org.junit.runner.Description)", + "org.testcontainers.containers.DockerComposeContainer#starting(org.junit.runner.Description)", + "org.testcontainers.containers.DockerComposeContainer#succeeded(org.junit.runner.Description)", + "org.testcontainers.containers.GenericContainer#apply(org.junit.runners.model.Statement, org.junit.runner.Description)", + "org.testcontainers.containers.GenericContainer#failed(java.lang.Throwable, org.junit.runner.Description)", + "org.testcontainers.containers.GenericContainer#finished(org.junit.runner.Description)", + "org.testcontainers.containers.GenericContainer#starting(org.junit.runner.Description)", + "org.testcontainers.containers.GenericContainer#succeeded(org.junit.runner.Description)", + 'org.testcontainers.containers.Network$NetworkImpl#after()' ] fieldExcludes = [] @@ -69,7 +89,6 @@ configurations.all { } dependencies { - api 'junit:junit:4.13.2' api 'org.slf4j:slf4j-api:1.7.36' compileOnly 'org.jetbrains:annotations:26.0.2-1' testCompileOnly 'org.jetbrains:annotations:26.0.2-1' diff --git a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java index 79d706d3b6a..e8061363a18 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java @@ -5,8 +5,6 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.SystemUtils; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; import org.testcontainers.containers.output.OutputFrame; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; @@ -31,7 +29,7 @@ * It uses either Compose V2 contained within the Docker binary, or a containerised version of Compose V2. */ @Slf4j -public class ComposeContainer extends FailureDetectingExternalResource implements Startable { +public class ComposeContainer implements Startable { private final Map scalingPreferences = new HashMap<>(); @@ -93,32 +91,6 @@ public ComposeContainer(String identifier, List composeFiles) { this.project = this.composeDelegate.getProject(); } - @Override - @Deprecated - public Statement apply(Statement base, Description description) { - return super.apply(base, description); - } - - @Override - @Deprecated - public void starting(Description description) { - start(); - } - - @Override - @Deprecated - protected void succeeded(Description description) {} - - @Override - @Deprecated - protected void failed(Throwable e, Description description) {} - - @Override - @Deprecated - public void finished(Description description) { - stop(); - } - @Override public void start() { synchronized (MUTEX) { diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index 92dc75b6cde..dd06b181b42 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -5,8 +5,6 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.SystemUtils; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; import org.testcontainers.containers.output.OutputFrame; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; @@ -30,9 +28,7 @@ * Container which launches Docker Compose, for the purposes of launching a defined set of containers. */ @Slf4j -public class DockerComposeContainer> - extends FailureDetectingExternalResource - implements Startable { +public class DockerComposeContainer> implements Startable { private final Map scalingPreferences = new HashMap<>(); @@ -99,32 +95,6 @@ public DockerComposeContainer(String identifier, List composeFiles) { this.project = this.composeDelegate.getProject(); } - @Override - @Deprecated - public Statement apply(Statement base, Description description) { - return super.apply(base, description); - } - - @Override - @Deprecated - public void starting(Description description) { - start(); - } - - @Override - @Deprecated - protected void succeeded(Description description) {} - - @Override - @Deprecated - protected void failed(Throwable e, Description description) {} - - @Override - @Deprecated - public void finished(Description description) { - stop(); - } - @Override public void start() { synchronized (MUTEX) { diff --git a/core/src/main/java/org/testcontainers/containers/FailureDetectingExternalResource.java b/core/src/main/java/org/testcontainers/containers/FailureDetectingExternalResource.java deleted file mode 100644 index 71344267d32..00000000000 --- a/core/src/main/java/org/testcontainers/containers/FailureDetectingExternalResource.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.MultipleFailureException; -import org.junit.runners.model.Statement; - -import java.util.ArrayList; -import java.util.List; - -/** - * {@link TestRule} which is called before and after each test, and also is notified on success/failure. - * - * This mimics the behaviour of TestWatcher to some degree, but failures occurring in this rule do not - * contribute to the overall failure count (which can otherwise cause strange negative test success - * figures). - */ -public class FailureDetectingExternalResource implements TestRule { - - @Override - public Statement apply(Statement base, Description description) { - return new Statement() { - @Override - public void evaluate() throws Throwable { - List errors = new ArrayList(); - - try { - starting(description); - base.evaluate(); - succeeded(description); - } catch (Throwable e) { - errors.add(e); - failed(e, description); - } finally { - finished(description); - } - - MultipleFailureException.assertEmpty(errors); - } - }; - } - - protected void starting(Description description) {} - - protected void succeeded(Description description) {} - - protected void failed(Throwable e, Description description) {} - - protected void finished(Description description) {} -} diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index acd70f69cab..0fe944433ae 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -32,8 +32,6 @@ import org.apache.commons.lang3.SystemUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; import org.rnorth.ducttape.unreliables.Unreliables; import org.slf4j.Logger; import org.testcontainers.DockerClientFactory; @@ -52,8 +50,6 @@ import org.testcontainers.images.builder.Transferable; import org.testcontainers.lifecycle.Startable; import org.testcontainers.lifecycle.Startables; -import org.testcontainers.lifecycle.TestDescription; -import org.testcontainers.lifecycle.TestLifecycleAware; import org.testcontainers.utility.Base58; import org.testcontainers.utility.CommandLine; import org.testcontainers.utility.DockerImageName; @@ -106,7 +102,6 @@ */ @Data public class GenericContainer> - extends FailureDetectingExternalResource implements Container, AutoCloseable, WaitStrategyTarget, Startable { public static final int CONTAINER_RUNNING_TIMEOUT_SEC = 30; @@ -1053,57 +1048,6 @@ public void addExposedPorts(int... ports) { this.containerDef.addExposedTcpPorts(ports); } - private TestDescription toDescription(Description description) { - return new TestDescription() { - @Override - public String getTestId() { - return description.getDisplayName(); - } - - @Override - public String getFilesystemFriendlyName() { - return description.getClassName() + "-" + description.getMethodName(); - } - }; - } - - @Override - @Deprecated - public Statement apply(Statement base, Description description) { - return super.apply(base, description); - } - - @Override - @Deprecated - protected void starting(Description description) { - if (this instanceof TestLifecycleAware) { - ((TestLifecycleAware) this).beforeTest(toDescription(description)); - } - this.start(); - } - - @Override - @Deprecated - protected void succeeded(Description description) { - if (this instanceof TestLifecycleAware) { - ((TestLifecycleAware) this).afterTest(toDescription(description), Optional.empty()); - } - } - - @Override - @Deprecated - protected void failed(Throwable e, Description description) { - if (this instanceof TestLifecycleAware) { - ((TestLifecycleAware) this).afterTest(toDescription(description), Optional.of(e)); - } - } - - @Override - @Deprecated - protected void finished(Description description) { - this.stop(); - } - /** * {@inheritDoc} */ diff --git a/core/src/main/java/org/testcontainers/containers/Network.java b/core/src/main/java/org/testcontainers/containers/Network.java index 88ddd6dd906..27cab80c652 100644 --- a/core/src/main/java/org/testcontainers/containers/Network.java +++ b/core/src/main/java/org/testcontainers/containers/Network.java @@ -4,8 +4,6 @@ import lombok.Builder; import lombok.Getter; import lombok.Singular; -import org.junit.rules.ExternalResource; -import org.junit.rules.TestRule; import org.testcontainers.DockerClientFactory; import org.testcontainers.utility.ResourceReaper; @@ -17,7 +15,7 @@ import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; -public interface Network extends AutoCloseable, TestRule { +public interface Network extends AutoCloseable { Network SHARED = new NetworkImpl(false, null, Collections.emptySet(), null) { @Override public void close() { @@ -40,7 +38,7 @@ static NetworkImpl.NetworkImplBuilder builder() { @Builder @Getter - class NetworkImpl extends ExternalResource implements Network { + class NetworkImpl implements Network { private final String name = UUID.randomUUID().toString(); @@ -100,11 +98,6 @@ private String create() { return createNetworkCmd.exec().getId(); } - @Override - protected void after() { - close(); - } - @Override public synchronized void close() { if (initialized.getAndSet(false)) { diff --git a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java index 39c986d1f8a..50bd17d0f0d 100644 --- a/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java +++ b/core/src/test/java/org/testcontainers/containers/ExposedHostTest.java @@ -7,8 +7,6 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; import org.testcontainers.DockerClientFactory; import org.testcontainers.TestImages; import org.testcontainers.Testcontainers; @@ -189,11 +187,6 @@ public String getId() { @Override public void close() {} - - @Override - public Statement apply(Statement base, Description description) { - return null; - } }; List networks = DockerClientFactory diff --git a/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java b/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java deleted file mode 100644 index b2abf02bce5..00000000000 --- a/core/src/test/java/org/testcontainers/containers/FailureDetectingExternalResourceTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.jupiter.api.Test; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - -class FailureDetectingExternalResourceTest { - - @Test - void finishedIsCalledForCleanupIfStartingThrows() { - FailureDetectingExternalResource res = spy(FailureDetectingExternalResource.class); - Statement stmt = res.apply(mock(Statement.class), Description.EMPTY); - doThrow(new RuntimeException()).when(res).starting(any()); - try { - stmt.evaluate(); - } catch (Throwable t) { - // ignore - } - verify(res).starting(any()); - verify(res).finished(any()); - } -} diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java index a712fb19664..7b9100d1e35 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java @@ -1,7 +1,6 @@ package org.testcontainers.junit; import org.junit.jupiter.api.Test; -import org.junit.runner.Description; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.output.OutputFrame.OutputType; import org.testcontainers.containers.output.WaitingConsumer; @@ -22,7 +21,7 @@ void testLogConsumer() throws TimeoutException { .withLogConsumer("redis_1", logConsumer); try { - environment.starting(Description.EMPTY); + environment.start(); logConsumer.waitUntil( frame -> { return ( @@ -34,7 +33,7 @@ void testLogConsumer() throws TimeoutException { TimeUnit.SECONDS ); } finally { - environment.finished(Description.EMPTY); + environment.stop(); } } } diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java index 0e7a750ce22..a6647aa3e52 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/TestLifecycleAwareExceptionCapturingTest.java @@ -1,10 +1,10 @@ package org.testcontainers.junit.jupiter; -import org.junit.AssumptionViolatedException; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; +import org.opentest4j.TestAbortedException; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; @@ -31,7 +31,7 @@ void failing_test_should_pass_throwable_to_testContainer() { @Order(2) void should_have_captured_thrownException() { Throwable capturedThrowable = startedTestContainer.getCapturedThrowable(); - assertThat(capturedThrowable).isInstanceOf(AssumptionViolatedException.class); + assertThat(capturedThrowable).isInstanceOf(TestAbortedException.class); assertThat(capturedThrowable.getMessage()).contains("Expecting value to be true but was false"); } } diff --git a/settings.gradle b/settings.gradle index 0d13ebcc3fe..6784ae93160 100644 --- a/settings.gradle +++ b/settings.gradle @@ -27,8 +27,6 @@ file('modules').eachDir { dir -> project(":testcontainers-${dir.name}").projectDir = dir } -include ':docs:examples:junit4:generic' -include ':docs:examples:junit4:redis' include ':docs:examples:junit5:redis' include ':docs:examples:spock:redis' From 233221d500138234c3607163f6c5ddb3fefd402f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Sep 2025 01:14:39 +0000 Subject: [PATCH 0837/1224] Bump org.assertj:assertj-core from 3.27.4 to 3.27.6 in /core Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.4 to 3.27.6. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.4...assertj-build-3.27.6) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 1768cb703ff..c967de76bfd 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -149,7 +149,7 @@ dependencies { jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" jarFileTestRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' jarFileTestImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - jarFileTestImplementation 'org.assertj:assertj-core:3.27.4' + jarFileTestImplementation 'org.assertj:assertj-core:3.27.6' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' } From 559df369820cd6b29e144afe5629532567ce4525 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 1 Oct 2025 14:21:51 -0600 Subject: [PATCH 0838/1224] Update java version in .sdkmanrc --- .sdkmanrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.sdkmanrc b/.sdkmanrc index b9fe931c084..1c5feb60c95 100644 --- a/.sdkmanrc +++ b/.sdkmanrc @@ -1,3 +1,3 @@ # Enable auto-env through the sdkman_auto_env config # Add key=value pairs of SDKs to use below -java=17.0.12-tem +java=17.0.16-tem From 918e448f02ce724ed8c23e1757f1e50200fa32eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 22:00:54 +0000 Subject: [PATCH 0839/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 11.0.10 to 11.0.11. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 1136c2b44b0..8f39707705a 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.4' - api 'org.apache.tomcat:tomcat-jdbc:11.0.10' + api 'org.apache.tomcat:tomcat-jdbc:11.0.11' api 'org.vibur:vibur-dbcp:26.0' api 'mysql:mysql-connector-java:8.0.33' api 'org.junit.jupiter:junit-jupiter:5.13.4' From a0f2610d11bbfce1a140f911d5d87850f9fb81f5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 22:00:56 +0000 Subject: [PATCH 0840/1224] Bump org.apache.commons:commons-lang3 in /modules/jdbc-test Bumps org.apache.commons:commons-lang3 from 3.18.0 to 3.19.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.19.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 1136c2b44b0..490d2d4653f 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -2,7 +2,7 @@ dependencies { api project(':testcontainers-jdbc') api 'com.google.guava:guava:33.4.8-jre' - api 'org.apache.commons:commons-lang3:3.18.0' + api 'org.apache.commons:commons-lang3:3.19.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 6093e2b14c3f4353acd94fff66f25f791799c3ef Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 22:01:00 +0000 Subject: [PATCH 0841/1224] Bump org.assertj:assertj-core in /modules/jdbc-test Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.4 to 3.27.6. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.4...assertj-build-3.27.6) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 1136c2b44b0..a3ad1c65928 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -6,7 +6,7 @@ dependencies { api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' - api 'org.assertj:assertj-core:3.27.4' + api 'org.assertj:assertj-core:3.27.6' api 'org.apache.tomcat:tomcat-jdbc:11.0.10' api 'org.vibur:vibur-dbcp:26.0' From 4319dde76bd4501d712ee6862ad5b96e08c95ce4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Oct 2025 22:01:07 +0000 Subject: [PATCH 0842/1224] Bump com.google.guava:guava in /modules/jdbc-test Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.4.8-jre to 33.5.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-version: 33.5.0-jre dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 1136c2b44b0..20b6371c843 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -1,7 +1,7 @@ dependencies { api project(':testcontainers-jdbc') - api 'com.google.guava:guava:33.4.8-jre' + api 'com.google.guava:guava:33.5.0-jre' api 'org.apache.commons:commons-lang3:3.18.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From 7317fa2a6a1f60a167c8c4947a06ca7d235d5260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 2 Oct 2025 12:45:51 -0600 Subject: [PATCH 0843/1224] Centralize junit jupiter and assertj dependencies (#11067) --- build.gradle | 6 ++++++ modules/activemq/build.gradle | 8 -------- modules/azure/build.gradle | 8 -------- modules/cassandra/build.gradle | 9 --------- modules/chromadb/build.gradle | 8 -------- modules/clickhouse/build.gradle | 8 -------- modules/cockroachdb/build.gradle | 7 ------- modules/consul/build.gradle | 8 -------- modules/couchbase/build.gradle | 8 -------- modules/cratedb/build.gradle | 6 ------ modules/database-commons/build.gradle | 9 --------- modules/databend/build.gradle | 8 -------- modules/db2/build.gradle | 8 -------- modules/elasticsearch/build.gradle | 8 -------- modules/gcloud/build.gradle | 8 -------- modules/grafana/build.gradle | 8 -------- modules/hivemq/build.gradle | 7 ------- modules/influxdb/build.gradle | 8 -------- modules/jdbc/build.gradle | 8 -------- modules/junit-jupiter/build.gradle | 10 ---------- modules/k3s/build.gradle | 8 -------- modules/k6/build.gradle | 9 --------- modules/kafka/build.gradle | 9 --------- modules/ldap/build.gradle | 9 --------- modules/localstack/build.gradle | 8 -------- modules/mariadb/build.gradle | 7 ------- modules/milvus/build.gradle | 8 -------- modules/minio/build.gradle | 8 -------- modules/mockserver/build.gradle | 8 -------- modules/mongodb/build.gradle | 9 --------- modules/mssqlserver/build.gradle | 7 ------- modules/mysql/build.gradle | 7 ------- modules/neo4j/build.gradle | 8 -------- modules/nginx/build.gradle | 9 --------- modules/oceanbase/build.gradle | 7 ------- modules/ollama/build.gradle | 8 -------- modules/openfga/build.gradle | 5 ----- modules/oracle-free/build.gradle | 7 ------- modules/oracle-xe/build.gradle | 7 ------- modules/orientdb/build.gradle | 8 -------- modules/pinecone/build.gradle | 8 -------- modules/postgresql/build.gradle | 7 ------- modules/presto/build.gradle | 7 ------- modules/pulsar/build.gradle | 9 --------- modules/qdrant/build.gradle | 8 -------- modules/questdb/build.gradle | 7 ------- modules/r2dbc/build.gradle | 8 -------- modules/rabbitmq/build.gradle | 8 -------- modules/redpanda/build.gradle | 8 -------- modules/scylladb/build.gradle | 8 -------- modules/selenium/build.gradle | 8 -------- modules/solace/build.gradle | 9 --------- modules/solr/build.gradle | 9 --------- modules/spock/build.gradle | 7 ------- modules/tidb/build.gradle | 7 ------- modules/timeplus/build.gradle | 8 -------- modules/toxiproxy/build.gradle | 8 -------- modules/trino/build.gradle | 7 ------- modules/typesense/build.gradle | 8 -------- modules/vault/build.gradle | 9 --------- modules/weaviate/build.gradle | 8 -------- modules/yugabytedb/build.gradle | 7 ------- 62 files changed, 6 insertions(+), 481 deletions(-) diff --git a/build.gradle b/build.gradle index b4f97c3eaa5..2f0c485d25f 100644 --- a/build.gradle +++ b/build.gradle @@ -89,6 +89,8 @@ subprojects { } test { + useJUnitPlatform() + defaultCharacterEncoding = "UTF-8" testLogging { displayGranularity 1 @@ -133,6 +135,10 @@ subprojects { dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.15' + testImplementation 'org.assertj:assertj-core:3.27.4' + testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } checkstyle { diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 8c209d2dd49..f0ad74ba76b 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -3,14 +3,6 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation "org.apache.activemq:activemq-client:6.1.7" testImplementation "org.apache.activemq:artemis-jakarta-client:2.42.0" } - -test { - useJUnitPlatform() -} diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 226f668e954..517a981b707 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -6,10 +6,6 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform("com.azure:azure-sdk-bom:1.2.32") testImplementation 'com.azure:azure-cosmos' testImplementation 'com.azure:azure-storage-blob' @@ -19,7 +15,3 @@ dependencies { testImplementation 'com.azure:azure-messaging-servicebus' testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' } - -test { - useJUnitPlatform() -} diff --git a/modules/cassandra/build.gradle b/modules/cassandra/build.gradle index de228376595..b0bea00226e 100644 --- a/modules/cassandra/build.gradle +++ b/modules/cassandra/build.gradle @@ -10,14 +10,5 @@ dependencies { api project(":testcontainers-database-commons") api "com.datastax.cassandra:cassandra-driver-core:3.10.0" - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'com.datastax.oss:java-driver-core:4.17.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index def6310b420..cec94a23faa 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: ChromaDB" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' } - -test { - useJUnitPlatform() -} diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 3fc372b2891..30460232a39 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -10,15 +10,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.1', classifier: 'all') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.clickhouse:client-v2:0.9.1' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') } - -test { - useJUnitPlatform() -} diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 8107fc92f6a..71508c7a791 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -4,11 +4,8 @@ dependencies { api project(':testcontainers-jdbc') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -16,7 +13,3 @@ tasks.japicmp { "org.testcontainers.containers.CockroachContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index a3f6d93dbe2..ff88de2db29 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -3,14 +3,6 @@ description = "Testcontainers :: Consul" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.ecwid.consul:consul-api:1.4.5' testImplementation 'io.rest-assured:rest-assured:5.5.6' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/couchbase/build.gradle b/modules/couchbase/build.gradle index b686c581dcf..b5ef595c685 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,12 +5,8 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.couchbase.client:java-client:3.9.0' testImplementation 'org.awaitility:awaitility:4.3.0' - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -18,7 +14,3 @@ tasks.japicmp { "org.testcontainers.couchbase.CouchbaseContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index f7bc059ced3..ae0bfc8ec93 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -4,14 +4,8 @@ dependencies { api project(':testcontainers-jdbc') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') compileOnly 'org.jetbrains:annotations:26.0.2' } - -test { - useJUnitPlatform() -} diff --git a/modules/database-commons/build.gradle b/modules/database-commons/build.gradle index 5193e6dfcf7..345b354d739 100644 --- a/modules/database-commons/build.gradle +++ b/modules/database-commons/build.gradle @@ -2,13 +2,4 @@ description = "Testcontainers :: Database-Commons" dependencies { api project(':testcontainers') - - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 1535441e925..d9a5655b4ed 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -5,12 +5,4 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.databend:databend-jdbc:0.4.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 49fb4c72e28..2d938428d0c 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -3,12 +3,8 @@ description = "Testcontainers :: JDBC :: DB2" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -16,7 +12,3 @@ tasks.japicmp { "org.testcontainers.containers.Db2Container" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle index 31b7e66705f..f349178f8ed 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,12 +3,8 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.2" testImplementation "org.elasticsearch.client:transport:7.17.29" - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -16,7 +12,3 @@ tasks.japicmp { "org.testcontainers.elasticsearch.ElasticsearchContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 5fabdf773df..5e9515c51ac 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,9 +3,6 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform("com.google.cloud:libraries-bom:26.66.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' @@ -13,9 +10,4 @@ dependencies { testImplementation 'com.google.cloud:google-cloud-pubsub' testImplementation 'com.google.cloud:google-cloud-spanner' testImplementation 'com.google.cloud:google-cloud-bigtable' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index bd69ea40170..2a9bbb501ee 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -3,10 +3,6 @@ description = "Testcontainers :: Grafana" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.3' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' @@ -16,7 +12,3 @@ dependencies { testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' } - -test { - useJUnitPlatform() -} diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b5fbcac0a32..af6eaa9efbf 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -11,21 +11,14 @@ dependencies { shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") shaded("net.lingala.zip4j:zip4j:2.11.5") - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.42.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.8") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") - testImplementation 'org.assertj:assertj-core:3.27.4' } test { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" - } javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(11) } diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index 3fcb2925e13..958e1ceb101 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -5,10 +5,6 @@ dependencies { compileOnly 'org.influxdb:influxdb-java:2.25' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.influxdb:influxdb-java:2.25' testImplementation "com.influxdb:influxdb-client-java:7.3.0" } @@ -18,7 +14,3 @@ tasks.japicmp { "org.testcontainers.containers.InfluxDBContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/jdbc/build.gradle b/modules/jdbc/build.gradle index f1deb59c41d..9561b4404e8 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -3,20 +3,12 @@ description = "Testcontainers :: JDBC" dependencies { api project(':testcontainers-database-commons') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.10' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') } } - -test { - useJUnitPlatform() -} diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle index fd06bba5bb7..beb921bdf0d 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -13,17 +13,7 @@ dependencies { testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') } - testImplementation 'org.assertj:assertj-core:3.27.3' - testImplementation 'org.junit.jupiter:junit-jupiter' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.13.4' testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } - -test { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" - } -} diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 88e3c2ffa44..2f7571adede 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -6,14 +6,6 @@ dependencies { // Synchronize with the jackson version, must match major and minor version shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'io.fabric8:kubernetes-client:7.3.1' testImplementation 'io.kubernetes:client-java:24.0.0-legacy' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/k6/build.gradle b/modules/k6/build.gradle index 369f35a6c9a..0ca874ddc25 100644 --- a/modules/k6/build.gradle +++ b/modules/k6/build.gradle @@ -2,13 +2,4 @@ description = "Testcontainers :: k6" dependencies { api project(':testcontainers') - - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/kafka/build.gradle b/modules/kafka/build.gradle index baee466d59e..4e89be9a32e 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -3,16 +3,7 @@ description = "Testcontainers :: Kafka" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'org.apache.kafka:kafka-clients:3.8.0' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.google.guava:guava:23.0' testImplementation 'org.awaitility:awaitility:4.3.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/ldap/build.gradle b/modules/ldap/build.gradle index 4722de4d317..62f57581cf3 100644 --- a/modules/ldap/build.gradle +++ b/modules/ldap/build.gradle @@ -3,14 +3,5 @@ description = "Testcontainers :: LDAP" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.3' } - -test { - useJUnitPlatform() -} - diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle index f4f827faccc..c2f1fd36f13 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,16 +3,12 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform("software.amazon.awssdk:bom:2.32.29") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' testImplementation 'software.amazon.awssdk:cloudwatchlogs' testImplementation 'software.amazon.awssdk:lambda' testImplementation 'software.amazon.awssdk:kms' - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -20,7 +16,3 @@ tasks.japicmp { "org.testcontainers.containers.localstack.LocalStackContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle index 2bb703099aa..d68f122f4dc 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -6,9 +6,6 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.5' @@ -21,7 +18,3 @@ tasks.japicmp { "org.testcontainers.containers.MariaDBContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index ed176e3394d..1332054fd31 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.milvus:milvus-sdk-java:2.6.3' } - -test { - useJUnitPlatform() -} diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index 45ef78d7315..b3ce592eccb 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation("io.minio:minio:8.5.17") - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index 032d4a79e0a..bfd7a9261ac 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -3,11 +3,7 @@ description = "Testcontainers :: MockServer" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.mock-server:mockserver-client-java:5.15.0' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' } @@ -16,7 +12,3 @@ tasks.japicmp { "org.testcontainers.containers.MockServerContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index 813b1c60890..729cf59aab1 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -3,12 +3,7 @@ description = "Testcontainers :: MongoDB" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation("org.mongodb:mongodb-driver-sync:5.1.4") - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -16,7 +11,3 @@ tasks.japicmp { "org.testcontainers.containers.MongoDBContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle index da8318ffa84..3ba79559b58 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -6,9 +6,6 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' @@ -24,7 +21,3 @@ tasks.japicmp { "org.testcontainers.containers.MSSQLServerContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index 32573799f70..ddacc0fdc50 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -6,9 +6,6 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' @@ -23,7 +20,3 @@ tasks.japicmp { "org.testcontainers.containers.MySQLContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/neo4j/build.gradle b/modules/neo4j/build.gradle index a1b49eac532..b13216e3719 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -33,11 +33,7 @@ dependencies { api project(":testcontainers") - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -46,7 +42,3 @@ tasks.japicmp { "org.testcontainers.containers.Neo4jLabsPlugin" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index b179ad33845..513a1c41122 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -3,11 +3,6 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') compileOnly 'org.jetbrains:annotations:26.0.2' - - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -15,7 +10,3 @@ tasks.japicmp { "org.testcontainers.containers.NginxContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/oceanbase/build.gradle b/modules/oceanbase/build.gradle index c577c65b260..d4278ddc0bc 100644 --- a/modules/oceanbase/build.gradle +++ b/modules/oceanbase/build.gradle @@ -3,13 +3,6 @@ description = "Testcontainers :: JDBC :: OceanBase" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } - -test { - useJUnitPlatform() -} diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index 62a34a0f05a..87a31296135 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: Ollama" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' } - -test { - useJUnitPlatform() -} diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 628d940826f..f681fe841e2 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,15 +3,10 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'dev.openfga:openfga-sdk:0.9.0' } test { - useJUnitPlatform() javaLauncher = javaToolchains.launcherFor { languageVersion = JavaLanguageVersion.of(17) } diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index 3f85086074f..a55c9f26518 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -6,9 +6,6 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' @@ -17,7 +14,3 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index edc86cef19c..a384fcb7221 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -6,9 +6,6 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' @@ -23,7 +20,3 @@ tasks.japicmp { "org.testcontainers.containers.OracleContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index a6ab87a0d03..4bb59c14888 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -5,10 +5,6 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.43" - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" } @@ -18,7 +14,3 @@ tasks.japicmp { "org.testcontainers.containers.OrientDBContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/pinecone/build.gradle b/modules/pinecone/build.gradle index 20101b9b5d9..3ad5b97d98f 100644 --- a/modules/pinecone/build.gradle +++ b/modules/pinecone/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.pinecone:pinecone-client:3.1.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle index dd5e441477a..8af61c5f3e2 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -6,9 +6,6 @@ dependencies { compileOnly project(':testcontainers-r2dbc') compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' @@ -23,7 +20,3 @@ tasks.japicmp { "org.testcontainers.containers.PostgreSQLContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/presto/build.gradle b/modules/presto/build.gradle index 452e8cc271d..194b413c10f 100644 --- a/modules/presto/build.gradle +++ b/modules/presto/build.gradle @@ -3,14 +3,7 @@ description = "Testcontainers :: JDBC :: Presto" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.prestosql:presto-jdbc:350' compileOnly 'org.jetbrains:annotations:26.0.2' } - -test { - useJUnitPlatform() -} diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle index c9309daa24a..44cbea3c20e 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,14 +3,9 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation platform("org.apache.pulsar:pulsar-bom:4.0.5") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' - testImplementation 'org.assertj:assertj-core:3.27.4' } tasks.japicmp { @@ -18,7 +13,3 @@ tasks.japicmp { "org.testcontainers.containers.PulsarContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 304d76f9251..c67fd6c7f74 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -3,17 +3,9 @@ description = "Testcontainers :: Qdrant" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.qdrant:client:1.15.0' testImplementation platform('io.grpc:grpc-bom:1.75.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' testImplementation 'io.grpc:grpc-netty-shaded' } - -test { - useJUnitPlatform() -} diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index f2b69777ab2..9e1ab7c459f 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -5,16 +5,9 @@ dependencies { api project(':testcontainers-jdbc') testRuntimeOnly 'org.postgresql:postgresql:42.7.7' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.questdb:questdb:9.0.2' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } - -test { - useJUnitPlatform() -} diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 87c0e927048..625afd2b322 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -8,10 +8,6 @@ dependencies { api project(':testcontainers') api 'io.r2dbc:r2dbc-spi:0.9.0.RELEASE' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') @@ -19,7 +15,3 @@ dependencies { testFixturesImplementation 'org.assertj:assertj-core:3.27.4' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' } - -test { - useJUnitPlatform() -} diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 7e9b2587709..4340fdcc539 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -3,11 +3,7 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.rabbitmq:amqp-client:5.26.0' - testImplementation 'org.assertj:assertj-core:3.27.3' compileOnly 'org.jetbrains:annotations:26.0.2' } @@ -16,7 +12,3 @@ tasks.japicmp { "org.testcontainers.containers.RabbitMQContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index d930155291e..ec254add76f 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,16 +4,8 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.34' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'org.apache.kafka:kafka-clients:4.0.0' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.awaitility:awaitility:4.3.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index b0551714a3a..b840279910b 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -3,14 +3,6 @@ description = "Testcontainers :: ScyllaDB" dependencies { api project(":testcontainers") - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.scylladb:java-driver-core:4.19.0.1' - testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'software.amazon.awssdk:dynamodb:2.32.30' } - -test { - useJUnitPlatform() -} diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index b4eff2f2656..f9f26883752 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -6,9 +6,6 @@ dependencies { provided 'org.seleniumhq.selenium:selenium-remote-driver:4.10.0' provided 'org.seleniumhq.selenium:selenium-chrome-driver:4.10.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation platform('org.seleniumhq.selenium:selenium-bom:4.13.0') testImplementation 'org.seleniumhq.selenium:selenium-firefox-driver' testImplementation 'org.seleniumhq.selenium:selenium-edge-driver' @@ -16,11 +13,6 @@ dependencies { testImplementation 'org.mortbay.jetty:jetty:6.1.26' testImplementation project(':testcontainers-nginx') - testImplementation 'org.assertj:assertj-core:3.27.4' compileOnly 'org.jetbrains:annotations:26.0.2' } - -test { - useJUnitPlatform() -} diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 8dd48e68f28..2bfc83e0218 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,17 +5,8 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.solacesystems:sol-jcsmp:10.27.3' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' - -} - -test { - useJUnitPlatform() } diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index 30fc1d9b833..c4966152fba 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -5,12 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' testImplementation 'org.apache.solr:solr-solrj:8.11.4' - testImplementation 'org.assertj:assertj-core:3.27.3' } tasks.japicmp { @@ -18,7 +13,3 @@ tasks.japicmp { "org.testcontainers.containers.SolrContainer" ] } - -test { - useJUnitPlatform() -} diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle index ec7fed6ec36..92e20a0dda7 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -41,10 +41,3 @@ javadocJar { archiveClassifier = 'javadoc' from groovydoc.destinationDir } - -test { - useJUnitPlatform() - testLogging { - events "passed", "skipped", "failed" - } -} diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 61d21063af0..47dd9d01027 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -3,15 +3,8 @@ description = "Testcontainers :: JDBC :: TiDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' compileOnly 'org.jetbrains:annotations:26.0.2' } - -test { - useJUnitPlatform() -} diff --git a/modules/timeplus/build.gradle b/modules/timeplus/build.gradle index 681efb5cf7a..8acf35ef232 100644 --- a/modules/timeplus/build.gradle +++ b/modules/timeplus/build.gradle @@ -4,14 +4,6 @@ dependencies { api project(':testcontainers') api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.timeplus:timeplus-native-jdbc:2.0.10' - testImplementation 'org.assertj:assertj-core:3.27.4' -} - -test { - useJUnitPlatform() } diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 6fe7062a045..69cd07f385f 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -5,10 +5,6 @@ dependencies { api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' testImplementation 'redis.clients:jedis:6.1.0' - testImplementation 'org.assertj:assertj-core:3.27.4' - testImplementation platform('org.junit:junit-bom:5.13.4') - testImplementation 'org.junit.jupiter:junit-jupiter' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } tasks.japicmp { @@ -16,7 +12,3 @@ tasks.japicmp { "org.testcontainers.containers.ToxiproxyContainer" ] } - -tasks.withType(Test).configureEach { - useJUnitPlatform() -} diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 04c5ffb73b7..08e3c0c2982 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -3,14 +3,7 @@ description = "Testcontainers :: JDBC :: Trino" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.trino:trino-jdbc:476' compileOnly 'org.jetbrains:annotations:26.0.2' } - -test { - useJUnitPlatform() -} diff --git a/modules/typesense/build.gradle b/modules/typesense/build.gradle index ded834121f0..84a5978ba81 100644 --- a/modules/typesense/build.gradle +++ b/modules/typesense/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: Typesense" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.typesense:typesense-java:1.3.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/vault/build.gradle b/modules/vault/build.gradle index f492962b964..7c222d4b064 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -3,15 +3,6 @@ description = "Testcontainers :: Vault" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation 'com.bettercloud:vault-java-driver:5.1.0' testImplementation 'io.rest-assured:rest-assured:5.5.6' - testImplementation 'org.assertj:assertj-core:3.27.4' - -} - -test { - useJUnitPlatform() } diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 04235749e3b..ed9ee52aa4d 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -3,13 +3,5 @@ description = "Testcontainers :: Weaviate" dependencies { api project(':testcontainers') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation 'org.assertj:assertj-core:3.27.3' testImplementation 'io.weaviate:client:5.4.0' } - -test { - useJUnitPlatform() -} diff --git a/modules/yugabytedb/build.gradle b/modules/yugabytedb/build.gradle index b867b42a603..4351653b4f3 100644 --- a/modules/yugabytedb/build.gradle +++ b/modules/yugabytedb/build.gradle @@ -3,16 +3,9 @@ description = "Testcontainers :: JDBC :: YugabyteDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - - testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation project(':testcontainers-jdbc-test') // YCQL driver testImplementation 'com.yugabyte:java-driver-core:4.19.0-yb-1' // YSQL driver testRuntimeOnly 'com.yugabyte:jdbc-yugabytedb:42.7.3-yb-4' } - -test { - useJUnitPlatform() -} From 190dcec633f178e95377d3c21639f2f3ed4166ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:49:21 +0000 Subject: [PATCH 0844/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 11.0.10 to 11.0.11. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 9561b4404e8..64a9f6b2d04 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.10' + testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.11' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From 70d6a25c4aa57d7cff17af3c099513cedf11df67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:58:13 +0000 Subject: [PATCH 0845/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /modules/jdbc Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 9561b4404e8..8c3eef1567b 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC" dependencies { api project(':testcontainers-database-commons') - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.10' From 850ee843c9277f30dd59c53a263d0108f7b34f78 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:59:31 +0000 Subject: [PATCH 0846/1224] Bump org.mariadb.jdbc:mariadb-java-client in /modules/mariadb Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.5.5 to 3.5.6. - [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases) - [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/main/CHANGELOG.md) - [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.5...3.5.6) --- updated-dependencies: - dependency-name: org.mariadb.jdbc:mariadb-java-client dependency-version: 3.5.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 d68f122f4dc..465b9555b4d 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.5' + testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.6' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' From aeb963eaf71877650f43b8572aef5eb78e68bb99 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 18:59:49 +0000 Subject: [PATCH 0847/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.9.0 to 3.9.1. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/3.9.0...3.9.1) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-version: 3.9.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b5ef595c685..4b34a540ac6 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,7 +5,7 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.1.0' - testImplementation 'com.couchbase.client:java-client:3.9.0' + testImplementation 'com.couchbase.client:java-client:3.9.1' testImplementation 'org.awaitility:awaitility:4.3.0' } From 200e85353a541822e3a93270f899ce2602a51eec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:02:23 +0000 Subject: [PATCH 0848/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.1.2 to 9.1.4. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.1.2...v9.1.4) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.1.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 f349178f8ed..1bac3a94d8c 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.2" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.4" testImplementation "org.elasticsearch.client:transport:7.17.29" } From cc18004bc3b3ad4d6105ce33deefb9bdffd6da20 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:03:55 +0000 Subject: [PATCH 0849/1224] Bump com.clickhouse:clickhouse-jdbc in /modules/clickhouse Bumps [com.clickhouse:clickhouse-jdbc](https://github.com/ClickHouse/clickhouse-java) from 0.9.1 to 0.9.2. - [Release notes](https://github.com/ClickHouse/clickhouse-java/releases) - [Changelog](https://github.com/ClickHouse/clickhouse-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/ClickHouse/clickhouse-java/compare/v0.9.1...v0.9.2) --- updated-dependencies: - dependency-name: com.clickhouse:clickhouse-jdbc dependency-version: 0.9.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/clickhouse/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 30460232a39..1579ea834ce 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -5,12 +5,12 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') + compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.2', classifier: 'http') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.1', classifier: 'all') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.2', classifier: 'all') - testImplementation 'com.clickhouse:client-v2:0.9.1' + testImplementation 'com.clickhouse:client-v2:0.9.2' testImplementation testFixtures(project(':testcontainers-r2dbc')) - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.1', classifier: 'http') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.2', classifier: 'http') } From 2f28f8ece83665a9d5d977182a73f59c572042e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:06:34 +0000 Subject: [PATCH 0850/1224] Bump com.google.code.gson:gson from 2.13.1 to 2.13.2 in /examples Bumps [com.google.code.gson:gson](https://github.com/google/gson) from 2.13.1 to 2.13.2. - [Release notes](https://github.com/google/gson/releases) - [Changelog](https://github.com/google/gson/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/gson/compare/gson-parent-2.13.1...gson-parent-2.13.2) --- updated-dependencies: - dependency-name: com.google.code.gson:gson dependency-version: 2.13.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 52c574e182d..890d93a983c 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'redis.clients:jedis:6.1.0' - implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.code.gson:gson:2.13.2' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'ch.qos.logback:logback-classic:1.3.15' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index da92871a0df..3cd1c36c201 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' implementation 'redis.clients:jedis:6.1.0' - implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.code.gson:gson:2.13.2' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' testImplementation 'org.testcontainers:testcontainers-junit-jupiter' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 4e8faa7a1b9..ff5d622a670 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { implementation 'redis.clients:jedis:6.1.0' - implementation 'com.google.code.gson:gson:2.13.1' + implementation 'com.google.code.gson:gson:2.13.2' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From ae2309a3bb4950b03148d87d90a1b5e91cca4f27 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:06:50 +0000 Subject: [PATCH 0851/1224] Bump org.apache.kafka:kafka-clients from 4.0.0 to 4.1.0 in /examples Bumps org.apache.kafka:kafka-clients from 4.0.0 to 4.1.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-version: 4.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/kafka-cluster/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/kafka-cluster/build.gradle b/examples/kafka-cluster/build.gradle index 41dffd5a543..67ca7e4e37c 100644 --- a/examples/kafka-cluster/build.gradle +++ b/examples/kafka-cluster/build.gradle @@ -10,7 +10,7 @@ dependencies { testCompileOnly "org.projectlombok:lombok:1.18.38" testAnnotationProcessor "org.projectlombok:lombok:1.18.38" testImplementation 'org.testcontainers:testcontainers-kafka' - testImplementation 'org.apache.kafka:kafka-clients:4.0.0' + testImplementation 'org.apache.kafka:kafka-clients:4.1.0' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'com.google.guava:guava:23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' From 820e1d89feef730b98eb0c801c49fc58abe39d6a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:08:41 +0000 Subject: [PATCH 0852/1224] Bump eu.rekawek.toxiproxy:toxiproxy-java in /modules/toxiproxy Bumps [eu.rekawek.toxiproxy:toxiproxy-java](https://github.com/trekawek/toxiproxy-java) from 2.1.7 to 2.1.11. - [Release notes](https://github.com/trekawek/toxiproxy-java/releases) - [Changelog](https://github.com/trekawek/toxiproxy-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/trekawek/toxiproxy-java/compare/toxiproxy-java-2.1.7...toxiproxy-java-2.1.11) --- updated-dependencies: - dependency-name: eu.rekawek.toxiproxy:toxiproxy-java dependency-version: 2.1.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 69cd07f385f..c913509e638 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: Toxiproxy" dependencies { api project(':testcontainers') - api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' + api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.11' testImplementation 'redis.clients:jedis:6.1.0' } From 36623b7ec93fa5c41bcab66c36b3bef22010ef0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:08:46 +0000 Subject: [PATCH 0853/1224] Bump redis.clients:jedis from 6.1.0 to 6.2.0 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 69cd07f385f..3cdabdb12a0 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.7' - testImplementation 'redis.clients:jedis:6.1.0' + testImplementation 'redis.clients:jedis:6.2.0' } tasks.japicmp { From 55afec3c6e2c7736f7051922b399513940c236d8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:09:09 +0000 Subject: [PATCH 0854/1224] Bump io.trino:trino-jdbc from 476 to 477 in /modules/trino Bumps io.trino:trino-jdbc from 476 to 477. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-version: '477' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 08e3c0c2982..ced1b2fa10c 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:476' + testRuntimeOnly 'io.trino:trino-jdbc:477' compileOnly 'org.jetbrains:annotations:26.0.2' } From 0d69dae6e5bb6f8f708440d9b4f9ffdda9fdcf6f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:09:24 +0000 Subject: [PATCH 0855/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.66.0 to 26.69.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Changelog](https://github.com/googleapis/java-cloud-bom/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.66.0...v26.69.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.69.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 5e9515c51ac..79b856cf06e 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.66.0") + testImplementation platform("com.google.cloud:libraries-bom:26.69.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From c02f50dd55d0b5e6160da7dbfbf0ed2b46fb32a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:11:52 +0000 Subject: [PATCH 0856/1224] Bump org.postgresql:postgresql in /modules/cockroachdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.7 to 42.7.8. - [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.7.7...REL42.7.8) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cockroachdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 71508c7a791..8b48153b4d7 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC :: CockroachDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testImplementation project(':testcontainers-jdbc-test') } From 7d22f2dfc8daed14a8a68ebabe827b78acae9436 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:12:01 +0000 Subject: [PATCH 0857/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.43 to 3.2.44. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/3.2.44/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.43...3.2.44) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-version: 3.2.44 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 4bb59c14888..2de0c86dee4 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,10 +3,10 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.43" + api "com.orientechnologies:orientdb-client:3.2.44" testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.44" } tasks.japicmp { From d7ff6e943fd469e8f25111c6046c727caada9861 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:12:20 +0000 Subject: [PATCH 0858/1224] Bump com.orientechnologies:orientdb-gremlin in /modules/orientdb Bumps [com.orientechnologies:orientdb-gremlin](https://github.com/orientechnologies/orientdb-gremlin) from 3.2.43 to 3.2.44. - [Commits](https://github.com/orientechnologies/orientdb-gremlin/compare/3.2.43...3.2.44) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-gremlin dependency-version: 3.2.44 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 4bb59c14888..2de0c86dee4 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,10 +3,10 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.43" + api "com.orientechnologies:orientdb-client:3.2.44" testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.43" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.44" } tasks.japicmp { From b6d97ef3e56b2ff17727d470baa0565da03ef1f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:15:47 +0000 Subject: [PATCH 0859/1224] Bump org.postgresql:postgresql from 42.7.7 to 42.7.8 in /modules/questdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.7 to 42.7.8. - [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.7.7...REL42.7.8) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 9e1ab7c459f..5673fcb4bcd 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.questdb:questdb:9.0.2' From 141582a849949ed7f1be8688a0f34fe55c04b6e6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:15:55 +0000 Subject: [PATCH 0860/1224] Bump org.questdb:questdb from 9.0.2 to 9.0.3 in /modules/questdb Bumps [org.questdb:questdb](https://github.com/questdb/questdb) from 9.0.2 to 9.0.3. - [Release notes](https://github.com/questdb/questdb/releases) - [Commits](https://github.com/questdb/questdb/compare/9.0.2...9.0.3) --- updated-dependencies: - dependency-name: org.questdb:questdb dependency-version: 9.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 9e1ab7c459f..4017907ab30 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -7,7 +7,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.7' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.questdb:questdb:9.0.2' + testImplementation 'org.questdb:questdb:9.0.3' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } From 59a6614bb9dc88176cb516de915666ba83d6f7f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:15:58 +0000 Subject: [PATCH 0861/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 4.0.0 to 4.1.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-version: 4.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index ec254add76f..d349572bfe9 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.34' - testImplementation 'org.apache.kafka:kafka-clients:4.0.0' + testImplementation 'org.apache.kafka:kafka-clients:4.1.0' testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.awaitility:awaitility:4.3.0' From 70734c28240da6629b872f95238b69ede5da5269 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:17:44 +0000 Subject: [PATCH 0862/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps com.solacesystems:sol-jcsmp from 10.27.3 to 10.28.1. --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-version: 10.28.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 2bfc83e0218..83583fd5cdf 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - testImplementation 'com.solacesystems:sol-jcsmp:10.27.3' + testImplementation 'com.solacesystems:sol-jcsmp:10.28.1' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From 0b590fe85ceb2c09f221fad4e435f187ab6fa69e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:20:23 +0000 Subject: [PATCH 0863/1224] Bump io.minio:minio from 8.5.17 to 8.6.0 in /modules/minio Bumps [io.minio:minio](https://github.com/minio/minio-java) from 8.5.17 to 8.6.0. - [Release notes](https://github.com/minio/minio-java/releases) - [Commits](https://github.com/minio/minio-java/compare/8.5.17...8.6.0) --- updated-dependencies: - dependency-name: io.minio:minio dependency-version: 8.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index b3ce592eccb..35dcecb8b95 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testImplementation("io.minio:minio:8.5.17") + testImplementation("io.minio:minio:8.6.0") } From 44f111c000481238e839461114b3a55efca266a9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:37:17 +0000 Subject: [PATCH 0864/1224] Bump io.weaviate:client from 5.4.0 to 5.5.0 in /modules/weaviate Bumps [io.weaviate:client](https://github.com/weaviate/java-client) from 5.4.0 to 5.5.0. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/5.4.0...5.5.0) --- updated-dependencies: - dependency-name: io.weaviate:client dependency-version: 5.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index ed9ee52aa4d..fd61cd7e3f4 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Weaviate" dependencies { api project(':testcontainers') - testImplementation 'io.weaviate:client:5.4.0' + testImplementation 'io.weaviate:client:5.5.0' } From 44be82fccf5b3523fe76a713d7000d9a6173d33c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:41:34 +0000 Subject: [PATCH 0865/1224] Bump io.milvus:milvus-sdk-java from 2.6.3 to 2.6.5 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.6.3 to 2.6.5. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.6.3...v2.6.5) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-version: 2.6.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 1332054fd31..2aec7fc1da3 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testImplementation 'io.milvus:milvus-sdk-java:2.6.3' + testImplementation 'io.milvus:milvus-sdk-java:2.6.5' } From 282f745dc1d9c46aa67d1e4a2bcf58e1676f79ff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:53:04 +0000 Subject: [PATCH 0866/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.15.3 to 1.15.4. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.15.3...v1.15.4) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.15.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 2a9bbb501ee..2d52bebe2bc 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'io.rest-assured:rest-assured:5.5.6' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.3' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.4' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.53.0') From f2aa1e5da676b5117cba10e87956d717e9c5a87d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:53:38 +0000 Subject: [PATCH 0867/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.53.0 to 1.54.1. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.53.0...v1.54.1) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.54.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 2a9bbb501ee..2e3da22cd19 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.3' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.53.0') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.54.1') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From c0427bb2a22dee58c5d1fc7eab5e366424be425c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Oct 2025 19:56:50 +0000 Subject: [PATCH 0868/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.32.30 to 2.34.8. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.34.8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index b840279910b..28e91cca882 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(":testcontainers") testImplementation 'com.scylladb:java-driver-core:4.19.0.1' - testImplementation 'software.amazon.awssdk:dynamodb:2.32.30' + testImplementation 'software.amazon.awssdk:dynamodb:2.34.8' } From b373c99e3787049d0c4d1ffbad30b0920e2a2b8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:33:06 +0000 Subject: [PATCH 0869/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /modules/trino Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index ced1b2fa10c..6839d4791aa 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.trino:trino-jdbc:477' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } From b51936c6e132301dd686ffd78fa1ee4a901988cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:17:32 +0000 Subject: [PATCH 0870/1224] Bump org.jetbrains:annotations in /modules/cratedb Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index ae0bfc8ec93..b0af7365c82 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 66804a3636ba13d06ac9cbfb77d38a8d90216073 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:17:32 +0000 Subject: [PATCH 0871/1224] Bump org.jetbrains:annotations in /modules/oracle-free Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index a55c9f26518..769572aaef1 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' From b992439826105299c7de91d5ebd2058c07887bcf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:17:40 +0000 Subject: [PATCH 0872/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /modules/tidb Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/tidb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 47dd9d01027..d4b49370be4 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -6,5 +6,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 6a1eb9ef7438e9e67a12eaca44a8774e7820f059 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:17:46 +0000 Subject: [PATCH 0873/1224] Bump org.jetbrains:annotations in /modules/hivemq Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index af6eaa9efbf..7f0a42c79c2 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: HiveMQ" dependencies { api(project(":testcontainers")) - api("org.jetbrains:annotations:26.0.2") + api("org.jetbrains:annotations:26.0.2-1") shaded("org.apache.commons:commons-lang3:3.18.0") shaded("commons-io:commons-io:2.20.0") From 06e91a8abfcb0da556325f4bca9e6979ea785092 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:18:07 +0000 Subject: [PATCH 0874/1224] Bump org.jetbrains:annotations in /modules/rabbitmq Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 4340fdcc539..f1d273b75bb 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(":testcontainers") testImplementation 'com.rabbitmq:amqp-client:5.26.0' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } tasks.japicmp { From 7b22d9f5bc4dcb779e59b81a0e02ef45eee47673 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:18:12 +0000 Subject: [PATCH 0875/1224] Bump org.jetbrains:annotations in /modules/presto Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/presto/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/presto/build.gradle b/modules/presto/build.gradle index 194b413c10f..874b532fb85 100644 --- a/modules/presto/build.gradle +++ b/modules/presto/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.prestosql:presto-jdbc:350' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } From b87ddff75fd5479b445f74b475df90ebe38a40be Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:19:41 +0000 Subject: [PATCH 0876/1224] Bump org.jetbrains:annotations in /modules/oracle-xe Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index a384fcb7221..f8a7b1f07db 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' From 38fa1e56f7b20bdd5f9c992bd122c134ffb7f64e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:20:13 +0000 Subject: [PATCH 0877/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /modules/spock Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 92e20a0dda7..d6597c3cfc0 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -21,7 +21,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' - testCompileOnly 'org.jetbrains:annotations:26.0.2' + testCompileOnly 'org.jetbrains:annotations:26.0.2-1' } tasks.withType(GroovyCompile) { From 17bef506e89301d27f53fe959a9372760ce2db67 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:21:26 +0000 Subject: [PATCH 0878/1224] Bump org.jetbrains:annotations in /modules/postgresql Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 8af61c5f3e2..c9b308f37cc 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } tasks.japicmp { From f8fbee0e00949734adbf6408376109fcfbcf3610 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:21:34 +0000 Subject: [PATCH 0879/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /modules/mysql Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 ddacc0fdc50..a523277ca5d 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } tasks.japicmp { From 4ef311f3eb51def80df64e1cdac997f19456e2e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:21:46 +0000 Subject: [PATCH 0880/1224] Bump org.jetbrains:annotations from 26.0.2 to 26.0.2-1 in /modules/nginx Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/nginx/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index 513a1c41122..732cee22faf 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } tasks.japicmp { From 43e9dc51c16bd755b20dc8d2c26a5c50f303a13b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Oct 2025 15:21:56 +0000 Subject: [PATCH 0881/1224] Bump org.jetbrains:annotations in /modules/selenium Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2 to 26.0.2-1. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2...26.0.2-1) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.0.2-1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/selenium/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index f9f26883752..30c3c1a7619 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -14,5 +14,5 @@ dependencies { testImplementation 'org.mortbay.jetty:jetty:6.1.26' testImplementation project(':testcontainers-nginx') - compileOnly 'org.jetbrains:annotations:26.0.2' + compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 1e4e7679d1ffbb78974f04497477f78abe950498 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:37:09 +0000 Subject: [PATCH 0882/1224] Bump org.postgresql:postgresql from 42.7.7 to 42.7.8 in /modules/cratedb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.7 to 42.7.8. - [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.7.7...REL42.7.8) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index b0af7365c82..be60919c0e3 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC :: CrateDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testImplementation project(':testcontainers-jdbc-test') From 230190a7311ce7a693f41c88962ad023e5995f4e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:41:41 +0000 Subject: [PATCH 0883/1224] Bump io.nats:jnats from 2.21.5 to 2.23.0 in /examples Bumps [io.nats:jnats](https://github.com/nats-io/nats.java) from 2.21.5 to 2.23.0. - [Release notes](https://github.com/nats-io/nats.java/releases) - [Changelog](https://github.com/nats-io/nats.java/blob/main/CHANGELOG.md) - [Commits](https://github.com/nats-io/nats.java/compare/2.21.5...2.23.0) --- updated-dependencies: - dependency-name: io.nats:jnats dependency-version: 2.23.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/nats/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/nats/build.gradle b/examples/nats/build.gradle index 765fefd7491..5e63a2d33a0 100644 --- a/examples/nats/build.gradle +++ b/examples/nats/build.gradle @@ -9,7 +9,7 @@ repositories { dependencies { testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'org.testcontainers:testcontainers' - testImplementation 'io.nats:jnats:2.21.5' + testImplementation 'io.nats:jnats:2.23.0' testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' From 2ea7b0af53a79ab2f9181cdf8a95d852b274de10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:42:30 +0000 Subject: [PATCH 0884/1224] Bump org.postgresql:postgresql in /modules/postgresql Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.7 to 42.7.8. - [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.7.7...REL42.7.8) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 c9b308f37cc..3a04623e1ce 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' From 90d35b519388f877bc04c1257fe586f284096621 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:42:37 +0000 Subject: [PATCH 0885/1224] Bump org.postgresql:postgresql from 42.7.7 to 42.7.8 in /modules/spock Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.7 to 42.7.8. - [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.7.7...REL42.7.8) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 d6597c3cfc0..7be55504969 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'com.zaxxer:HikariCP:7.0.2' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' testRuntimeOnly platform('org.junit:junit-bom:5.13.4') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' From 58d84a74d7df7945e789ce42c66e6ef76264d56c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:45:21 +0000 Subject: [PATCH 0886/1224] Bump software.amazon.awssdk:bom in /modules/localstack Bumps software.amazon.awssdk:bom from 2.32.29 to 2.34.7. --- updated-dependencies: - dependency-name: software.amazon.awssdk:bom dependency-version: 2.34.7 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 c2f1fd36f13..38ea6eabb68 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testImplementation platform("software.amazon.awssdk:bom:2.32.29") + testImplementation platform("software.amazon.awssdk:bom:2.35.0") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' testImplementation 'software.amazon.awssdk:cloudwatchlogs' From 936510f10ebc51157ea5b2676235677cd3e16f17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 15:45:42 +0000 Subject: [PATCH 0887/1224] Bump org.neo4j.driver:neo4j-java-driver in /modules/neo4j Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.20 to 4.4.21. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.20...4.4.21) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-version: 4.4.21 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b13216e3719..3a013391742 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -33,7 +33,7 @@ dependencies { api project(":testcontainers") - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.20' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.21' } tasks.japicmp { From 94d437fb98acc66e7d78f44dfb8f0728cbbe24af Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:53:04 +0000 Subject: [PATCH 0888/1224] Bump redis.clients:jedis from 6.1.0 to 6.2.0 in /examples Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- examples/redis-backed-cache-testng/build.gradle | 2 +- examples/redis-backed-cache/build.gradle | 2 +- examples/singleton-container/build.gradle | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/redis-backed-cache-testng/build.gradle b/examples/redis-backed-cache-testng/build.gradle index 52c574e182d..22f6798c74e 100644 --- a/examples/redis-backed-cache-testng/build.gradle +++ b/examples/redis-backed-cache-testng/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:6.1.0' + implementation 'redis.clients:jedis:6.2.0' implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/redis-backed-cache/build.gradle b/examples/redis-backed-cache/build.gradle index da92871a0df..d9cb263e2b6 100644 --- a/examples/redis-backed-cache/build.gradle +++ b/examples/redis-backed-cache/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { compileOnly 'org.slf4j:slf4j-api:1.7.36' - implementation 'redis.clients:jedis:6.1.0' + implementation 'redis.clients:jedis:6.2.0' implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' testImplementation 'org.testcontainers:testcontainers' diff --git a/examples/singleton-container/build.gradle b/examples/singleton-container/build.gradle index 4e8faa7a1b9..1237adb0300 100644 --- a/examples/singleton-container/build.gradle +++ b/examples/singleton-container/build.gradle @@ -8,7 +8,7 @@ repositories { dependencies { - implementation 'redis.clients:jedis:6.1.0' + implementation 'redis.clients:jedis:6.2.0' implementation 'com.google.code.gson:gson:2.13.1' implementation 'com.google.guava:guava:23.0' compileOnly 'org.slf4j:slf4j-api:1.7.36' From 90a5b3c39fe582aff2b66da972368d1ecde2cab8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:53:15 +0000 Subject: [PATCH 0889/1224] Bump io.cucumber:cucumber-bom from 7.27.2 to 7.30.0 in /examples Bumps [io.cucumber:cucumber-bom](https://github.com/cucumber/cucumber-jvm) from 7.27.2 to 7.30.0. - [Release notes](https://github.com/cucumber/cucumber-jvm/releases) - [Changelog](https://github.com/cucumber/cucumber-jvm/blob/main/CHANGELOG.md) - [Commits](https://github.com/cucumber/cucumber-jvm/compare/v7.27.2...v7.30.0) --- updated-dependencies: - dependency-name: io.cucumber:cucumber-bom dependency-version: 7.30.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 7d46a147ef3..84dbc39a85e 100644 --- a/examples/cucumber/build.gradle +++ b/examples/cucumber/build.gradle @@ -14,7 +14,7 @@ dependencies { testImplementation platform('org.junit:junit-bom:5.13.4') testImplementation 'org.junit.platform:junit-platform-suite' - testImplementation platform('io.cucumber:cucumber-bom:7.27.2') + testImplementation platform('io.cucumber:cucumber-bom:7.30.0') testImplementation 'io.cucumber:cucumber-java' testImplementation 'io.cucumber:cucumber-junit-platform-engine' testImplementation 'org.testcontainers:testcontainers-selenium' From 290cf52960b7244dd45923384b9b457699a8de52 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 17:53:23 +0000 Subject: [PATCH 0890/1224] Bump org.jreleaser from 1.18.0 to 1.20.0 in /examples Bumps org.jreleaser from 1.18.0 to 1.20.0. --- updated-dependencies: - dependency-name: org.jreleaser dependency-version: 1.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 2f0c485d25f..52d6f33f25c 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ plugins { id 'com.gradleup.shadow' version '8.3.9' id 'me.champeau.gradle.japicmp' version '0.4.3' apply false id 'com.diffplug.spotless' version '6.22.0' apply false - id 'org.jreleaser' version '1.18.0' apply false + id 'org.jreleaser' version '1.20.0' apply false } apply from: "$rootDir/gradle/ci-support.gradle" From a4b3a213255bdcd764f1b1924b81569aab9a56e9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 19:38:30 +0000 Subject: [PATCH 0891/1224] Bump io.r2dbc:r2dbc-mssql in /modules/mssqlserver Bumps [io.r2dbc:r2dbc-mssql](https://github.com/r2dbc/r2dbc-mssql) from 1.0.2.RELEASE to 1.0.3.RELEASE. - [Release notes](https://github.com/r2dbc/r2dbc-mssql/releases) - [Changelog](https://github.com/r2dbc/r2dbc-mssql/blob/v1.0.3.RELEASE/CHANGELOG) - [Commits](https://github.com/r2dbc/r2dbc-mssql/compare/v1.0.2.RELEASE...v1.0.3.RELEASE) --- updated-dependencies: - dependency-name: io.r2dbc:r2dbc-mssql dependency-version: 1.0.3.RELEASE dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 3ba79559b58..992d64004e6 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -4,13 +4,13 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' + compileOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' testImplementation project(':testcontainers-r2dbc') - testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.2.RELEASE' + testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' // MSSQL's wait strategy requires the JDBC driver testImplementation testFixtures(project(':testcontainers-r2dbc')) From b86b7fa1f9547d1290d6340645ef2acec0f29d00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 19:39:18 +0000 Subject: [PATCH 0892/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.7.9 to 3.7.11. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.7.9...v3.7.11) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-version: 3.7.11 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 625afd2b322..43fa9bd754b 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.7.9' + testFixturesImplementation 'io.projectreactor:reactor-core:3.7.11' testFixturesImplementation 'org.assertj:assertj-core:3.27.4' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' } From 07509c3e8eefde95409cf18c8f8a156eeb542942 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 20:48:24 +0000 Subject: [PATCH 0893/1224] Bump org.assertj:assertj-core from 3.27.4 to 3.27.6 in /modules/r2dbc Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.4 to 3.27.6. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.4...assertj-build-3.27.6) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 43fa9bd754b..1e777a82d55 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -12,6 +12,6 @@ dependencies { testImplementation project(':testcontainers-postgresql') testFixturesImplementation 'io.projectreactor:reactor-core:3.7.11' - testFixturesImplementation 'org.assertj:assertj-core:3.27.4' + testFixturesImplementation 'org.assertj:assertj-core:3.27.6' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' } From a8f2dbb82eba25833191ef9d8b482e187afb201f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 21:32:07 +0000 Subject: [PATCH 0894/1224] Bump redis.clients:jedis from 6.1.0 to 6.2.0 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.1.0 to 6.2.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.1.0...v6.2.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 beb921bdf0d..43b417a9e83 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.2' - testImplementation 'redis.clients:jedis:6.1.0' + testImplementation 'redis.clients:jedis:6.2.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From e3cd5c440264cb97631d6d2453a557a3364b218b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 21:34:21 +0000 Subject: [PATCH 0895/1224] Bump org.postgresql:postgresql in /modules/junit-jupiter Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.7 to 42.7.8. - [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.7.7...REL42.7.8) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 beb921bdf0d..ccf71b3f388 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -14,6 +14,6 @@ dependencies { exclude(module: 'hamcrest-core') } - testRuntimeOnly 'org.postgresql:postgresql:42.7.7' + testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' } From e27e2a4291bd8bca68f9102faf42e9cd492e899e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:01:11 +0000 Subject: [PATCH 0896/1224] Bump gradle/actions from 4 to 5 Bumps [gradle/actions](https://github.com/gradle/actions) from 4 to 5. - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/v4...v5) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-rootless.yml | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/release.yml | 2 +- .github/workflows/update-gradle-wrapper.yml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-rootless.yml b/.github/workflows/ci-rootless.yml index d13c0437112..05d3d6d6607 100644 --- a/.github/workflows/ci-rootless.yml +++ b/.github/workflows/ci-rootless.yml @@ -52,7 +52,7 @@ jobs: with: rootless: true - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - name: Build with Gradle run: ./gradlew --no-daemon --scan testcontainers:test --tests '*GenericContainerRuleTest' - uses: ./.github/actions/setup-junit-report diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b0d4721fd12..aa2946ea657 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -91,7 +91,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - id: set-matrix env: # Since we override the tests executor, @@ -126,7 +126,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - id: set-matrix working-directory: ./examples/ env: @@ -163,7 +163,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - id: set-matrix env: # Since we override the tests executor, diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index ca009b1dc8b..bdb87788c0a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: run: docker image prune -af - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v5 - name: Run Gradle Build run: ./gradlew build --scan --no-daemon -i -x test diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index da9c77c1b5e..fe1174c60d6 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -24,4 +24,4 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} labels: dependencies - - uses: gradle/actions/wrapper-validation@v4 + - uses: gradle/actions/wrapper-validation@v5 From 2e8e54b5a6d8c16a9668a9c6f7c2d32b0f066053 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Oct 2025 22:06:30 +0000 Subject: [PATCH 0897/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.42.0 to 4.45.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.42.0...4.45.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-version: 4.45.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 7f0a42c79c2..b49929523af 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -12,7 +12,7 @@ dependencies { shaded("net.lingala.zip4j:zip4j:2.11.5") testImplementation(project(":testcontainers-junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.42.0") + testImplementation("com.hivemq:hivemq-extension-sdk:4.45.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.8") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") From 97e6bb9a7ea09f706027117d49021e9c88c5bbee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 04:05:34 +0000 Subject: [PATCH 0898/1224] Bump io.fabric8:kubernetes-client from 7.3.1 to 7.4.0 in /modules/k3s Bumps [io.fabric8:kubernetes-client](https://github.com/fabric8io/kubernetes-client) from 7.3.1 to 7.4.0. - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v7.3.1...v7.4.0) --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-version: 7.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 2f7571adede..aab1a2aa40f 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -6,6 +6,6 @@ dependencies { // Synchronize with the jackson version, must match major and minor version shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' - testImplementation 'io.fabric8:kubernetes-client:7.3.1' + testImplementation 'io.fabric8:kubernetes-client:7.4.0' testImplementation 'io.kubernetes:client-java:24.0.0-legacy' } From b53455a23e5090e309f639be96201487f7039aec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 04:06:09 +0000 Subject: [PATCH 0899/1224] Bump org.apache.pulsar:pulsar-bom from 4.0.5 to 4.1.1 in /modules/pulsar Bumps [org.apache.pulsar:pulsar-bom](https://github.com/apache/pulsar) from 4.0.5 to 4.1.1. - [Release notes](https://github.com/apache/pulsar/releases) - [Commits](https://github.com/apache/pulsar/compare/v4.0.5...v4.1.1) --- updated-dependencies: - dependency-name: org.apache.pulsar:pulsar-bom dependency-version: 4.1.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 44cbea3c20e..106b578dfef 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') - testImplementation platform("org.apache.pulsar:pulsar-bom:4.0.5") + testImplementation platform("org.apache.pulsar:pulsar-bom:4.1.1") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' } From 0524fa7a2542651a4f8979783dfa8afacc00af36 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:21:32 +0000 Subject: [PATCH 0900/1224] Bump org.apache.commons:commons-lang3 in /modules/hivemq Bumps org.apache.commons:commons-lang3 from 3.18.0 to 3.19.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.19.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b49929523af..03223e06510 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -4,7 +4,7 @@ dependencies { api(project(":testcontainers")) api("org.jetbrains:annotations:26.0.2-1") - shaded("org.apache.commons:commons-lang3:3.18.0") + shaded("org.apache.commons:commons-lang3:3.19.0") shaded("commons-io:commons-io:2.20.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") From 7917e67709f7317984c26ff48ba4afae84e90f17 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 17:21:36 +0000 Subject: [PATCH 0901/1224] Bump ch.qos.logback:logback-classic in /modules/hivemq Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.18 to 1.5.19. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.18...v_1.5.19) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.5.19 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b49929523af..58c5d688536 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.hivemq:hivemq-extension-sdk:4.45.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.8") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") - testImplementation("ch.qos.logback:logback-classic:1.5.18") + testImplementation("ch.qos.logback:logback-classic:1.5.19") } test { From eccddefd612fea25d7565c74e349bbc2eb223ba8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Oct 2025 20:00:52 +0000 Subject: [PATCH 0902/1224] Bump com.hivemq:hivemq-mqtt-client in /modules/hivemq Bumps [com.hivemq:hivemq-mqtt-client](https://github.com/hivemq/hivemq-mqtt-client) from 1.3.8 to 1.3.9. - [Release notes](https://github.com/hivemq/hivemq-mqtt-client/releases) - [Changelog](https://github.com/hivemq/hivemq-mqtt-client/blob/master/RELEASE.md) - [Commits](https://github.com/hivemq/hivemq-mqtt-client/compare/v1.3.8...v1.3.9) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-mqtt-client dependency-version: 1.3.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index b49929523af..f7cafa75871 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.45.0") - testImplementation("com.hivemq:hivemq-mqtt-client:1.3.8") + testImplementation("com.hivemq:hivemq-mqtt-client:1.3.10") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.18") } From fd168df3b332e789ef72f3e2e9087bd3b22a4f2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 7 Oct 2025 14:14:07 -0600 Subject: [PATCH 0903/1224] Remove assertj dependency from redpanda module --- modules/redpanda/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index d349572bfe9..74e91674c70 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -5,7 +5,6 @@ dependencies { shaded 'org.freemarker:freemarker:2.3.34' testImplementation 'org.apache.kafka:kafka-clients:4.1.0' - testImplementation 'org.assertj:assertj-core:3.27.4' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.awaitility:awaitility:4.3.0' } From 06ad992b545e49cf8917e85139f69250e5b8426a Mon Sep 17 00:00:00 2001 From: Raju Gupta Date: Wed, 8 Oct 2025 19:15:41 +0100 Subject: [PATCH 0904/1224] Switch to com.mysql:mysql-connector-j (#11078) Fixes #11079 --- docs/examples/junit4/generic/build.gradle | 2 +- modules/jdbc-test/build.gradle | 2 +- modules/junit-jupiter/build.gradle | 2 +- modules/mysql/build.gradle | 2 +- modules/oceanbase/build.gradle | 2 +- modules/spock/build.gradle | 2 +- modules/tidb/build.gradle | 3 +-- 7 files changed, 7 insertions(+), 8 deletions(-) diff --git a/docs/examples/junit4/generic/build.gradle b/docs/examples/junit4/generic/build.gradle index 2844f1a19b3..60764dd7476 100644 --- a/docs/examples/junit4/generic/build.gradle +++ b/docs/examples/junit4/generic/build.gradle @@ -6,7 +6,7 @@ dependencies { testImplementation project(":testcontainers-selenium") testImplementation project(":testcontainers-mysql") - testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' + testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' testImplementation "org.seleniumhq.selenium:selenium-api:4.35.0" testImplementation 'org.assertj:assertj-core:3.27.4' } diff --git a/modules/jdbc-test/build.gradle b/modules/jdbc-test/build.gradle index cdf677ae1b8..a6759030313 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -10,6 +10,6 @@ dependencies { api 'org.apache.tomcat:tomcat-jdbc:11.0.11' api 'org.vibur:vibur-dbcp:26.0' - api 'mysql:mysql-connector-java:8.0.33' + api 'com.mysql:mysql-connector-j:8.2.0' api 'org.junit.jupiter:junit-jupiter:5.13.4' } diff --git a/modules/junit-jupiter/build.gradle b/modules/junit-jupiter/build.gradle index b4965736779..01af88a3aab 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -15,5 +15,5 @@ dependencies { } testRuntimeOnly 'org.postgresql:postgresql:42.7.8' - testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' + testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' } diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index a523277ca5d..b387b05cb2f 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' + testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' diff --git a/modules/oceanbase/build.gradle b/modules/oceanbase/build.gradle index d4278ddc0bc..5758598fb67 100644 --- a/modules/oceanbase/build.gradle +++ b/modules/oceanbase/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' + testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' } diff --git a/modules/spock/build.gradle b/modules/spock/build.gradle index 7be55504969..e2f1ce4554f 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.8' - testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' + testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' testRuntimeOnly platform('org.junit:junit-bom:5.13.4') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index d4b49370be4..66298ac6635 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -4,7 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'mysql:mysql-connector-java:8.0.33' - + testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 915760fa2e699974533b3c8d2dcbabe437add582 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 12:33:32 -0600 Subject: [PATCH 0905/1224] Add CockroachDB container implementation under org.testcontainers.cockroachdb (#11080) --- docs/modules/databases/cockroachdb.md | 2 +- .../cockroachdb/CockroachContainer.java | 158 ++++++++++++++++++ .../containers/CockroachContainer.java | 3 + .../CockroachContainerTest.java} | 5 +- 4 files changed, 164 insertions(+), 4 deletions(-) create mode 100644 modules/cockroachdb/src/main/java/org/testcontainers/cockroachdb/CockroachContainer.java rename modules/cockroachdb/src/test/java/org/testcontainers/{junit/cockroachdb/SimpleCockroachDBTest.java => cockroachdb/CockroachContainerTest.java} (96%) diff --git a/docs/modules/databases/cockroachdb.md b/docs/modules/databases/cockroachdb.md index 258a51ea74c..2a219aeb275 100644 --- a/docs/modules/databases/cockroachdb.md +++ b/docs/modules/databases/cockroachdb.md @@ -7,7 +7,7 @@ Testcontainers module for [CockroachDB](https://hub.docker.com/r/cockroachdb/coc You can start a CockroachDB container instance from any Java application by using: -[Container definition](../../../modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java) inside_block:container +[Container definition](../../../modules/cockroachdb/src/test/java/org/testcontainers/cockroachdb/CockroachContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. diff --git a/modules/cockroachdb/src/main/java/org/testcontainers/cockroachdb/CockroachContainer.java b/modules/cockroachdb/src/main/java/org/testcontainers/cockroachdb/CockroachContainer.java new file mode 100644 index 00000000000..0d49e8cdaf7 --- /dev/null +++ b/modules/cockroachdb/src/main/java/org/testcontainers/cockroachdb/CockroachContainer.java @@ -0,0 +1,158 @@ +package org.testcontainers.cockroachdb; + +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.containers.wait.strategy.WaitAllStrategy; +import org.testcontainers.utility.ComparableVersion; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; + +/** + * Testcontainers implementation for CockroachDB. + *

    + * Supported image: {@code cockroachdb/cockroach} + *

    + * Exposed ports: + *

      + *
    • Database: 26257
    • + *
    • Console: 8080
    • + *
    + */ +public class CockroachContainer extends JdbcDatabaseContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("cockroachdb/cockroach"); + + public static final String NAME = "cockroach"; + + private static final String JDBC_DRIVER_CLASS_NAME = "org.postgresql.Driver"; + + private static final String JDBC_URL_PREFIX = "jdbc:postgresql"; + + private static final String TEST_QUERY_STRING = "SELECT 1"; + + private static final int REST_API_PORT = 8080; + + private static final int DB_PORT = 26257; + + private static final String FIRST_VERSION_WITH_ENV_VARS_SUPPORT = "22.1.0"; + + private String databaseName = "postgres"; + + private String username = "root"; + + private String password = ""; + + private boolean isVersionGreaterThanOrEqualTo221; + + public CockroachContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public CockroachContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + this.isVersionGreaterThanOrEqualTo221 = isVersionGreaterThanOrEqualTo221(dockerImageName); + + WaitAllStrategy waitStrategy = new WaitAllStrategy(); + waitStrategy.withStrategy( + Wait.forHttp("/health").forPort(REST_API_PORT).forStatusCode(200).withStartupTimeout(Duration.ofMinutes(1)) + ); + if (this.isVersionGreaterThanOrEqualTo221) { + waitStrategy.withStrategy(Wait.forSuccessfulCommand("[ -f ./init_success ] || { exit 1; }")); + } + + withExposedPorts(REST_API_PORT, DB_PORT); + waitingFor(waitStrategy); + withCommand("start-single-node --insecure"); + } + + @Override + protected void configure() { + withEnv("COCKROACH_USER", this.username); + withEnv("COCKROACH_PASSWORD", this.password); + if (this.password != null && !this.password.isEmpty()) { + withCommand("start-single-node"); + } + withEnv("COCKROACH_DATABASE", this.databaseName); + } + + @Override + public String getDriverClassName() { + return JDBC_DRIVER_CLASS_NAME; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return ( + JDBC_URL_PREFIX + + "://" + + getHost() + + ":" + + getMappedPort(DB_PORT) + + "/" + + databaseName + + additionalUrlParams + ); + } + + @Override + public final String getDatabaseName() { + return databaseName; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return TEST_QUERY_STRING; + } + + @Override + public CockroachContainer withUsername(String username) { + validateIfVersionSupportsUsernameOrPasswordOrDatabase("username"); + this.username = username; + return this; + } + + @Override + public CockroachContainer withPassword(String password) { + validateIfVersionSupportsUsernameOrPasswordOrDatabase("password"); + this.password = password; + return this; + } + + @Override + public CockroachContainer withDatabaseName(final String databaseName) { + validateIfVersionSupportsUsernameOrPasswordOrDatabase("databaseName"); + this.databaseName = databaseName; + return this; + } + + private boolean isVersionGreaterThanOrEqualTo221(DockerImageName dockerImageName) { + ComparableVersion version = new ComparableVersion(dockerImageName.getVersionPart().replaceFirst("v", "")); + return version.isGreaterThanOrEqualTo(FIRST_VERSION_WITH_ENV_VARS_SUPPORT); + } + + private void validateIfVersionSupportsUsernameOrPasswordOrDatabase(String parameter) { + if (!isVersionGreaterThanOrEqualTo221) { + throw new UnsupportedOperationException( + String.format("Setting a %s in not supported in the versions below 22.1.0", parameter) + ); + } + } + + @Override + protected void waitUntilContainerStarted() { + getWaitStrategy().waitUntilReady(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 f0c0cf123fb..855c37a03c8 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -17,7 +17,10 @@ *
  • Database: 26257
  • *
  • Console: 8080
  • * + * + * @deprecated use {@link org.testcontainers.cockroachdb.CockroachContainer} instead */ +@Deprecated public class CockroachContainer extends JdbcDatabaseContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("cockroachdb/cockroach"); diff --git a/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java b/modules/cockroachdb/src/test/java/org/testcontainers/cockroachdb/CockroachContainerTest.java similarity index 96% rename from modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java rename to modules/cockroachdb/src/test/java/org/testcontainers/cockroachdb/CockroachContainerTest.java index 5846c22a5db..3aba3d2eefd 100644 --- a/modules/cockroachdb/src/test/java/org/testcontainers/junit/cockroachdb/SimpleCockroachDBTest.java +++ b/modules/cockroachdb/src/test/java/org/testcontainers/cockroachdb/CockroachContainerTest.java @@ -1,8 +1,7 @@ -package org.testcontainers.junit.cockroachdb; +package org.testcontainers.cockroachdb; import org.junit.jupiter.api.Test; import org.testcontainers.CockroachDBTestImages; -import org.testcontainers.containers.CockroachContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.images.builder.Transferable; @@ -14,7 +13,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -class SimpleCockroachDBTest extends AbstractContainerDatabaseTest { +class CockroachContainerTest extends AbstractContainerDatabaseTest { static { // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing LogManager.getLogManager().getLogger("").setLevel(Level.OFF); From 5d16381f119b72a558eeb3b120f64b3f80e84c3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 12:48:56 -0600 Subject: [PATCH 0906/1224] Add GCloud container implementations under org.testcontainers.gcloud (#11081) --- docs/modules/gcloud.md | 42 +++++------ .../containers/BigQueryEmulatorContainer.java | 3 + .../containers/BigtableEmulatorContainer.java | 3 + .../DatastoreEmulatorContainer.java | 3 + .../FirestoreEmulatorContainer.java | 3 + .../containers/PubSubEmulatorContainer.java | 3 + .../containers/SpannerEmulatorContainer.java | 3 + .../gcloud/BigQueryEmulatorContainer.java | 44 +++++++++++ .../gcloud/BigtableEmulatorContainer.java | 53 ++++++++++++++ .../gcloud/DatastoreEmulatorContainer.java | 73 +++++++++++++++++++ .../gcloud/FirestoreEmulatorContainer.java | 64 ++++++++++++++++ .../gcloud/PubSubEmulatorContainer.java | 49 +++++++++++++ .../gcloud/SpannerEmulatorContainer.java | 50 +++++++++++++ .../BigQueryEmulatorContainerTest.java | 2 +- .../BigtableEmulatorContainerTest.java | 2 +- .../DatastoreEmulatorContainerTest.java | 2 +- .../FirestoreEmulatorContainerTest.java | 2 +- .../PubSubEmulatorContainerTest.java | 2 +- .../SpannerEmulatorContainerTest.java | 2 +- 19 files changed, 378 insertions(+), 27 deletions(-) create mode 100644 modules/gcloud/src/main/java/org/testcontainers/gcloud/BigQueryEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/gcloud/BigtableEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/gcloud/DatastoreEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/gcloud/FirestoreEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/gcloud/PubSubEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/gcloud/SpannerEmulatorContainer.java rename modules/gcloud/src/test/java/org/testcontainers/{containers => gcloud}/BigQueryEmulatorContainerTest.java (99%) rename modules/gcloud/src/test/java/org/testcontainers/{containers => gcloud}/BigtableEmulatorContainerTest.java (99%) rename modules/gcloud/src/test/java/org/testcontainers/{containers => gcloud}/DatastoreEmulatorContainerTest.java (98%) rename modules/gcloud/src/test/java/org/testcontainers/{containers => gcloud}/FirestoreEmulatorContainerTest.java (98%) rename modules/gcloud/src/test/java/org/testcontainers/{containers => gcloud}/PubSubEmulatorContainerTest.java (99%) rename modules/gcloud/src/test/java/org/testcontainers/{containers => gcloud}/SpannerEmulatorContainerTest.java (99%) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index 049931b3be1..dc86e7f4892 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -23,11 +23,11 @@ PubSubEmulatorContainer | [gcr.io/google.com/cloudsdktool/google-cloud-cli:emula Start BigQuery Emulator during a test: -[Starting a BigQuery Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java) inside_block:emulatorContainer +[Starting a BigQuery Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/BigQueryEmulatorContainerTest.java) inside_block:emulatorContainer -[Creating BigQuery Client](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java) inside_block:bigQueryClient +[Creating BigQuery Client](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/BigQueryEmulatorContainerTest.java) inside_block:bigQueryClient ### Bigtable @@ -35,19 +35,19 @@ Start BigQuery Emulator during a test: Start Bigtable Emulator during a test: -[Starting a Bigtable Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java) inside_block:emulatorContainer +[Starting a Bigtable Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/BigtableEmulatorContainerTest.java) inside_block:emulatorContainer Create a test Bigtable table in the Emulator: -[Create a test table](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java) inside_block:createTable +[Create a test table](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/BigtableEmulatorContainerTest.java) inside_block:createTable Test against the Emulator: -[Testing with a Bigtable Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java) inside_block:testWithEmulatorContainer +[Testing with a Bigtable Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/BigtableEmulatorContainerTest.java) inside_block:testWithEmulatorContainer ### Datastore @@ -55,18 +55,18 @@ Test against the Emulator: Start Datastore Emulator during a test: -[Starting a Datastore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:creatingDatastoreEmulatorContainer +[Starting a Datastore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/DatastoreEmulatorContainerTest.java) inside_block:creatingDatastoreEmulatorContainer And test against the Emulator: -[Testing with a Datastore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:startingDatastoreEmulatorContainer +[Testing with a Datastore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/DatastoreEmulatorContainerTest.java) inside_block:startingDatastoreEmulatorContainer See more examples: - * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) + * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/gcloud/DatastoreEmulatorContainerTest.java) * [With Spring Boot](https://github.com/saturnism/testcontainers-gcloud-examples/tree/main/springboot/datastore-example/src/test/java/com/example/springboot/datastore) ### Firestore @@ -74,18 +74,18 @@ See more examples: Start Firestore Emulator during a test: -[Starting a Firestore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java) inside_block:emulatorContainer +[Starting a Firestore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/FirestoreEmulatorContainerTest.java) inside_block:emulatorContainer And test against the Emulator: -[Testing with a Firestore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java) inside_block:testWithEmulatorContainer +[Testing with a Firestore Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/FirestoreEmulatorContainerTest.java) inside_block:testWithEmulatorContainer See more examples: - * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java) + * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/gcloud/FirestoreEmulatorContainerTest.java) * [With Spring Boot](https://github.com/saturnism/testcontainers-gcloud-examples/tree/main/springboot/firestore-example/src/test/java/com/example/springboot/firestore/FirestoreIntegrationTests.java) ### Spanner @@ -93,30 +93,30 @@ See more examples: Start Spanner Emulator during a test: -[Starting a Spanner Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) inside_block:emulatorContainer +[Starting a Spanner Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java) inside_block:emulatorContainer Create a test Spanner Instance in the Emulator: -[Create a test Spanner instance](../../modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) inside_block:createInstance +[Create a test Spanner instance](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java) inside_block:createInstance Create a test Database in the Emulator: -[Creating a test Spanner database](../../modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) inside_block:createDatabase +[Creating a test Spanner database](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java) inside_block:createDatabase And test against the Emulator: -[Testing with a Spanner Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) inside_block:testWithEmulatorContainer +[Testing with a Spanner Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java) inside_block:testWithEmulatorContainer See more examples: - * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java) + * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java) * [With Spring Boot](https://github.com/saturnism/testcontainers-gcloud-examples/tree/main/springboot/spanner-example/src/test/java/com/example/springboot/spanner/SpannerIntegrationTests.java) ### Pub/Sub @@ -124,30 +124,30 @@ See more examples: Start Pub/Sub Emulator during a test: -[Starting a Pub/Sub Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java) inside_block:emulatorContainer +[Starting a Pub/Sub Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java) inside_block:emulatorContainer Create a test Pub/Sub topic in the Emulator: -[Create a test topic](../../modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java) inside_block:createTopic +[Create a test topic](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java) inside_block:createTopic Create a test Pub/Sub subscription in the Emulator: -[Create a test subscription](../../modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java) inside_block:createSubscription +[Create a test subscription](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java) inside_block:createSubscription And test against the Emulator: -[Testing with a Pub/Sub Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java) inside_block:testWithEmulatorContainer +[Testing with a Pub/Sub Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java) inside_block:testWithEmulatorContainer See more examples: - * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java) + * [Full sample code](https://github.com/testcontainers/testcontainers-java/tree/main/modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java) * [With Spring Boot](https://github.com/saturnism/testcontainers-gcloud-examples/tree/main/springboot/pubsub-example/src/test/java/com/example/springboot/pubsub/PubSubIntegrationTests.java) ## Adding this module to your project dependencies diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java index 6831785b0a5..6590c6cab5b 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java @@ -7,7 +7,10 @@ *

    * Supported image: {@code ghcr.io/goccy/bigquery-emulator} *

    + * + * @deprecated use {@link org.testcontainers.gcloud.BigQueryEmulatorContainer} instead. */ +@Deprecated public class BigQueryEmulatorContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("ghcr.io/goccy/bigquery-emulator"); diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/BigtableEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/BigtableEmulatorContainer.java index e9bff52b781..288cd499e37 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/BigtableEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/BigtableEmulatorContainer.java @@ -9,7 +9,10 @@ * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} *

    * Default port is 9000. + * + * @deprecated use {@link org.testcontainers.gcloud.BigtableEmulatorContainer} instead. */ +@Deprecated public class BigtableEmulatorContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index eb86fa3932f..cbe27e303f4 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -9,7 +9,10 @@ * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} *

    * Default port is 8081. + * + * @deprecated use {@link org.testcontainers.gcloud.DatastoreEmulatorContainer} instead. */ +@Deprecated public class DatastoreEmulatorContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index db703cda5b4..3c8d12f82ad 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -9,7 +9,10 @@ * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} *

    * Default port is 8080. + * + * @deprecated use {@link org.testcontainers.gcloud.FirestoreEmulatorContainer} instead. */ +@Deprecated public class FirestoreEmulatorContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index c9b53596ab7..9f061873962 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -9,7 +9,10 @@ * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} *

    * Default port is 8085. + * + * @deprecated use {@link org.testcontainers.gcloud.PubSubEmulatorContainer} instead. */ +@Deprecated public class PubSubEmulatorContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java index eff48a8777c..76a95d4c4ac 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java @@ -7,7 +7,10 @@ * A Spanner container. Default ports: 9010 for GRPC and 9020 for HTTP. *

    * Supported image: {@code gcr.io/cloud-spanner-emulator/emulator} + * + * @deprecated use {@link org.testcontainers.gcloud.SpannerEmulatorContainer} instead. */ +@Deprecated public class SpannerEmulatorContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( diff --git a/modules/gcloud/src/main/java/org/testcontainers/gcloud/BigQueryEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/gcloud/BigQueryEmulatorContainer.java new file mode 100644 index 00000000000..b5d00bf374a --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/gcloud/BigQueryEmulatorContainer.java @@ -0,0 +1,44 @@ +package org.testcontainers.gcloud; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for BigQuery. + *

    + * Supported image: {@code ghcr.io/goccy/bigquery-emulator} + *

    + */ +public class BigQueryEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("ghcr.io/goccy/bigquery-emulator"); + + private static final int HTTP_PORT = 9050; + + private static final int GRPC_PORT = 9060; + + private static final String PROJECT_ID = "test-project"; + + public BigQueryEmulatorContainer(String image) { + this(DockerImageName.parse(image)); + } + + public BigQueryEmulatorContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + addExposedPorts(HTTP_PORT, GRPC_PORT); + withCommand("--project", PROJECT_ID); + } + + public String getEmulatorHttpEndpoint() { + return String.format("http://%s:%d", getHost(), getMappedPort(HTTP_PORT)); + } + + public Integer getEmulatorGrpcPort() { + return getMappedPort(GRPC_PORT); + } + + public String getProjectId() { + return PROJECT_ID; + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/gcloud/BigtableEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/gcloud/BigtableEmulatorContainer.java new file mode 100644 index 00000000000..b1e62ae0aa1 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/gcloud/BigtableEmulatorContainer.java @@ -0,0 +1,53 @@ +package org.testcontainers.gcloud; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * A Bigtable container that relies in google cloud sdk. + *

    + * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} + *

    + * Default port is 9000. + */ +public class BigtableEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/google-cloud-cli" + ); + + private static final DockerImageName CLOUD_SDK_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/cloud-sdk" + ); + + private static final String CMD = "gcloud beta emulators bigtable start --host-port 0.0.0.0:9000"; + + private static final int PORT = 9000; + + public BigtableEmulatorContainer(String image) { + this(DockerImageName.parse(image)); + } + + public BigtableEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, CLOUD_SDK_IMAGE_NAME); + + withExposedPorts(PORT); + setWaitStrategy(Wait.forLogMessage(".*running.*$", 1)); + withCommand("/bin/sh", "-c", CMD); + } + + /** + * @return a host:port pair corresponding to the address on which the emulator is + * reachable from the test host machine. Directly usable as a parameter to the + * com.google.cloud.ServiceOptions.Builder#setHost(java.lang.String) method. + */ + public String getEmulatorEndpoint() { + return getHost() + ":" + getEmulatorPort(); + } + + public int getEmulatorPort() { + return getMappedPort(PORT); + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/gcloud/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/gcloud/DatastoreEmulatorContainer.java new file mode 100644 index 00000000000..360aedce686 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/gcloud/DatastoreEmulatorContainer.java @@ -0,0 +1,73 @@ +package org.testcontainers.gcloud; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * A Datastore container that relies in google cloud sdk. + *

    + * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} + *

    + * Default port is 8081. + */ +public class DatastoreEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/google-cloud-cli" + ); + + private static final DockerImageName CLOUD_SDK_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/cloud-sdk" + ); + + private static final String PROJECT_ID = "test-project"; + + private static final String CMD = String.format( + "gcloud beta emulators datastore start --project %s --host-port 0.0.0.0:8081", + PROJECT_ID + ); + + private static final int HTTP_PORT = 8081; + + private String flags; + + public DatastoreEmulatorContainer(final String image) { + this(DockerImageName.parse(image)); + } + + public DatastoreEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, CLOUD_SDK_IMAGE_NAME); + + withExposedPorts(HTTP_PORT); + setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); + } + + @Override + protected void configure() { + String command = CMD; + if (this.flags != null && !this.flags.isEmpty()) { + command += " " + this.flags; + } + withCommand("/bin/sh", "-c", command); + } + + public DatastoreEmulatorContainer withFlags(String flags) { + this.flags = flags; + return this; + } + + /** + * @return a host:port pair corresponding to the address on which the emulator is + * reachable from the test host machine. Directly usable as a parameter to the + * com.google.cloud.ServiceOptions.Builder#setHost(java.lang.String) method. + */ + public String getEmulatorEndpoint() { + return getHost() + ":" + getMappedPort(HTTP_PORT); + } + + public String getProjectId() { + return PROJECT_ID; + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/gcloud/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/gcloud/FirestoreEmulatorContainer.java new file mode 100644 index 00000000000..140f7166307 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/gcloud/FirestoreEmulatorContainer.java @@ -0,0 +1,64 @@ +package org.testcontainers.gcloud; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * A Firestore container that relies in google cloud sdk. + *

    + * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} + *

    + * Default port is 8080. + */ +public class FirestoreEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/google-cloud-cli" + ); + + private static final DockerImageName CLOUD_SDK_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/cloud-sdk" + ); + + private static final String CMD = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; + + private static final int PORT = 8080; + + private String flags; + + public FirestoreEmulatorContainer(String image) { + this(DockerImageName.parse(image)); + } + + public FirestoreEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, CLOUD_SDK_IMAGE_NAME); + + withExposedPorts(PORT); + setWaitStrategy(Wait.forLogMessage(".*running.*$", 1)); + } + + @Override + protected void configure() { + String command = CMD; + if (this.flags != null && !this.flags.isEmpty()) { + command += " " + this.flags; + } + withCommand("/bin/sh", "-c", command); + } + + public FirestoreEmulatorContainer withFlags(String flags) { + this.flags = flags; + return this; + } + + /** + * @return a host:port pair corresponding to the address on which the emulator is + * reachable from the test host machine. Directly usable as a parameter to the + * com.google.cloud.ServiceOptions.Builder#setHost(java.lang.String) method. + */ + public String getEmulatorEndpoint() { + return getHost() + ":" + getMappedPort(8080); + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/gcloud/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/gcloud/PubSubEmulatorContainer.java new file mode 100644 index 00000000000..417ee8dc524 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/gcloud/PubSubEmulatorContainer.java @@ -0,0 +1,49 @@ +package org.testcontainers.gcloud; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * A PubSub container that relies in google cloud sdk. + *

    + * Supported images: {@code gcr.io/google.com/cloudsdktool/google-cloud-cli}, {@code gcr.io/google.com/cloudsdktool/cloud-sdk} + *

    + * Default port is 8085. + */ +public class PubSubEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/google-cloud-cli" + ); + + private static final DockerImageName CLOUD_SDK_IMAGE_NAME = DockerImageName.parse( + "gcr.io/google.com/cloudsdktool/cloud-sdk" + ); + + private static final String CMD = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; + + private static final int PORT = 8085; + + public PubSubEmulatorContainer(String image) { + this(DockerImageName.parse(image)); + } + + public PubSubEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, CLOUD_SDK_IMAGE_NAME); + + withExposedPorts(8085); + setWaitStrategy(Wait.forLogMessage(".*started.*$", 1)); + withCommand("/bin/sh", "-c", CMD); + } + + /** + * @return a host:port pair corresponding to the address on which the emulator is + * reachable from the test host machine. Directly usable as a parameter to the + * io.grpc.ManagedChannelBuilder#forTarget(java.lang.String) method. + */ + public String getEmulatorEndpoint() { + return getHost() + ":" + getMappedPort(PORT); + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/gcloud/SpannerEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/gcloud/SpannerEmulatorContainer.java new file mode 100644 index 00000000000..aa99f6be5f4 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/gcloud/SpannerEmulatorContainer.java @@ -0,0 +1,50 @@ +package org.testcontainers.gcloud; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +/** + * A Spanner container. Default ports: 9010 for GRPC and 9020 for HTTP. + *

    + * Supported image: {@code gcr.io/cloud-spanner-emulator/emulator} + */ +public class SpannerEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse( + "gcr.io/cloud-spanner-emulator/emulator" + ); + + private static final int GRPC_PORT = 9010; + + private static final int HTTP_PORT = 9020; + + public SpannerEmulatorContainer(String image) { + this(DockerImageName.parse(image)); + } + + public SpannerEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withExposedPorts(GRPC_PORT, HTTP_PORT); + setWaitStrategy(Wait.forLogMessage(".*Cloud Spanner emulator running\\..*", 1)); + } + + /** + * @return a host:port pair corresponding to the address on which the emulator's + * gRPC endpoint is reachable from the test host machine. Directly usable as a parameter to the + * com.google.cloud.spanner.SpannerOptions.Builder#setEmulatorHost(java.lang.String) method. + */ + public String getEmulatorGrpcEndpoint() { + return getHost() + ":" + getMappedPort(GRPC_PORT); + } + + /** + * @return a host:port pair corresponding to the address on which the emulator's + * HTTP REST endpoint is reachable from the test host machine. + */ + public String getEmulatorHttpEndpoint() { + return getHost() + ":" + getMappedPort(HTTP_PORT); + } +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/gcloud/BigQueryEmulatorContainerTest.java similarity index 99% rename from modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java rename to modules/gcloud/src/test/java/org/testcontainers/gcloud/BigQueryEmulatorContainerTest.java index 0337cd563b9..7d657830fa4 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/gcloud/BigQueryEmulatorContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.gcloud; import com.google.api.core.ApiFuture; import com.google.api.gax.core.NoCredentialsProvider; diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/gcloud/BigtableEmulatorContainerTest.java similarity index 99% rename from modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java rename to modules/gcloud/src/test/java/org/testcontainers/gcloud/BigtableEmulatorContainerTest.java index 8c84cfa79db..64f19a42df5 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigtableEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/gcloud/BigtableEmulatorContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.gcloud; import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/gcloud/DatastoreEmulatorContainerTest.java similarity index 98% rename from modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java rename to modules/gcloud/src/test/java/org/testcontainers/gcloud/DatastoreEmulatorContainerTest.java index 1b743f1e3cd..dceec1af215 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/gcloud/DatastoreEmulatorContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.gcloud; import com.google.cloud.NoCredentials; import com.google.cloud.ServiceOptions; diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/gcloud/FirestoreEmulatorContainerTest.java similarity index 98% rename from modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java rename to modules/gcloud/src/test/java/org/testcontainers/gcloud/FirestoreEmulatorContainerTest.java index 57494ef5535..2c3233388aa 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/gcloud/FirestoreEmulatorContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.gcloud; import com.google.api.core.ApiFuture; import com.google.cloud.NoCredentials; diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java similarity index 99% rename from modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java rename to modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java index 7d92c50a775..eb3ed0260ee 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/gcloud/PubSubEmulatorContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.gcloud; import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.grpc.GrpcTransportChannel; diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java similarity index 99% rename from modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java rename to modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java index 3d651ad6a53..2d6ac963882 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/gcloud/SpannerEmulatorContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.gcloud; import com.google.cloud.NoCredentials; import com.google.cloud.spanner.Database; From 0102bcbfe52eb15b61b934174ab4d5767ebb0260 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 12:52:09 -0600 Subject: [PATCH 0907/1224] Add LocalStack container implementation under org.testcontainers.localstack (#11082) --- docs/modules/localstack.md | 34 +-- .../localstack/LocalStackContainer.java | 3 + .../localstack/LocalStackContainer.java | 220 ++++++++++++++++++ .../localstack/LocalstackTestImages.java | 2 +- .../LocalStackContainerTest.java} | 120 ++-------- 5 files changed, 246 insertions(+), 133 deletions(-) create mode 100644 modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java rename modules/localstack/src/test/java/org/testcontainers/{containers/localstack/LocalstackContainerTest.java => localstack/LocalStackContainerTest.java} (81%) diff --git a/docs/modules/localstack.md b/docs/modules/localstack.md index 5527416e854..0afbea358c6 100644 --- a/docs/modules/localstack.md +++ b/docs/modules/localstack.md @@ -4,45 +4,21 @@ Testcontainers module for [LocalStack](http://localstack.cloud/), 'a fully funct ## Usage example -Running LocalStack as a stand-in for AWS S3 during a test: +You can start a LocalStack container instance from any Java application by using: -```java -DockerImageName localstackImage = DockerImageName.parse("localstack/localstack:3.5.0"); - -@Rule -public LocalStackContainer localstack = new LocalStackContainer(localstackImage) - .withServices(S3); -``` + +[Container creation](../../modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java) inside_block:container + ## Creating a client using AWS SDK -[AWS SDK V2](../../modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java) inside_block:with_aws_sdk_v2 +[AWS SDK V2](../../modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java) inside_block:with_aws_sdk_v2 Environment variables listed in [Localstack's README](https://github.com/localstack/localstack#configurations) may be used to customize Localstack's configuration. Use the `.withEnv(key, value)` method on `LocalStackContainer` to apply configuration settings. -## `HOSTNAME_EXTERNAL` and hostname-sensitive services - -Some Localstack APIs, such as SQS, require the container to be aware of the hostname that it is accessible on - for example, for construction of queue URLs in responses. - -Testcontainers will inform Localstack of the best hostname automatically, using the `HOSTNAME_EXTERNAL` environment variable: - -* when running the Localstack container directly without a custom network defined, it is expected that all calls to the container will be from the test host. As such, the container address will be used (typically localhost or the address where the Docker daemon is running). - - - [Localstack container running without a custom network](../../modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java) inside_block:without_network - - -* when running the Localstack container [with a custom network defined](/features/networking/#advanced-networking), it is expected that all calls to the container will be **from other containers on that network**. `HOSTNAME_EXTERNAL` will be set to the *last* network alias that has been configured for the Localstack container. - - - [Localstack container running with a custom network](../../modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java) inside_block:with_network - - -* Other usage scenarios, such as where the Localstack container is used from both the test host and containers on a custom network are not automatically supported. If you have this use case, you should set `HOSTNAME_EXTERNAL` manually. - ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: 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 c38d5a34728..083f642e11c 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 @@ -28,8 +28,11 @@ * Supported images: {@code localstack/localstack}, {@code localstack/localstack-pro} *

    * Exposed ports: 4566 + * + * @deprecated use {@link org.testcontainers.localstack.LocalStackContainer} instead. */ @Slf4j +@Deprecated public class LocalStackContainer extends GenericContainer { static final int PORT = 4566; diff --git a/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java b/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java new file mode 100644 index 00000000000..779f9a1e4ad --- /dev/null +++ b/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java @@ -0,0 +1,220 @@ +package org.testcontainers.localstack; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.extern.slf4j.Slf4j; +import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.net.InetAddress; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Testcontainers implementation for LocalStack. + *

    + * Supported images: {@code localstack/localstack}, {@code localstack/localstack-pro} + *

    + * Exposed ports: 4566 + */ +@Slf4j +public class LocalStackContainer extends GenericContainer { + + static final int PORT = 4566; + + private final List services = new ArrayList<>(); + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("localstack/localstack"); + + private static final DockerImageName LOCALSTACK_PRO_IMAGE_NAME = DockerImageName.parse("localstack/localstack-pro"); + + private static final String DEFAULT_REGION = "us-east-1"; + + private static final String DEFAULT_AWS_ACCESS_KEY_ID = "test"; + + private static final String DEFAULT_AWS_SECRET_ACCESS_KEY = "test"; + + private static final String STARTER_SCRIPT = "/testcontainers_start.sh"; + + /** + * @param dockerImageName image name to use for Localstack + */ + public LocalStackContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + /** + * @param dockerImageName image name to use for Localstack + */ + public LocalStackContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, LOCALSTACK_PRO_IMAGE_NAME); + + withExposedPorts(PORT); + withFileSystemBind(DockerClientFactory.instance().getRemoteDockerUnixSocketPath(), "/var/run/docker.sock"); + waitingFor(Wait.forLogMessage(".*Ready\\.\n", 1)); + withCreateContainerCmdModifier(cmd -> { + cmd.withEntrypoint( + "sh", + "-c", + "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT + ); + }); + } + + @Override + protected void configure() { + if (!services.isEmpty()) { + withEnv("SERVICES", String.join(",", this.services)); + } + } + + @Override + protected void containerIsStarting(InspectContainerResponse containerInfo) { + String command = "#!/bin/bash\n"; + command += "export LAMBDA_DOCKER_FLAGS=" + configureServiceContainerLabels("LAMBDA_DOCKER_FLAGS") + "\n"; + command += "export ECS_DOCKER_FLAGS=" + configureServiceContainerLabels("ECS_DOCKER_FLAGS") + "\n"; + command += "export EC2_DOCKER_FLAGS=" + configureServiceContainerLabels("EC2_DOCKER_FLAGS") + "\n"; + command += "export BATCH_DOCKER_FLAGS=" + configureServiceContainerLabels("BATCH_DOCKER_FLAGS") + "\n"; + command += "/usr/local/bin/docker-entrypoint.sh\n"; + copyFileToContainer(Transferable.of(command, 0777), STARTER_SCRIPT); + } + + /** + * Configure the LocalStack container to include the default testcontainers labels on all spawned lambda containers + * Necessary to properly clean up lambda containers even if the LocalStack container is killed before it gets the + * chance. + * @return the lambda container labels as a string + */ + private String configureServiceContainerLabels(String existingEnvFlagKey) { + String internalMarkerFlags = internalMarkerLabels(); + String existingFlags = getEnvMap().get(existingEnvFlagKey); + if (existingFlags != null) { + internalMarkerFlags = existingFlags + " " + internalMarkerFlags; + } + return "\"" + internalMarkerFlags + "\""; + } + + /** + * Provides a docker argument string including all default labels set on testcontainers containers (excluding reuse labels) + * @return Argument string in the format `-l key1=value1 -l key2=value2` + */ + private String internalMarkerLabels() { + return getContainerInfo() + .getConfig() + .getLabels() + .entrySet() + .stream() + .filter(entry -> entry.getKey().startsWith(DockerClientFactory.TESTCONTAINERS_LABEL)) + .filter(entry -> { + return ( + !entry.getKey().equals("org.testcontainers.hash") && + !entry.getKey().equals("org.testcontainers.copied_files.hash") + ); + }) + .map(entry -> String.format("-l %s=%s", entry.getKey(), entry.getValue())) + .collect(Collectors.joining(" ")); + } + + /** + * Declare a set of simulated AWS services that should be launched by this container. + * @param services one or more service names + * @return this container object + */ + public LocalStackContainer withServices(String... services) { + this.services.addAll(Arrays.asList(services)); + return self(); + } + + /** + * Provides an endpoint to communicate with LocalStack service. + * The provided endpoint should be set in the AWS Java SDK v2 when building a client, e.g.: + *

    S3Client s3 = S3Client
    +             .builder()
    +             .endpointOverride(localstack.getEndpoint())
    +             .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
    +             localstack.getAccessKey(), localstack.getSecretKey()
    +             )))
    +             .region(Region.of(localstack.getRegion()))
    +             .build()
    +             
    + *

    Please note that this method is only intended to be used for configuring AWS SDK clients + * that are running on the test host. If other containers need to call this one, they should be configured + * specifically to do so using a Docker network and appropriate addressing.

    + * + * @return an {@link URI} endpoint + */ + public URI getEndpoint() { + try { + final String address = getHost(); + // resolve IP address and use that as the endpoint so that path-style access is automatically used for S3 + String ipAddress = InetAddress.getByName(address).getHostAddress(); + return new URI("http://" + ipAddress + ":" + getMappedPort(PORT)); + } catch (UnknownHostException | URISyntaxException e) { + throw new IllegalStateException("Cannot obtain endpoint URL", e); + } + } + + /** + * Provides a default access key that is preconfigured to communicate with a given simulated service. + * AWS Access Key + * The access key can be used to construct AWS SDK v2 clients: + *
    S3Client s3 = S3Client
    +             .builder()
    +             .endpointOverride(localstack.getEndpointOverride(LocalStackContainer.Service.S3))
    +             .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
    +             localstack.getAccessKey(), localstack.getSecretKey()
    +             )))
    +             .region(Region.of(localstack.getRegion()))
    +             .build()
    +     
    + * @return a default access key + */ + public String getAccessKey() { + return this.getEnvMap().getOrDefault("AWS_ACCESS_KEY_ID", DEFAULT_AWS_ACCESS_KEY_ID); + } + + /** + * Provides a default secret key that is preconfigured to communicate with a given simulated service. + * AWS Secret Key + * The secret key can be used to construct AWS SDK v2 clients: + *
    S3Client s3 = S3Client
    +             .builder()
    +             .endpointOverride(localstack.getEndpointOverride(LocalStackContainer.Service.S3))
    +             .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
    +             localstack.getAccessKey(), localstack.getSecretKey()
    +             )))
    +             .region(Region.of(localstack.getRegion()))
    +             .build()
    +     
    + * @return a default secret key + */ + public String getSecretKey() { + return this.getEnvMap().getOrDefault("AWS_SECRET_ACCESS_KEY", DEFAULT_AWS_SECRET_ACCESS_KEY); + } + + /** + * Provides a default region that is preconfigured to communicate with a given simulated service. + * The region can be used to construct AWS SDK v2 clients: + *
    S3Client s3 = S3Client
    +             .builder()
    +             .endpointOverride(localstack.getEndpointOverride(LocalStackContainer.Service.S3))
    +             .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
    +             localstack.getAccessKey(), localstack.getSecretKey()
    +             )))
    +             .region(Region.of(localstack.getRegion()))
    +             .build()
    +     
    + * @return a default region + */ + public String getRegion() { + return this.getEnvMap().getOrDefault("DEFAULT_REGION", DEFAULT_REGION); + } +} diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java index bb9366c435b..9ca7dd6614f 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java +++ b/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackTestImages.java @@ -3,7 +3,7 @@ import org.testcontainers.utility.DockerImageName; public interface LocalstackTestImages { - DockerImageName LOCALSTACK_IMAGE = DockerImageName.parse("localstack/localstack:4.7.0"); + DockerImageName LOCALSTACK_IMAGE = DockerImageName.parse("localstack/localstack:4.9.2"); DockerImageName LOCALSTACK_0_10_IMAGE = LOCALSTACK_IMAGE.withTag("0.10.7"); diff --git a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java b/modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java similarity index 81% rename from modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java rename to modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java index fa102bbc13d..f3fa6a07457 100644 --- a/modules/localstack/src/test/java/org/testcontainers/containers/localstack/LocalstackContainerTest.java +++ b/modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers.localstack; +package org.testcontainers.localstack; import com.github.dockerjava.api.DockerClient; import lombok.extern.slf4j.Slf4j; @@ -11,8 +11,7 @@ import org.testcontainers.containers.Container; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; -import org.testcontainers.containers.localstack.LocalStackContainer.Service; -import org.testcontainers.utility.DockerImageName; +import org.testcontainers.containers.localstack.LocalstackTestImages; import software.amazon.awssdk.auth.credentials.AwsBasicCredentials; import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider; import software.amazon.awssdk.core.SdkBytes; @@ -64,17 +63,17 @@ import static org.assertj.core.api.Assertions.assertThat; @Slf4j -class LocalstackContainerTest { +class LocalStackContainerTest { @Nested class WithoutNetwork { @Test - void s3TestOverBridgeNetwork() throws IOException { + void s3TestOverBridgeNetwork() { try ( - // without_network { + // container { LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) - .withServices(Service.S3) + .withServices("s3") // } ) { localstack.start(); @@ -126,7 +125,7 @@ void sqsTestOverBridgeNetwork() { try ( LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) .withEnv("SQS_ENDPOINT_STRATEGY", "dynamic") - .withServices(Service.SQS) + .withServices("sqs") ) { localstack.start(); @@ -161,7 +160,7 @@ void sqsTestOverBridgeNetwork() { void cloudWatchLogsTestOverBridgeNetwork() { try ( LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) - .withServices(Service.CLOUDWATCHLOGS) + .withServices("logs") ) { localstack.start(); @@ -190,7 +189,7 @@ void cloudWatchLogsTestOverBridgeNetwork() { void kmsKeyCreationTest() { try ( LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) - .withServices(Service.KMS) + .withServices("kms") ) { localstack.start(); KmsClient kms = KmsClient @@ -221,9 +220,9 @@ void samePortIsExposedForAllServices() { localstack.start(); assertThat(localstack.getExposedPorts()).as("A single port is exposed").hasSize(1); - assertThat(localstack.getEndpointOverride(Service.SQS).toString()) + assertThat(localstack.getEndpoint().toString()) .as("Endpoint overrides are different") - .isEqualTo(localstack.getEndpointOverride(Service.S3).toString()); + .isEqualTo(localstack.getEndpoint().toString()); } } } @@ -234,12 +233,10 @@ class WithNetwork { // with_network { Network network = Network.newNetwork(); - LocalStackContainer localstackInDockerNetwork = new LocalStackContainer( - DockerImageName.parse("localstack/localstack:0.12.8") - ) + LocalStackContainer localstackInDockerNetwork = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) .withNetwork(network) - .withNetworkAliases("notthis", "localstack") // the last alias is used for HOSTNAME_EXTERNAL - .withServices(Service.S3, Service.SQS, Service.CLOUDWATCHLOGS); + .withNetworkAliases("localstack") + .withServices("s3", "sqs", "logs"); // } GenericContainer awsCliInDockerNetwork = new GenericContainer<>(LocalstackTestImages.AWS_CLI_IMAGE) @@ -262,14 +259,6 @@ void tearDown() { localstackInDockerNetwork.stop(); } - @Test - void localstackHostEnVarIsSet() { - localstackInDockerNetwork.start(); - awsCliInDockerNetwork.start(); - - assertThat(localstackInDockerNetwork.getEnvMap().get("HOSTNAME_EXTERNAL")).isEqualTo("localstack"); - } - @Test void s3TestOverDockerNetwork() throws Exception { runAwsCliAgainstDockerNetworkContainer( @@ -285,20 +274,16 @@ void sqsTestOverDockerNetwork() throws Exception { "sqs create-queue --queue-name baz" ); - assertThat(queueCreationResponse) - .as("Created queue has external hostname URL") - .contains("http://localstack:" + LocalStackContainer.PORT); - runAwsCliAgainstDockerNetworkContainer( String.format( - "sqs send-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz --message-body test", + "sqs send-message --endpoint http://localstack:%d --queue-url http://sqs.eu-west-1.localhost.localstack.cloud:%d/000000000000/baz --message-body test", LocalStackContainer.PORT, LocalStackContainer.PORT ) ); final String message = runAwsCliAgainstDockerNetworkContainer( String.format( - "sqs receive-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz", + "sqs receive-message --endpoint http://localstack:%d --queue-url http://sqs.eu-west-1.localhost.localstack.cloud:%d/000000000000/baz", LocalStackContainer.PORT, LocalStackContainer.PORT ) @@ -338,7 +323,7 @@ void s3EndpointHasProperRegion() { // with_region { LocalStackContainer localstack = new LocalStackContainer(LocalstackTestImages.LOCALSTACK_IMAGE) .withEnv("DEFAULT_REGION", "eu-west-1") - .withServices(Service.S3); + .withServices("s3"); // } ) { localstack.start(); @@ -370,77 +355,6 @@ void s3ServiceStartLazily() { assertThat(s3.listBuckets().buckets()).as("S3 Service is started lazily").isEmpty(); } } - - @Test - void sqsTestOverDockerNetwork() throws Exception { - try ( - Network network = Network.newNetwork(); - LocalStackContainer localstack = new LocalStackContainer( - DockerImageName.parse("localstack/localstack:2.0") - ) - .withNetwork(network) - .withNetworkAliases("localstack"); - GenericContainer awsCliInDockerNetwork = new GenericContainer<>(LocalstackTestImages.AWS_CLI_IMAGE) - .withNetwork(network) - .withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("tail")) - .withCommand(" -f /dev/null") - .withEnv("AWS_ACCESS_KEY_ID", "accesskey") - .withEnv("AWS_SECRET_ACCESS_KEY", "secretkey") - .withEnv("AWS_REGION", "eu-west-1") - ) { - localstack.start(); - awsCliInDockerNetwork.start(); - - assertThat(localstack.getEnvMap().get("LOCALSTACK_HOST")).isEqualTo("localstack"); - - final String queueCreationResponse = runAwsCliAgainstDockerNetworkContainer( - "sqs create-queue --queue-name baz", - awsCliInDockerNetwork - ); - - assertThat(queueCreationResponse) - .as("Created queue has external hostname URL") - .contains("http://localstack:" + LocalStackContainer.PORT); - - runAwsCliAgainstDockerNetworkContainer( - String.format( - "sqs send-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz --message-body test", - LocalStackContainer.PORT, - LocalStackContainer.PORT - ), - awsCliInDockerNetwork - ); - final String message = runAwsCliAgainstDockerNetworkContainer( - String.format( - "sqs receive-message --endpoint http://localstack:%d --queue-url http://localstack:%d/queue/baz", - LocalStackContainer.PORT, - LocalStackContainer.PORT - ), - awsCliInDockerNetwork - ); - - assertThat(message).as("the sent message can be received").contains("\"Body\": \"test\""); - } - } - - private String runAwsCliAgainstDockerNetworkContainer( - String command, - GenericContainer awsCliInDockerNetwork - ) throws Exception { - final String[] commandParts = String - .format( - "/usr/local/bin/aws --region eu-west-1 %s --endpoint-url http://localstack:%d --no-verify-ssl", - command, - LocalStackContainer.PORT - ) - .split(" "); - final Container.ExecResult execResult = awsCliInDockerNetwork.execInContainer(commandParts); - assertThat(execResult.getExitCode()).isEqualTo(0); - - final String logs = execResult.getStdout() + execResult.getStderr(); - log.info(logs); - return logs; - } } @Nested From 565e73c8e6c9a5e90453b990d41b4e792b86011f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 14:40:13 -0600 Subject: [PATCH 0908/1224] Add MariaDB container implementation under org.testcontainers.mariadb (#11083) --- docs/modules/databases/mariadb.md | 2 +- .../containers/MariaDBContainer.java | 3 + .../mariadb/MariaDBContainer.java | 136 ++++++++++++++++++ .../MariaDBContainerTest.java} | 21 ++- 4 files changed, 150 insertions(+), 12 deletions(-) create mode 100644 modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java rename modules/mariadb/src/test/java/org/testcontainers/{junit/mariadb/SimpleMariaDBTest.java => mariadb/MariaDBContainerTest.java} (85%) diff --git a/docs/modules/databases/mariadb.md b/docs/modules/databases/mariadb.md index 2968c7a7e13..01d66139f1a 100644 --- a/docs/modules/databases/mariadb.md +++ b/docs/modules/databases/mariadb.md @@ -7,7 +7,7 @@ Testcontainers module for [MariaDB](https://hub.docker.com/_/mariadb) You can start a MySQL container instance from any Java application by using: -[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java) inside_block:container +[Container definition](../../../modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. 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 bff0faf9d03..6c9ffda7722 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/containers/MariaDBContainer.java @@ -12,7 +12,10 @@ * Supported image: {@code mariadb} *

    * Exposed ports: 3306 + * + * @deprecated use {@link org.testcontainers.mariadb.MariaDBContainer} instead. */ +@Deprecated public class MariaDBContainer> extends JdbcDatabaseContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mariadb"); diff --git a/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java new file mode 100644 index 00000000000..957754c946b --- /dev/null +++ b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java @@ -0,0 +1,136 @@ +package org.testcontainers.mariadb; + +import com.google.common.collect.Sets; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.util.Set; + +/** + * Testcontainers implementation for MariaDB. + *

    + * Supported image: {@code mariadb} + *

    + * Exposed ports: 3306 + */ +public class MariaDBContainer extends JdbcDatabaseContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mariadb"); + + public static final String NAME = "mariadb"; + + static final String DEFAULT_USER = "test"; + + static final String DEFAULT_PASSWORD = "test"; + + static final Integer MARIADB_PORT = 3306; + + private String databaseName = "test"; + + private String username = DEFAULT_USER; + + private String password = DEFAULT_PASSWORD; + + private static final String MARIADB_ROOT_USER = "root"; + + private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF"; + + public MariaDBContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public MariaDBContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + addExposedPort(MARIADB_PORT); + } + + @Override + public Set getLivenessCheckPortNumbers() { + return Sets.newHashSet(MARIADB_PORT); + } + + @Override + protected void configure() { + optionallyMapResourceParameterAsVolume( + MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, + "/etc/mysql/conf.d", + "mariadb-default-conf", + Transferable.DEFAULT_DIR_MODE + ); + + addEnv("MYSQL_DATABASE", databaseName); + + if (!MARIADB_ROOT_USER.equalsIgnoreCase(this.username)) { + addEnv("MYSQL_USER", username); + } + if (password != null && !password.isEmpty()) { + addEnv("MYSQL_PASSWORD", password); + addEnv("MYSQL_ROOT_PASSWORD", password); + } else if (MARIADB_ROOT_USER.equalsIgnoreCase(username)) { + addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes"); + } else { + throw new ContainerLaunchException("Empty password can be used only with the root user"); + } + setStartupAttempts(3); + } + + @Override + public String getDriverClassName() { + return "org.mariadb.jdbc.Driver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return ( + "jdbc:mariadb://" + getHost() + ":" + getMappedPort(MARIADB_PORT) + "/" + databaseName + additionalUrlParams + ); + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return "SELECT 1"; + } + + public MariaDBContainer withConfigurationOverride(String s) { + parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s); + return self(); + } + + @Override + public MariaDBContainer withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + @Override + public MariaDBContainer withUsername(final String username) { + this.username = username; + return self(); + } + + @Override + public MariaDBContainer withPassword(final String password) { + this.password = password; + return self(); + } +} diff --git a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java b/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java similarity index 85% rename from modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java rename to modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java index 4e88c8981eb..99348f9168d 100644 --- a/modules/mariadb/src/test/java/org/testcontainers/junit/mariadb/SimpleMariaDBTest.java +++ b/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBContainerTest.java @@ -1,9 +1,8 @@ -package org.testcontainers.junit.mariadb; +package org.testcontainers.mariadb; import org.apache.commons.lang3.SystemUtils; import org.junit.jupiter.api.Test; import org.testcontainers.MariaDBTestImages; -import org.testcontainers.containers.MariaDBContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.io.File; @@ -20,12 +19,12 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assumptions.assumeThat; -class SimpleMariaDBTest extends AbstractContainerDatabaseTest { +class MariaDBContainerTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - MariaDBContainer mariadb = new MariaDBContainer<>("mariadb:10.3.39") + MariaDBContainer mariadb = new MariaDBContainer("mariadb:10.3.39") // } ) { mariadb.start(); @@ -40,7 +39,7 @@ void testSimple() throws SQLException { @Test void testSpecificVersion() throws SQLException { try ( - MariaDBContainer mariadbOldVersion = new MariaDBContainer<>( + MariaDBContainer mariadbOldVersion = new MariaDBContainer( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") ) ) { @@ -60,7 +59,7 @@ void testMariaDBWithCustomIniFile() throws SQLException { assumeThat(SystemUtils.IS_OS_WINDOWS).isFalse(); try ( - MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>( + MariaDBContainer mariadbCustomConfig = new MariaDBContainer( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") ) .withConfigurationOverride("somepath/mariadb_conf_override") @@ -74,7 +73,7 @@ void testMariaDBWithCustomIniFile() throws SQLException { @Test void testMariaDBWithCommandOverride() throws SQLException { try ( - MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE) + MariaDBContainer mariadbCustomConfig = new MariaDBContainer(MariaDBTestImages.MARIADB_IMAGE) .withCommand("mysqld --auto_increment_increment=10") ) { mariadbCustomConfig.start(); @@ -87,7 +86,7 @@ void testMariaDBWithCommandOverride() throws SQLException { @Test void testWithAdditionalUrlParamInJdbcUrl() { - MariaDBContainer mariaDBContainer = new MariaDBContainer<>(MariaDBTestImages.MARIADB_IMAGE) + MariaDBContainer mariaDBContainer = new MariaDBContainer(MariaDBTestImages.MARIADB_IMAGE) .withUrlParam("connectTimeout", "40000") .withUrlParam("rewriteBatchedStatements", "true"); @@ -108,7 +107,7 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception { assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue(); try ( - MariaDBContainer mariadbCustomConfig = new MariaDBContainer<>( + MariaDBContainer mariadbCustomConfig = new MariaDBContainer( MariaDBTestImages.MARIADB_IMAGE.withTag("10.3.39") ) .withConfigurationOverride("somepath/mariadb_conf_override") @@ -136,7 +135,7 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception { @Test void testEmptyPasswordWithRootUser() throws SQLException { - try (MariaDBContainer mysql = new MariaDBContainer<>("mariadb:11.2.4").withUsername("root")) { + try (MariaDBContainer mysql = new MariaDBContainer("mariadb:11.2.4").withUsername("root")) { mysql.start(); ResultSet resultSet = performQuery(mysql, "SELECT 1"); @@ -146,7 +145,7 @@ void testEmptyPasswordWithRootUser() throws SQLException { } } - private void assertThatCustomIniFileWasUsed(MariaDBContainer mariadb) throws SQLException { + private void assertThatCustomIniFileWasUsed(MariaDBContainer mariadb) throws SQLException { try (ResultSet resultSet = performQuery(mariadb, "SELECT @@GLOBAL.innodb_max_undo_log_size")) { long result = resultSet.getLong(1); assertThat(result) From 4cda0841333d385f5d4504b42517322239e2f071 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 14:40:24 -0600 Subject: [PATCH 0909/1224] Add MockServer container implementation under org.testcontainers.mockserver (#11084) --- docs/modules/mockserver.md | 4 +- .../containers/MockServerContainer.java | 4 ++ .../mockserver/MockServerContainer.java | 49 +++++++++++++++++ .../MockServerContainerRuleTest.java | 55 ------------------- .../MockServerContainerTest.java | 13 +++-- 5 files changed, 63 insertions(+), 62 deletions(-) create mode 100644 modules/mockserver/src/main/java/org/testcontainers/mockserver/MockServerContainer.java delete mode 100644 modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java rename modules/mockserver/src/test/java/org/testcontainers/{containers => mockserver}/MockServerContainerTest.java (92%) diff --git a/docs/modules/mockserver.md b/docs/modules/mockserver.md index c739278acff..fc4402ae9e8 100644 --- a/docs/modules/mockserver.md +++ b/docs/modules/mockserver.md @@ -7,13 +7,13 @@ Mock Server can be used to mock HTTP services by matching requests against user- The following example shows how to start Mockserver. -[Creating a MockServer container](../../modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java) inside_block:creatingProxy +[Creating a MockServer container](../../modules/mockserver/src/test/java/org/testcontainers/mockserver/MockServerContainerTest.java) inside_block:creatingProxy And how to set a simple expectation using the Java MockServerClient. -[Setting a simple expectation](../../modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java) inside_block:testSimpleExpectation +[Setting a simple expectation](../../modules/mockserver/src/test/java/org/testcontainers/mockserver/MockServerContainerTest.java) inside_block:testSimpleExpectation ## Adding this module to your project dependencies 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 00937214445..f69c5e86a6d 100644 --- a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java +++ b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java @@ -4,7 +4,11 @@ import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; +/** + * @deprecated use {@link org.testcontainers.mockserver.MockServerContainer} instead. + */ @Slf4j +@Deprecated public class MockServerContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("jamesdbloom/mockserver"); diff --git a/modules/mockserver/src/main/java/org/testcontainers/mockserver/MockServerContainer.java b/modules/mockserver/src/main/java/org/testcontainers/mockserver/MockServerContainer.java new file mode 100644 index 00000000000..cbfcbc9fd66 --- /dev/null +++ b/modules/mockserver/src/main/java/org/testcontainers/mockserver/MockServerContainer.java @@ -0,0 +1,49 @@ +package org.testcontainers.mockserver; + +import lombok.extern.slf4j.Slf4j; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; + +@Slf4j +public class MockServerContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("jamesdbloom/mockserver"); + + private static final String DEFAULT_TAG = "mockserver-5.5.4"; + + @Deprecated + public static final String VERSION = DEFAULT_TAG; + + public static final int PORT = 1080; + + /** + * @deprecated use {@link #MockServerContainer(DockerImageName)} instead + */ + @Deprecated + public MockServerContainer(String version) { + this(DEFAULT_IMAGE_NAME.withTag("mockserver-" + version)); + } + + public MockServerContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, DockerImageName.parse("mockserver/mockserver")); + + waitingFor(Wait.forLogMessage(".*started on port: " + PORT + ".*", 1)); + + withCommand("-serverPort " + PORT); + addExposedPorts(PORT); + } + + public String getEndpoint() { + return String.format("http://%s:%d", getHost(), getMappedPort(PORT)); + } + + public String getSecureEndpoint() { + return String.format("https://%s:%d", getHost(), getMappedPort(PORT)); + } + + public Integer getServerPort() { + return getMappedPort(PORT); + } +} diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java b/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java deleted file mode 100644 index c01cad49479..00000000000 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerRuleTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.testcontainers.containers; - -import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.mockserver.client.MockServerClient; -import org.testcontainers.utility.DockerImageName; - -import static io.restassured.RestAssured.given; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockserver.model.HttpRequest.request; -import static org.mockserver.model.HttpResponse.response; - -class MockServerContainerRuleTest { - - // creatingProxy { - private static final DockerImageName MOCKSERVER_IMAGE = DockerImageName - .parse("mockserver/mockserver") - .withTag("mockserver-" + MockServerClient.class.getPackage().getImplementationVersion()); - - private static MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE); - - // } - - @BeforeAll - static void setup() { - mockServer.start(); - } - - @AfterAll - static void tearDown() { - mockServer.stop(); - } - - @Test - void shouldReturnExpectation() { - // testSimpleExpectation { - try ( - MockServerClient mockServerClient = new MockServerClient(mockServer.getHost(), mockServer.getServerPort()) - ) { - mockServerClient - .when(request().withPath("/person").withQueryStringParameter("name", "peter")) - .respond(response().withBody("Peter the person!")); - - // ...a GET request to '/person?name=peter' returns "Peter the person!" - - assertThat( - given().baseUri(mockServer.getEndpoint()).get("/person?name=peter").then().extract().body().asString() - ) - .as("Expectation returns expected response body") - .contains("Peter the person"); - } - // } - } -} diff --git a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java b/modules/mockserver/src/test/java/org/testcontainers/mockserver/MockServerContainerTest.java similarity index 92% rename from modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java rename to modules/mockserver/src/test/java/org/testcontainers/mockserver/MockServerContainerTest.java index b1fca9ce514..53325234b8b 100644 --- a/modules/mockserver/src/test/java/org/testcontainers/containers/MockServerContainerTest.java +++ b/modules/mockserver/src/test/java/org/testcontainers/mockserver/MockServerContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.mockserver; import io.restassured.config.RestAssuredConfig; import io.restassured.config.SSLConfig; @@ -22,8 +22,11 @@ class MockServerContainerTest { .withTag("mockserver-" + MockServerClient.class.getPackage().getImplementationVersion()); @Test - void shouldCallActualMockserverVersion() throws Exception { - try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) { + void shouldCallActualMockserverVersion() { + try ( // creatingProxy { + MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE) + // } + ) { mockServer.start(); String expectedBody = "Hello World!"; @@ -41,7 +44,7 @@ void shouldCallActualMockserverVersion() throws Exception { } @Test - void shouldCallMockserverUsingTlsProtocol() throws Exception { + void shouldCallMockserverUsingTlsProtocol() { try (MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE)) { mockServer.start(); @@ -63,7 +66,7 @@ void shouldCallMockserverUsingTlsProtocol() throws Exception { } @Test - void shouldCallMockserverUsingMutualTlsProtocol() throws Exception { + void shouldCallMockserverUsingMutualTlsProtocol() { try ( MockServerContainer mockServer = new MockServerContainer(MOCKSERVER_IMAGE) .withEnv("MOCKSERVER_TLS_MUTUAL_AUTHENTICATION_REQUIRED", "true") From 8e508b9c8fb0c6b9f4495a05074ed9e850b63cc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 14:40:35 -0600 Subject: [PATCH 0910/1224] Add MSSQLServer container implementation under org.testcontainers.mssqlserver (#11085) --- docs/modules/databases/mssqlserver.md | 2 +- .../containers/MSSQLServerContainer.java | 3 + .../mssqlserver/MSSQLServerContainer.java | 156 ++++++++++++++++++ .../CustomizableMSSQLServerTest.java | 32 ---- .../CustomPasswordMSSQLServerTest.java | 2 +- .../MSSQLServerContainerTest.java} | 32 +++- 6 files changed, 184 insertions(+), 43 deletions(-) create mode 100644 modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLServerContainer.java delete mode 100644 modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java rename modules/mssqlserver/src/test/java/org/testcontainers/{junit => }/mssqlserver/CustomPasswordMSSQLServerTest.java (98%) rename modules/mssqlserver/src/test/java/org/testcontainers/{junit/mssqlserver/SimpleMSSQLServerTest.java => mssqlserver/MSSQLServerContainerTest.java} (70%) diff --git a/docs/modules/databases/mssqlserver.md b/docs/modules/databases/mssqlserver.md index f12365aaa18..bde933b1e72 100644 --- a/docs/modules/databases/mssqlserver.md +++ b/docs/modules/databases/mssqlserver.md @@ -7,7 +7,7 @@ Testcontainers module for [MS SQL Server](https://mcr.microsoft.com/en-us/artifa You can start a MS SQL Server container instance from any Java application by using: -[Container definition](../../../modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java) inside_block:container +[Container definition](../../../modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLServerContainerTest.java) inside_block:container !!! warning "EULA Acceptance" 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 10ccbff2c36..a30de6549ba 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -13,7 +13,10 @@ * Supported image: {@code mcr.microsoft.com/mssql/server} *

    * Exposed ports: 1433 + * + * @deprecated use {@link org.testcontainers.mssqlserver.MSSQLServerContainer} instead. */ +@Deprecated public class MSSQLServerContainer> extends JdbcDatabaseContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mcr.microsoft.com/mssql/server"); diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLServerContainer.java new file mode 100644 index 00000000000..6ad74ea7e72 --- /dev/null +++ b/modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLServerContainer.java @@ -0,0 +1,156 @@ +package org.testcontainers.mssqlserver; + +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.LicenseAcceptance; + +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Stream; + +/** + * Testcontainers implementation for Microsoft SQL Server. + *

    + * Supported image: {@code mcr.microsoft.com/mssql/server} + *

    + * Exposed ports: 1433 + */ +public class MSSQLServerContainer extends JdbcDatabaseContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mcr.microsoft.com/mssql/server"); + + public static final String NAME = "sqlserver"; + + public static final String IMAGE = DEFAULT_IMAGE_NAME.getUnversionedPart(); + + public static final Integer MS_SQL_SERVER_PORT = 1433; + + static final String DEFAULT_USER = "sa"; + + static final String DEFAULT_PASSWORD = "A_Str0ng_Required_Password"; + + private String password = DEFAULT_PASSWORD; + + private static final int DEFAULT_STARTUP_TIMEOUT_SECONDS = 240; + + private static final int DEFAULT_CONNECT_TIMEOUT_SECONDS = 240; + + private static final Pattern[] PASSWORD_CATEGORY_VALIDATION_PATTERNS = new Pattern[] { + Pattern.compile("[A-Z]+"), + Pattern.compile("[a-z]+"), + Pattern.compile("[0-9]+"), + Pattern.compile("[^a-zA-Z0-9]+", Pattern.CASE_INSENSITIVE), + }; + + public MSSQLServerContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public MSSQLServerContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withStartupTimeoutSeconds(DEFAULT_STARTUP_TIMEOUT_SECONDS); + withConnectTimeoutSeconds(DEFAULT_CONNECT_TIMEOUT_SECONDS); + addExposedPort(MS_SQL_SERVER_PORT); + } + + @Override + public Set getLivenessCheckPortNumbers() { + return super.getLivenessCheckPortNumbers(); + } + + @Override + protected void configure() { + // If license was not accepted programmatically, check if it was accepted via resource file + if (!getEnvMap().containsKey("ACCEPT_EULA")) { + LicenseAcceptance.assertLicenseAccepted(this.getDockerImageName()); + acceptLicense(); + } + + addEnv("MSSQL_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 MSSQLServerContainer acceptLicense() { + addEnv("ACCEPT_EULA", "Y"); + return self(); + } + + @Override + public String getDriverClassName() { + return "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + } + + @Override + protected String constructUrlForConnection(String queryString) { + // The JDBC driver of MS SQL Server enables encryption by default for versions > 10.1.0. + // We need to disable it by default to be able to use the container without having to pass extra params. + // See https://github.com/microsoft/mssql-jdbc/releases/tag/v10.1.0 + if (urlParameters.keySet().stream().map(String::toLowerCase).noneMatch("encrypt"::equals)) { + urlParameters.put("encrypt", "false"); + } + return super.constructUrlForConnection(queryString); + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters(";", ";"); + return "jdbc:sqlserver://" + getHost() + ":" + getMappedPort(MS_SQL_SERVER_PORT) + additionalUrlParams; + } + + @Override + public String getUsername() { + return DEFAULT_USER; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return "SELECT 1"; + } + + @Override + public MSSQLServerContainer withPassword(final String password) { + checkPasswordStrength(password); + this.password = password; + return self(); + } + + private void checkPasswordStrength(String password) { + if (password == null) { + throw new IllegalArgumentException("Null password is not allowed"); + } + + if (password.length() < 8) { + throw new IllegalArgumentException("Password should be at least 8 characters long"); + } + + if (password.length() > 128) { + throw new IllegalArgumentException("Password can be up to 128 characters long"); + } + + long satisfiedCategories = Stream + .of(PASSWORD_CATEGORY_VALIDATION_PATTERNS) + .filter(p -> p.matcher(password).find()) + .count(); + + if (satisfiedCategories < 3) { + throw new IllegalArgumentException( + "Password must contain characters from three of the following four categories:\n" + + " - Latin uppercase letters (A through Z)\n" + + " - Latin lowercase letters (a through z)\n" + + " - Base 10 digits (0 through 9)\n" + + " - Non-alphanumeric characters such as: exclamation point (!), dollar sign ($), number sign (#), " + + "or percent (%)." + ); + } + } +} 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 deleted file mode 100644 index 630b6c5356c..00000000000 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomizableMSSQLServerTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.testcontainers.junit.mssqlserver; - -import org.junit.jupiter.api.Test; -import org.testcontainers.containers.MSSQLServerContainer; -import org.testcontainers.db.AbstractContainerDatabaseTest; -import org.testcontainers.utility.DockerImageName; - -import java.sql.ResultSet; -import java.sql.SQLException; - -import static org.assertj.core.api.Assertions.assertThat; - -class CustomizableMSSQLServerTest extends AbstractContainerDatabaseTest { - - private static final String STRONG_PASSWORD = "myStrong(!)Password"; - - @Test - void testSqlServerConnection() throws SQLException { - try ( - MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>( - DockerImageName.parse("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04") - ) - .withPassword(STRONG_PASSWORD) - ) { - mssqlServerContainer.start(); - - ResultSet resultSet = performQuery(mssqlServerContainer, mssqlServerContainer.getTestQueryString()); - int resultSetInt = resultSet.getInt(1); - assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); - } - } -} diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/CustomPasswordMSSQLServerTest.java similarity index 98% rename from modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java rename to modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/CustomPasswordMSSQLServerTest.java index 06aa1dc4a61..faaaabd7d01 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/CustomPasswordMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/CustomPasswordMSSQLServerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.junit.mssqlserver; +package org.testcontainers.mssqlserver; import org.apache.commons.lang3.RandomStringUtils; import org.junit.jupiter.params.ParameterizedTest; diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLServerContainerTest.java similarity index 70% rename from modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java rename to modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLServerContainerTest.java index 0d995911893..52269f11b9e 100644 --- a/modules/mssqlserver/src/test/java/org/testcontainers/junit/mssqlserver/SimpleMSSQLServerTest.java +++ b/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLServerContainerTest.java @@ -1,9 +1,9 @@ -package org.testcontainers.junit.mssqlserver; +package org.testcontainers.mssqlserver; import org.junit.jupiter.api.Test; import org.testcontainers.MSSQLServerTestImages; -import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; +import org.testcontainers.utility.DockerImageName; import java.sql.ResultSet; import java.sql.SQLException; @@ -13,12 +13,12 @@ import static org.assertj.core.api.Assertions.assertThat; -class SimpleMSSQLServerTest extends AbstractContainerDatabaseTest { +class MSSQLServerContainerTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>( + MSSQLServerContainer mssqlServer = new MSSQLServerContainer( "mcr.microsoft.com/mssql/server:2022-CU20-ubuntu-22.04" ) .acceptLicense() @@ -36,7 +36,7 @@ void testSimple() throws SQLException { @Test void testWithAdditionalUrlParamInJdbcUrl() { try ( - MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE) + MSSQLServerContainer mssqlServer = new MSSQLServerContainer(MSSQLServerTestImages.MSSQL_SERVER_IMAGE) .withUrlParam("integratedSecurity", "false") .withUrlParam("applicationName", "MyApp") ) { @@ -49,9 +49,7 @@ void testWithAdditionalUrlParamInJdbcUrl() { @Test void testSetupDatabase() throws SQLException { - try ( - MSSQLServerContainer mssqlServer = new MSSQLServerContainer<>(MSSQLServerTestImages.MSSQL_SERVER_IMAGE) - ) { + try (MSSQLServerContainer mssqlServer = new MSSQLServerContainer(MSSQLServerTestImages.MSSQL_SERVER_IMAGE)) { mssqlServer.start(); DataSource ds = getDataSource(mssqlServer); Statement statement = ds.getConnection().createStatement(); @@ -70,7 +68,23 @@ void testSetupDatabase() throws SQLException { } } - private void assertHasCorrectExposedAndLivenessCheckPorts(MSSQLServerContainer mssqlServer) { + @Test + void testSqlServerConnection() throws SQLException { + try ( + MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer( + DockerImageName.parse("mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04") + ) + .withPassword("myStrong(!)Password") + ) { + mssqlServerContainer.start(); + + ResultSet resultSet = performQuery(mssqlServerContainer, mssqlServerContainer.getTestQueryString()); + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); + } + } + + private void assertHasCorrectExposedAndLivenessCheckPorts(MSSQLServerContainer mssqlServer) { assertThat(mssqlServer.getExposedPorts()).containsExactly(MSSQLServerContainer.MS_SQL_SERVER_PORT); assertThat(mssqlServer.getLivenessCheckPortNumbers()) .containsExactly(mssqlServer.getMappedPort(MSSQLServerContainer.MS_SQL_SERVER_PORT)); From 4a38bdb04265798f60d7fc864a1b8930a27b2b0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 14:40:44 -0600 Subject: [PATCH 0911/1224] Add MySQL container implementation under org.testcontainers.mysql (#11086) --- docs/modules/databases/mysql.md | 2 +- .../containers/MySQLContainer.java | 3 + .../testcontainers/mysql/MySQLContainer.java | 160 ++++++++++++++++++ .../junit/mysql/CustomizableMysqlTest.java | 39 ----- .../mysql/MultiVersionMySQLTest.java | 5 +- .../MySQLContainerTest.java} | 52 ++++-- 6 files changed, 201 insertions(+), 60 deletions(-) create mode 100644 modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java delete mode 100644 modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java rename modules/mysql/src/test/java/org/testcontainers/{junit => }/mysql/MultiVersionMySQLTest.java (87%) rename modules/mysql/src/test/java/org/testcontainers/{junit/mysql/SimpleMySQLTest.java => mysql/MySQLContainerTest.java} (82%) diff --git a/docs/modules/databases/mysql.md b/docs/modules/databases/mysql.md index 825ab42f60c..46bf8b586de 100644 --- a/docs/modules/databases/mysql.md +++ b/docs/modules/databases/mysql.md @@ -7,7 +7,7 @@ Testcontainers module for [MySQL](https://hub.docker.com/_/mysql) You can start a MySQL container instance from any Java application by using: -[Container definition](../../../modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java) inside_block:container +[Container definition](../../../modules/mysql/src/test/java/org/testcontainers/mysql/MySQLContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. 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 54f3952b6a2..9f5b31531c4 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -12,7 +12,10 @@ * Supported image: {@code mysql} *

    * Exposed ports: 3306 + * + * @deprecated use {@link org.testcontainers.mysql.MySQLContainer} instead. */ +@Deprecated public class MySQLContainer> extends JdbcDatabaseContainer { public static final String NAME = "mysql"; diff --git a/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java new file mode 100644 index 00000000000..e46bef6180d --- /dev/null +++ b/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java @@ -0,0 +1,160 @@ +package org.testcontainers.mysql; + +import org.jetbrains.annotations.NotNull; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.util.Set; + +/** + * Testcontainers implementation for MySQL. + *

    + * Supported image: {@code mysql} + *

    + * Exposed ports: 3306 + */ +public class MySQLContainer extends JdbcDatabaseContainer { + + public static final String NAME = "mysql"; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mysql"); + + static final String DEFAULT_USER = "test"; + + static final String DEFAULT_PASSWORD = "test"; + + private static final String MY_CNF_CONFIG_OVERRIDE_PARAM_NAME = "TC_MY_CNF"; + + public static final Integer MYSQL_PORT = 3306; + + private String databaseName = "test"; + + private String username = DEFAULT_USER; + + private String password = DEFAULT_PASSWORD; + + private static final String MYSQL_ROOT_USER = "root"; + + public MySQLContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public MySQLContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + addExposedPort(MYSQL_PORT); + } + + /** + * @return the ports on which to check if the container is ready + * @deprecated use {@link #getLivenessCheckPortNumbers()} instead + */ + @NotNull + @Override + @Deprecated + protected Set getLivenessCheckPorts() { + return super.getLivenessCheckPorts(); + } + + @Override + protected void configure() { + optionallyMapResourceParameterAsVolume( + MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, + "/etc/mysql/conf.d", + "mysql-default-conf", + Transferable.DEFAULT_DIR_MODE + ); + + addEnv("MYSQL_DATABASE", databaseName); + if (!MYSQL_ROOT_USER.equalsIgnoreCase(username)) { + addEnv("MYSQL_USER", username); + } + if (password != null && !password.isEmpty()) { + addEnv("MYSQL_PASSWORD", password); + addEnv("MYSQL_ROOT_PASSWORD", password); + } else if (MYSQL_ROOT_USER.equalsIgnoreCase(username)) { + addEnv("MYSQL_ALLOW_EMPTY_PASSWORD", "yes"); + } else { + throw new ContainerLaunchException("Empty password can be used only with the root user"); + } + setStartupAttempts(3); + } + + @Override + public String getDriverClassName() { + try { + Class.forName("com.mysql.cj.jdbc.Driver"); + return "com.mysql.cj.jdbc.Driver"; + } catch (ClassNotFoundException e) { + return "com.mysql.jdbc.Driver"; + } + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return "jdbc:mysql://" + getHost() + ":" + getMappedPort(MYSQL_PORT) + "/" + databaseName + additionalUrlParams; + } + + @Override + protected String constructUrlForConnection(String queryString) { + String url = super.constructUrlForConnection(queryString); + + if (!url.contains("useSSL=")) { + String separator = url.contains("?") ? "&" : "?"; + url = url + separator + "useSSL=false"; + } + + if (!url.contains("allowPublicKeyRetrieval=")) { + url = url + "&allowPublicKeyRetrieval=true"; + } + + return url; + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return "SELECT 1"; + } + + public MySQLContainer withConfigurationOverride(String s) { + parameters.put(MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, s); + return self(); + } + + @Override + public MySQLContainer withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + @Override + public MySQLContainer withUsername(final String username) { + this.username = username; + return self(); + } + + @Override + public MySQLContainer withPassword(final String password) { + this.password = password; + return self(); + } +} 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 deleted file mode 100644 index 9e9d97dc54e..00000000000 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/CustomizableMysqlTest.java +++ /dev/null @@ -1,39 +0,0 @@ -package org.testcontainers.junit.mysql; - -import org.junit.jupiter.api.Test; -import org.testcontainers.MySQLTestImages; -import org.testcontainers.containers.MySQLContainer; -import org.testcontainers.db.AbstractContainerDatabaseTest; - -import java.sql.ResultSet; -import java.sql.SQLException; - -import static org.assertj.core.api.Assertions.assertThat; - -class CustomizableMysqlTest extends AbstractContainerDatabaseTest { - - private static final String DB_NAME = "foo"; - - private static final String USER = "bar"; - - private static final String PWD = "baz"; - - @Test - 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<>(MySQLTestImages.MYSQL_80_IMAGE) - .withDatabaseName(DB_NAME) - .withUsername(USER) - .withPassword(PWD) - .withEnv("MYSQL_ROOT_HOST", "%") - ) { - mysql.start(); - - ResultSet resultSet = performQuery(mysql, "SELECT 1"); - - int resultSetInt = resultSet.getInt(1); - assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); - } - } -} diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/mysql/MultiVersionMySQLTest.java similarity index 87% rename from modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java rename to modules/mysql/src/test/java/org/testcontainers/mysql/MultiVersionMySQLTest.java index d8e8b52dc56..8dc4454860b 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/MultiVersionMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/mysql/MultiVersionMySQLTest.java @@ -1,9 +1,8 @@ -package org.testcontainers.junit.mysql; +package org.testcontainers.mysql; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.MySQLTestImages; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import org.testcontainers.utility.DockerImageName; @@ -26,7 +25,7 @@ public static DockerImageName[] params() { @ParameterizedTest @MethodSource("params") void versionCheckTest(DockerImageName dockerImageName) throws SQLException { - try (MySQLContainer mysql = new MySQLContainer<>(dockerImageName)) { + try (MySQLContainer mysql = new MySQLContainer(dockerImageName)) { mysql.start(); final ResultSet resultSet = performQuery(mysql, "SELECT VERSION()"); final String resultSetString = resultSet.getString(1); diff --git a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java b/modules/mysql/src/test/java/org/testcontainers/mysql/MySQLContainerTest.java similarity index 82% rename from modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java rename to modules/mysql/src/test/java/org/testcontainers/mysql/MySQLContainerTest.java index b3eac503c57..ad78781db5c 100644 --- a/modules/mysql/src/test/java/org/testcontainers/junit/mysql/SimpleMySQLTest.java +++ b/modules/mysql/src/test/java/org/testcontainers/mysql/MySQLContainerTest.java @@ -1,11 +1,10 @@ -package org.testcontainers.junit.mysql; +package org.testcontainers.mysql; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testcontainers.MySQLTestImages; import org.testcontainers.containers.ContainerLaunchException; -import org.testcontainers.containers.MySQLContainer; import org.testcontainers.containers.output.Slf4jLogConsumer; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -30,14 +29,14 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assumptions.assumeThat; -class SimpleMySQLTest extends AbstractContainerDatabaseTest { +class MySQLContainerTest extends AbstractContainerDatabaseTest { - private static final Logger logger = LoggerFactory.getLogger(SimpleMySQLTest.class); + private static final Logger logger = LoggerFactory.getLogger(MySQLContainerTest.class); @Test void testSimple() throws SQLException { try ( // container { - MySQLContainer mysql = new MySQLContainer<>("mysql:8.0.36") + MySQLContainer mysql = new MySQLContainer("mysql:8.0.36") // } ) { mysql.start(); @@ -53,7 +52,7 @@ void testSimple() throws SQLException { @Test void testSpecificVersion() throws SQLException { try ( - MySQLContainer mysqlOldVersion = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysqlOldVersion = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") .withLogConsumer(new Slf4jLogConsumer(logger)) ) { @@ -71,7 +70,7 @@ void testSpecificVersion() throws SQLException { @Test void testMySQLWithCustomIniFile() throws SQLException { try ( - MySQLContainer mysqlCustomConfig = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysqlCustomConfig = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") ) { mysqlCustomConfig.start(); @@ -83,7 +82,7 @@ void testMySQLWithCustomIniFile() throws SQLException { @Test void testCommandOverride() throws SQLException { try ( - MySQLContainer mysqlCustomConfig = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysqlCustomConfig = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withCommand("mysqld --auto_increment_increment=42") ) { mysqlCustomConfig.start(); @@ -98,7 +97,7 @@ void testCommandOverride() throws SQLException { @Test void testExplicitInitScript() throws SQLException { try ( - MySQLContainer container = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer container = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withInitScript("somepath/init_mysql.sql") .withLogConsumer(new Slf4jLogConsumer(logger)) ) { @@ -114,7 +113,7 @@ void testExplicitInitScript() throws SQLException { @Test void testEmptyPasswordWithNonRootUser() { try ( - MySQLContainer container = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer container = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withDatabaseName("TEST") .withUsername("test") .withPassword("") @@ -130,7 +129,7 @@ void testEmptyPasswordWithNonRootUser() { 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<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysql = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withDatabaseName("foo") .withUsername("root") .withPassword("") @@ -147,7 +146,7 @@ void testEmptyPasswordWithRootUser() throws SQLException { @Test void testWithAdditionalUrlParamTimeZone() throws SQLException { - MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysql = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withUrlParam("serverTimezone", "Europe/Zurich") .withEnv("TZ", "Europe/Zurich") .withLogConsumer(new Slf4jLogConsumer(logger)); @@ -182,7 +181,7 @@ void testWithAdditionalUrlParamTimeZone() throws SQLException { @Test void testWithAdditionalUrlParamMultiQueries() throws SQLException { - MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysql = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withUrlParam("allowMultiQueries", "true") .withLogConsumer(new Slf4jLogConsumer(logger)); mysql.start(); @@ -207,7 +206,7 @@ void testWithAdditionalUrlParamMultiQueries() throws SQLException { @Test void testWithAdditionalUrlParamInJdbcUrl() { - MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysql = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withUrlParam("allowMultiQueries", "true") .withUrlParam("rewriteBatchedStatements", "true") .withLogConsumer(new Slf4jLogConsumer(logger)); @@ -228,7 +227,7 @@ void testWithAdditionalUrlParamInJdbcUrl() { void testWithOnlyUserReadableCustomIniFile() throws Exception { assumeThat(FileSystems.getDefault().supportedFileAttributeViews().contains("posix")).isTrue(); try ( - MySQLContainer mysql = new MySQLContainer<>(MySQLTestImages.MYSQL_80_IMAGE) + MySQLContainer mysql = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) .withConfigurationOverride("somepath/mysql_conf_override") .withLogConsumer(new Slf4jLogConsumer(logger)) ) { @@ -252,12 +251,31 @@ void testWithOnlyUserReadableCustomIniFile() throws Exception { } } - private void assertHasCorrectExposedAndLivenessCheckPorts(MySQLContainer mysql) { + @Test + void testCustom() throws SQLException { + // Add MYSQL_ROOT_HOST environment so that we can root login from anywhere for testing purposes + try ( + MySQLContainer mysql = new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE) + .withDatabaseName("foo") + .withUsername("bar") + .withPassword("baz") + .withEnv("MYSQL_ROOT_HOST", "%") + ) { + mysql.start(); + + ResultSet resultSet = performQuery(mysql, "SELECT 1"); + + int resultSetInt = resultSet.getInt(1); + assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); + } + } + + private void assertHasCorrectExposedAndLivenessCheckPorts(MySQLContainer mysql) { assertThat(mysql.getExposedPorts()).containsExactly(MySQLContainer.MYSQL_PORT); assertThat(mysql.getLivenessCheckPortNumbers()).containsExactly(mysql.getMappedPort(MySQLContainer.MYSQL_PORT)); } - private void assertThatCustomIniFileWasUsed(MySQLContainer mysql) throws SQLException { + private void assertThatCustomIniFileWasUsed(MySQLContainer mysql) throws SQLException { try (ResultSet resultSet = performQuery(mysql, "SELECT @@GLOBAL.innodb_max_undo_log_size")) { long result = resultSet.getLong(1); assertThat(result) From d076937ab8ed98807d8ba365a3ac68c1a3a5637f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 14:40:54 -0600 Subject: [PATCH 0912/1224] Add Nginx container implementation under org.testcontainers.nginx (#11087) --- docs/modules/nginx.md | 6 ++-- .../containers/NginxContainer.java | 4 +++ .../testcontainers/nginx/NginxContainer.java | 30 +++++++++++++++++++ .../NginxContainerTest.java} | 5 ++-- 4 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java rename modules/nginx/src/test/java/org/testcontainers/{junit/SimpleNginxTest.java => nginx/NginxContainerTest.java} (96%) diff --git a/docs/modules/nginx.md b/docs/modules/nginx.md index fb4270ba4a3..d0661330bb1 100644 --- a/docs/modules/nginx.md +++ b/docs/modules/nginx.md @@ -7,19 +7,19 @@ Nginx is a web server, reverse proxy and mail proxy and http cache. The following example shows how to start Nginx. -[Creating a Nginx container](../../modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java) inside_block:creatingContainer +[Creating a Nginx container](../../modules/nginx/src/test/java/org/testcontainers/nginx/NginxContainerTest.java) inside_block:creatingContainer How to add custom content to the Nginx server. -[Creating the static content to serve](../../modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java) inside_block:addCustomContent +[Creating the static content to serve](../../modules/nginx/src/test/java/org/testcontainers/nginx/NginxContainerTest.java) inside_block:addCustomContent And how to query the Nginx server for the custom content added. -[Creating the static content to serve](../../modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java) inside_block:getFromNginxServer +[Creating the static content to serve](../../modules/nginx/src/test/java/org/testcontainers/nginx/NginxContainerTest.java) inside_block:getFromNginxServer ## Adding this module to your project dependencies 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 7f6b5b0f74c..d7c201e6474 100644 --- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java @@ -7,6 +7,10 @@ import java.net.URL; import java.util.Set; +/** + * @deprecated use {@link org.testcontainers.nginx.NginxContainer} instead. + */ +@Deprecated public class NginxContainer extends GenericContainer { private static final int NGINX_DEFAULT_PORT = 80; diff --git a/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java b/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java new file mode 100644 index 00000000000..61ac3678bed --- /dev/null +++ b/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java @@ -0,0 +1,30 @@ +package org.testcontainers.nginx; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.utility.DockerImageName; + +import java.net.MalformedURLException; +import java.net.URL; + +public class NginxContainer extends GenericContainer { + + private static final int NGINX_DEFAULT_PORT = 80; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("nginx"); + + public NginxContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public NginxContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + addExposedPort(NGINX_DEFAULT_PORT); + setCommand("nginx", "-g", "daemon off;"); + } + + public URL getBaseUrl(String scheme, int port) throws MalformedURLException { + return new URL(scheme + "://" + getHost() + ":" + getMappedPort(port)); + } +} diff --git a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java b/modules/nginx/src/test/java/org/testcontainers/nginx/NginxContainerTest.java similarity index 96% rename from modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java rename to modules/nginx/src/test/java/org/testcontainers/nginx/NginxContainerTest.java index 1c527c27a63..ec495a06d1c 100644 --- a/modules/nginx/src/test/java/org/testcontainers/junit/SimpleNginxTest.java +++ b/modules/nginx/src/test/java/org/testcontainers/nginx/NginxContainerTest.java @@ -1,9 +1,8 @@ -package org.testcontainers.junit; +package org.testcontainers.nginx; import lombok.Cleanup; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.testcontainers.containers.NginxContainer; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; @@ -19,7 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; -class SimpleNginxTest { +class NginxContainerTest { private static final DockerImageName NGINX_IMAGE = DockerImageName.parse("nginx:1.27.0-alpine3.19-slim"); From 067963c4b7a82070263abbcea73c281e69d89b01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 15:46:20 -0600 Subject: [PATCH 0913/1224] Add PostgreSQL container implementation under org.testcontainers.postgresql (#11088) --- docs/modules/databases/postgres.md | 8 +- .../containers/PostgreSQLContainer.java | 3 + .../postgresql/PostgreSQLContainer.java | 144 ++++++++++++++++++ .../CustomizablePostgreSQLTest.java | 37 ----- .../CompatibleImageTest.java | 8 +- .../PostgreSQLContainerTest.java} | 21 ++- 6 files changed, 165 insertions(+), 56 deletions(-) create mode 100644 modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java delete mode 100644 modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java rename modules/postgresql/src/test/java/org/testcontainers/{containers => postgresql}/CompatibleImageTest.java (86%) rename modules/postgresql/src/test/java/org/testcontainers/{junit/postgresql/SimplePostgreSQLTest.java => postgresql/PostgreSQLContainerTest.java} (80%) diff --git a/docs/modules/databases/postgres.md b/docs/modules/databases/postgres.md index 043a01bb93e..bb2414fa2cc 100644 --- a/docs/modules/databases/postgres.md +++ b/docs/modules/databases/postgres.md @@ -7,7 +7,7 @@ Testcontainers module for [PostgresSQL](https://hub.docker.com/_/postgres) You can start a PostgreSQL container instance from any Java application by using: -[Container creation](../../../modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java) inside_block:container +[Container creation](../../../modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. @@ -28,19 +28,19 @@ See [JDBC](./jdbc.md) for documentation. * [pgvector/pgvector](https://hub.docker.com/r/pgvector/pgvector) -[Using pgvector](../../../modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java) inside_block:pgvectorContainer +[Using pgvector](../../../modules/postgresql/src/test/java/org/testcontainers/postgresql/CompatibleImageTest.java) inside_block:pgvectorContainer * [postgis/postgis](https://registry.hub.docker.com/r/postgis/postgis) -[Using PostGIS](../../../modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java) inside_block:postgisContainer +[Using PostGIS](../../../modules/postgresql/src/test/java/org/testcontainers/postgresql/CompatibleImageTest.java) inside_block:postgisContainer * [timescale/timescaledb](https://hub.docker.com/r/timescale/timescaledb) -[Using TimescaleDB](../../../modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java) inside_block:timescaledbContainer +[Using TimescaleDB](../../../modules/postgresql/src/test/java/org/testcontainers/postgresql/CompatibleImageTest.java) inside_block:timescaledbContainer ## Adding this module to your project dependencies 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 d96f30864d9..d45b9d5683d 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -14,7 +14,10 @@ * Supported images: {@code postgres}, {@code pgvector/pgvector} *

    * Exposed ports: 5432 + * + * @deprecated use {@link org.testcontainers.postgresql.PostgreSQLContainer} instead. */ +@Deprecated public class PostgreSQLContainer> extends JdbcDatabaseContainer { public static final String NAME = "postgresql"; diff --git a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java new file mode 100644 index 00000000000..9b02019052d --- /dev/null +++ b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java @@ -0,0 +1,144 @@ +package org.testcontainers.postgresql; + +import org.jetbrains.annotations.NotNull; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; +import java.time.temporal.ChronoUnit; +import java.util.Set; + +/** + * Testcontainers implementation for PostgreSQL. + *

    + * Supported images: {@code postgres}, {@code pgvector/pgvector} + *

    + * Exposed ports: 5432 + */ +public class PostgreSQLContainer extends JdbcDatabaseContainer { + + public static final String NAME = "postgresql"; + + public static final String IMAGE = "postgres"; + + public static final String DEFAULT_TAG = "9.6.12"; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("postgres"); + + private static final DockerImageName PGVECTOR_IMAGE_NAME = DockerImageName.parse("pgvector/pgvector"); + + public static final Integer POSTGRESQL_PORT = 5432; + + static final String DEFAULT_USER = "test"; + + static final String DEFAULT_PASSWORD = "test"; + + private String databaseName = "test"; + + private String username = "test"; + + private String password = "test"; + + private static final String FSYNC_OFF_OPTION = "fsync=off"; + + public PostgreSQLContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public PostgreSQLContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, PGVECTOR_IMAGE_NAME); + + this.waitStrategy = + new LogMessageWaitStrategy() + .withRegEx(".*database system is ready to accept connections.*\\s") + .withTimes(2) + .withStartupTimeout(Duration.of(60, ChronoUnit.SECONDS)); + this.setCommand("postgres", "-c", FSYNC_OFF_OPTION); + + addExposedPort(POSTGRESQL_PORT); + } + + /** + * @return the ports on which to check if the container is ready + * @deprecated use {@link #getLivenessCheckPortNumbers()} instead + */ + @NotNull + @Override + @Deprecated + protected Set getLivenessCheckPorts() { + return super.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); + } + + @Override + public String getDriverClassName() { + return "org.postgresql.Driver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters("?", "&"); + return ( + "jdbc:postgresql://" + + getHost() + + ":" + + getMappedPort(POSTGRESQL_PORT) + + "/" + + databaseName + + additionalUrlParams + ); + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getTestQueryString() { + return "SELECT 1"; + } + + @Override + public PostgreSQLContainer withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + @Override + public PostgreSQLContainer withUsername(final String username) { + this.username = username; + return self(); + } + + @Override + public PostgreSQLContainer withPassword(final String password) { + this.password = password; + return self(); + } + + @Override + protected void waitUntilContainerStarted() { + getWaitStrategy().waitUntilReady(this); + } +} 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 deleted file mode 100644 index fb09530913b..00000000000 --- a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/CustomizablePostgreSQLTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.testcontainers.junit.postgresql; - -import org.junit.jupiter.api.Test; -import org.testcontainers.PostgreSQLTestImages; -import org.testcontainers.containers.PostgreSQLContainer; -import org.testcontainers.db.AbstractContainerDatabaseTest; - -import java.sql.ResultSet; -import java.sql.SQLException; - -import static org.assertj.core.api.Assertions.assertThat; - -class CustomizablePostgreSQLTest extends AbstractContainerDatabaseTest { - - private static final String DB_NAME = "foo"; - - private static final String USER = "bar"; - - private static final String PWD = "baz"; - - @Test - void testSimple() throws SQLException { - try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) - .withDatabaseName(DB_NAME) - .withUsername(USER) - .withPassword(PWD) - ) { - postgres.start(); - - ResultSet resultSet = performQuery(postgres, "SELECT 1"); - - int resultSetInt = resultSet.getInt(1); - assertThat(resultSetInt).as("A basic SELECT query succeeds").isEqualTo(1); - } - } -} diff --git a/modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/CompatibleImageTest.java similarity index 86% rename from modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java rename to modules/postgresql/src/test/java/org/testcontainers/postgresql/CompatibleImageTest.java index 7101f4a9fb1..bdad4fb6a5c 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/containers/CompatibleImageTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/CompatibleImageTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.postgresql; import org.junit.jupiter.api.Test; import org.testcontainers.db.AbstractContainerDatabaseTest; @@ -15,7 +15,7 @@ class CompatibleImageTest extends AbstractContainerDatabaseTest { void pgvector() throws SQLException { try ( // pgvectorContainer { - PostgreSQLContainer pgvector = new PostgreSQLContainer<>("pgvector/pgvector:pg16") + PostgreSQLContainer pgvector = new PostgreSQLContainer("pgvector/pgvector:pg16") // } ) { pgvector.start(); @@ -30,7 +30,7 @@ void pgvector() throws SQLException { void postgis() throws SQLException { try ( // postgisContainer { - PostgreSQLContainer postgis = new PostgreSQLContainer<>( + PostgreSQLContainer postgis = new PostgreSQLContainer( DockerImageName.parse("postgis/postgis:16-3.4-alpine").asCompatibleSubstituteFor("postgres") ) // } @@ -47,7 +47,7 @@ void postgis() throws SQLException { void timescaledb() throws SQLException { try ( // timescaledbContainer { - PostgreSQLContainer timescaledb = new PostgreSQLContainer<>( + PostgreSQLContainer timescaledb = new PostgreSQLContainer( DockerImageName.parse("timescale/timescaledb:2.14.2-pg16").asCompatibleSubstituteFor("postgres") ) // } diff --git a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLContainerTest.java similarity index 80% rename from modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java rename to modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLContainerTest.java index 7227f3bdd60..beefa3776b1 100644 --- a/modules/postgresql/src/test/java/org/testcontainers/junit/postgresql/SimplePostgreSQLTest.java +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLContainerTest.java @@ -1,8 +1,7 @@ -package org.testcontainers.junit.postgresql; +package org.testcontainers.postgresql; import org.junit.jupiter.api.Test; import org.testcontainers.PostgreSQLTestImages; -import org.testcontainers.containers.PostgreSQLContainer; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -13,7 +12,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatNoException; -class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { +class PostgreSQLContainerTest extends AbstractContainerDatabaseTest { static { // Postgres JDBC driver uses JUL; disable it to avoid annoying, irrelevant, stderr logs during connection testing LogManager.getLogManager().getLogger("").setLevel(Level.OFF); @@ -22,7 +21,7 @@ class SimplePostgreSQLTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - PostgreSQLContainer postgres = new PostgreSQLContainer<>("postgres:9.6.12") + PostgreSQLContainer postgres = new PostgreSQLContainer("postgres:9.6.12") // } ) { postgres.start(); @@ -37,7 +36,7 @@ void testSimple() throws SQLException { @Test void testCommandOverride() throws SQLException { try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + PostgreSQLContainer postgres = new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withCommand("postgres -c max_connections=42") ) { postgres.start(); @@ -51,7 +50,7 @@ void testCommandOverride() throws SQLException { @Test void testUnsetCommand() throws SQLException { try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + PostgreSQLContainer postgres = new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withCommand("postgres -c max_connections=42") .withCommand() ) { @@ -66,7 +65,7 @@ void testUnsetCommand() throws SQLException { @Test void testMissingInitScript() { try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + PostgreSQLContainer postgres = new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withInitScript(null) ) { assertThatNoException().isThrownBy(postgres::start); @@ -76,7 +75,7 @@ void testMissingInitScript() { @Test void testExplicitInitScript() throws SQLException { try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + PostgreSQLContainer postgres = new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withInitScript("somepath/init_postgresql.sql") ) { postgres.start(); @@ -91,7 +90,7 @@ void testExplicitInitScript() throws SQLException { @Test void testExplicitInitScripts() throws SQLException { try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + PostgreSQLContainer postgres = new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withInitScripts("somepath/init_postgresql.sql", "somepath/init_postgresql_2.sql") ) { postgres.start(); @@ -112,7 +111,7 @@ void testExplicitInitScripts() throws SQLException { @Test void testWithAdditionalUrlParamInJdbcUrl() { try ( - PostgreSQLContainer postgres = new PostgreSQLContainer<>(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) + PostgreSQLContainer postgres = new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE) .withUrlParam("charSet", "UNICODE") ) { postgres.start(); @@ -123,7 +122,7 @@ void testWithAdditionalUrlParamInJdbcUrl() { } } - private void assertHasCorrectExposedAndLivenessCheckPorts(PostgreSQLContainer postgres) { + private void assertHasCorrectExposedAndLivenessCheckPorts(PostgreSQLContainer postgres) { assertThat(postgres.getExposedPorts()).containsExactly(PostgreSQLContainer.POSTGRESQL_PORT); assertThat(postgres.getLivenessCheckPortNumbers()) .containsExactly(postgres.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT)); From 4abffe666867aa02c3c2c764d1e0306baf0c3436 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 15:48:25 -0600 Subject: [PATCH 0914/1224] Add Pulsar container implementation under org.testcontainers.pulsar (#11089) --- docs/modules/pulsar.md | 10 +- .../containers/PulsarContainer.java | 3 + .../pulsar/PulsarContainer.java | 103 ++++++++++++++++++ .../AbstractPulsar.java | 2 +- .../CompatibleApachePulsarImageTest.java | 2 +- .../PulsarContainerTest.java | 4 +- 6 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 modules/pulsar/src/main/java/org/testcontainers/pulsar/PulsarContainer.java rename modules/pulsar/src/test/java/org/testcontainers/{containers => pulsar}/AbstractPulsar.java (98%) rename modules/pulsar/src/test/java/org/testcontainers/{containers => pulsar}/CompatibleApachePulsarImageTest.java (97%) rename modules/pulsar/src/test/java/org/testcontainers/{containers => pulsar}/PulsarContainerTest.java (96%) diff --git a/docs/modules/pulsar.md b/docs/modules/pulsar.md index f74c315cbdc..5c0c2497f4e 100644 --- a/docs/modules/pulsar.md +++ b/docs/modules/pulsar.md @@ -9,13 +9,13 @@ It's based on the official Apache Pulsar docker image, it is recommended to read Create a `PulsarContainer` to use it in your tests: -[Create a Pulsar container](../../modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java) inside_block:constructorWithVersion +[Create a Pulsar container](../../modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java) inside_block:constructorWithVersion Then you can retrieve the broker and the admin url: -[Get broker and admin urls](../../modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java) inside_block:coordinates +[Get broker and admin urls](../../modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java) inside_block:coordinates ## Options @@ -26,7 +26,7 @@ If you need to set Pulsar configuration variables you can use the native APIs an For example, if you want to enable `brokerDeduplicationEnabled`: -[Set configuration variables](../../modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java) inside_block:constructorWithEnv +[Set configuration variables](../../modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java) inside_block:constructorWithEnv ### Pulsar IO @@ -34,7 +34,7 @@ For example, if you want to enable `brokerDeduplicationEnabled`: If you need to test Pulsar IO framework you can enable the Pulsar Functions Worker: -[Create a Pulsar container with functions worker](../../modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java) inside_block:constructorWithFunctionsWorker +[Create a Pulsar container with functions worker](../../modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java) inside_block:constructorWithFunctionsWorker ### Pulsar Transactions @@ -42,7 +42,7 @@ If you need to test Pulsar IO framework you can enable the Pulsar Functions Work If you need to test Pulsar Transactions you can enable the transactions feature: -[Create a Pulsar container with transactions](../../modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java) inside_block:constructorWithTransactions +[Create a Pulsar container with transactions](../../modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java) inside_block:constructorWithTransactions 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 027e030c0de..49475d09511 100644 --- a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java +++ b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java @@ -14,7 +14,10 @@ *

  • Pulsar: 6650
  • *
  • HTTP: 8080
  • * + * + * @deprecated use {@link org.testcontainers.pulsar.PulsarContainer} instead. */ +@Deprecated public class PulsarContainer extends GenericContainer { public static final int BROKER_PORT = 6650; diff --git a/modules/pulsar/src/main/java/org/testcontainers/pulsar/PulsarContainer.java b/modules/pulsar/src/main/java/org/testcontainers/pulsar/PulsarContainer.java new file mode 100644 index 00000000000..8936a7523c4 --- /dev/null +++ b/modules/pulsar/src/main/java/org/testcontainers/pulsar/PulsarContainer.java @@ -0,0 +1,103 @@ +package org.testcontainers.pulsar; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.containers.wait.strategy.WaitAllStrategy; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for Apache Pulsar. + *

    + * Supported images: {@code apachepulsar/pulsar}, {@code apachepulsar/pulsar-all} + *

    + * Exposed ports: + *

      + *
    • Pulsar: 6650
    • + *
    • HTTP: 8080
    • + *
    + */ +public class PulsarContainer extends GenericContainer { + + public static final int BROKER_PORT = 6650; + + public static final int BROKER_HTTP_PORT = 8080; + + private static final String ADMIN_CLUSTERS_ENDPOINT = "/admin/v2/clusters"; + + /** + * See SystemTopicNames. + */ + private static final String TRANSACTION_TOPIC_ENDPOINT = + "/admin/v2/persistent/pulsar/system/transaction_coordinator_assign/partitions"; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("apachepulsar/pulsar"); + + private final WaitAllStrategy waitAllStrategy = new WaitAllStrategy(); + + private boolean functionsWorkerEnabled = false; + + private boolean transactionsEnabled = false; + + @Deprecated + public PulsarContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public PulsarContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, DockerImageName.parse("apachepulsar/pulsar-all")); + withExposedPorts(BROKER_PORT, BROKER_HTTP_PORT); + setWaitStrategy(waitAllStrategy); + } + + @Override + protected void configure() { + super.configure(); + setupCommandAndEnv(); + } + + public PulsarContainer withFunctionsWorker() { + functionsWorkerEnabled = true; + return this; + } + + public PulsarContainer withTransactions() { + transactionsEnabled = true; + return this; + } + + public String getPulsarBrokerUrl() { + return String.format("pulsar://%s:%s", getHost(), getMappedPort(BROKER_PORT)); + } + + public String getHttpServiceUrl() { + return String.format("http://%s:%s", getHost(), getMappedPort(BROKER_HTTP_PORT)); + } + + protected void setupCommandAndEnv() { + String standaloneBaseCommand = + "/pulsar/bin/apply-config-from-env.py /pulsar/conf/standalone.conf " + "&& bin/pulsar standalone"; + + if (!functionsWorkerEnabled) { + standaloneBaseCommand += " --no-functions-worker -nss"; + } + + withCommand("/bin/bash", "-c", standaloneBaseCommand); + + final String clusterName = getEnvMap().getOrDefault("PULSAR_PREFIX_clusterName", "standalone"); + final String response = String.format("[\"%s\"]", clusterName); + waitAllStrategy.withStrategy( + Wait.forHttp(ADMIN_CLUSTERS_ENDPOINT).forPort(BROKER_HTTP_PORT).forResponsePredicate(response::equals) + ); + + if (transactionsEnabled) { + withEnv("PULSAR_PREFIX_transactionCoordinatorEnabled", "true"); + waitAllStrategy.withStrategy( + Wait.forHttp(TRANSACTION_TOPIC_ENDPOINT).forStatusCode(200).forPort(BROKER_HTTP_PORT) + ); + } + if (functionsWorkerEnabled) { + waitAllStrategy.withStrategy(Wait.forLogMessage(".*Function worker service started.*", 1)); + } + } +} diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/AbstractPulsar.java b/modules/pulsar/src/test/java/org/testcontainers/pulsar/AbstractPulsar.java similarity index 98% rename from modules/pulsar/src/test/java/org/testcontainers/containers/AbstractPulsar.java rename to modules/pulsar/src/test/java/org/testcontainers/pulsar/AbstractPulsar.java index c704ce15d41..c86b594b163 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/AbstractPulsar.java +++ b/modules/pulsar/src/test/java/org/testcontainers/pulsar/AbstractPulsar.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.pulsar; import org.apache.pulsar.client.admin.ListTopicsOptions; import org.apache.pulsar.client.admin.PulsarAdmin; diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java b/modules/pulsar/src/test/java/org/testcontainers/pulsar/CompatibleApachePulsarImageTest.java similarity index 97% rename from modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java rename to modules/pulsar/src/test/java/org/testcontainers/pulsar/CompatibleApachePulsarImageTest.java index 702a7223151..0661994466d 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/CompatibleApachePulsarImageTest.java +++ b/modules/pulsar/src/test/java/org/testcontainers/pulsar/CompatibleApachePulsarImageTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.pulsar; import org.apache.pulsar.client.admin.PulsarAdmin; import org.junit.jupiter.params.ParameterizedTest; diff --git a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java b/modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java similarity index 96% rename from modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java rename to modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java index 93e9410ada8..32d96c88453 100644 --- a/modules/pulsar/src/test/java/org/testcontainers/containers/PulsarContainerTest.java +++ b/modules/pulsar/src/test/java/org/testcontainers/pulsar/PulsarContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.pulsar; import org.apache.pulsar.client.admin.PulsarAdmin; import org.apache.pulsar.client.admin.PulsarAdminException; @@ -19,7 +19,7 @@ void testUsage() throws Exception { try ( // do not use PULSAR_IMAGE to make the doc looks easier // constructorWithVersion { - PulsarContainer pulsar = new PulsarContainer(DockerImageName.parse("apachepulsar/pulsar:3.0.0")); + PulsarContainer pulsar = new PulsarContainer("apachepulsar/pulsar:3.0.0"); // } ) { pulsar.start(); From 231c41b27ad567e99f5b915fbcdd33677281b870 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 15:59:50 -0600 Subject: [PATCH 0915/1224] Add RabbitMQ container implementation under org.testcontainers.rabbitmq (#11090) --- docs/modules/rabbitmq.md | 3 - .../containers/RabbitMQContainer.java | 3 + .../rabbitmq/RabbitMQContainer.java | 204 +++++++++++ .../containers/RabbitMQContainerTest.java | 335 ------------------ .../rabbitmq/RabbitMQContainerTest.java | 123 +++++++ .../RabbitMQTestImages.java | 2 +- 6 files changed, 331 insertions(+), 339 deletions(-) create mode 100644 modules/rabbitmq/src/main/java/org/testcontainers/rabbitmq/RabbitMQContainer.java delete mode 100644 modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java create mode 100644 modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQContainerTest.java rename modules/rabbitmq/src/test/java/org/testcontainers/{containers => rabbitmq}/RabbitMQTestImages.java (82%) diff --git a/docs/modules/rabbitmq.md b/docs/modules/rabbitmq.md index 8a9ae9d9b97..4055bb59f06 100644 --- a/docs/modules/rabbitmq.md +++ b/docs/modules/rabbitmq.md @@ -1,8 +1,5 @@ # RabbitMQ Module -!!! 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. - ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: 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 3bb45632c54..b7b2eb35051 100644 --- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java +++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java @@ -27,7 +27,10 @@ *
  • 15671 (HTTPS)
  • *
  • 15672 (HTTP)
  • * + * + * @deprecated use {@link org.testcontainers.rabbitmq.RabbitMQContainer} instead. */ +@Deprecated public class RabbitMQContainer extends GenericContainer { /** diff --git a/modules/rabbitmq/src/main/java/org/testcontainers/rabbitmq/RabbitMQContainer.java b/modules/rabbitmq/src/main/java/org/testcontainers/rabbitmq/RabbitMQContainer.java new file mode 100644 index 00000000000..5b6d79d73c4 --- /dev/null +++ b/modules/rabbitmq/src/main/java/org/testcontainers/rabbitmq/RabbitMQContainer.java @@ -0,0 +1,204 @@ +package org.testcontainers.rabbitmq; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * Testcontainers implementation for RabbitMQ. + *

    + * Supported image: {@code rabbitmq} + *

    + * Exposed ports: + *

      + *
    • 5671 (AMQPS)
    • + *
    • 5672 (AMQP)
    • + *
    • 15671 (HTTPS)
    • + *
    • 15672 (HTTP)
    • + *
    + */ +public class RabbitMQContainer extends GenericContainer { + + /** + * The image defaults to the official RabbitMQ image: RabbitMQ. + */ + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("rabbitmq"); + + private static final int DEFAULT_AMQP_PORT = 5672; + + private static final int DEFAULT_AMQPS_PORT = 5671; + + private static final int DEFAULT_HTTPS_PORT = 15671; + + private static final int DEFAULT_HTTP_PORT = 15672; + + private String adminPassword = "guest"; + + private String adminUsername = "guest"; + + private final List> values = new ArrayList<>(); + + /** + * Creates a RabbitMQ container using a specific docker image. + * + * @param dockerImageName The docker image to use. + */ + public RabbitMQContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public RabbitMQContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + addExposedPorts(DEFAULT_AMQP_PORT, DEFAULT_AMQPS_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); + + waitingFor(Wait.forLogMessage(".*Server startup complete.*", 1)); + } + + @Override + protected void configure() { + if (this.adminUsername != null) { + addEnv("RABBITMQ_DEFAULT_USER", this.adminUsername); + } + if (this.adminPassword != null) { + addEnv("RABBITMQ_DEFAULT_PASS", this.adminPassword); + } + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + values.forEach(command -> { + try { + ExecResult execResult = execInContainer(command.toArray(new String[0])); + if (execResult.getExitCode() != 0) { + logger().error("Could not execute command {}: {}", command, execResult.getStderr()); + } + } catch (IOException | InterruptedException e) { + logger().error("Could not execute command {}: {}", command, e.getMessage()); + } + }); + } + + /** + * @return The admin password for the admin account + */ + public String getAdminPassword() { + return this.adminPassword; + } + + /** + * @return The admin user for the admin account + */ + public String getAdminUsername() { + return this.adminUsername; + } + + public Integer getAmqpPort() { + return getMappedPort(DEFAULT_AMQP_PORT); + } + + public Integer getAmqpsPort() { + return getMappedPort(DEFAULT_AMQPS_PORT); + } + + public Integer getHttpsPort() { + return getMappedPort(DEFAULT_HTTPS_PORT); + } + + public Integer getHttpPort() { + return getMappedPort(DEFAULT_HTTP_PORT); + } + + /** + * @return AMQP URL for use with AMQP clients. + */ + public String getAmqpUrl() { + return "amqp://" + getHost() + ":" + getAmqpPort(); + } + + /** + * @return AMQPS URL for use with AMQPS clients. + */ + public String getAmqpsUrl() { + return "amqps://" + getHost() + ":" + getAmqpsPort(); + } + + /** + * @return URL of the HTTP management endpoint. + */ + public String getHttpUrl() { + return "http://" + getHost() + ":" + getHttpPort(); + } + + /** + * @return URL of the HTTPS management endpoint. + */ + public String getHttpsUrl() { + return "https://" + getHost() + ":" + getHttpsPort(); + } + + /** + * Sets the user for the admin (default is
    guest
    ) + * + * @param adminUsername The admin user. + * @return This container. + */ + public RabbitMQContainer withAdminUser(final String adminUsername) { + this.adminUsername = adminUsername; + return this; + } + + /** + * Sets the password for the admin (default is
    guest
    ) + * + * @param adminPassword The admin password. + * @return This container. + */ + public RabbitMQContainer withAdminPassword(final String adminPassword) { + this.adminPassword = adminPassword; + return this; + } + + /** + * Overwrites the default RabbitMQ configuration file with the supplied one. + * + * @param rabbitMQConf The rabbitmq.conf file to use (in sysctl format, don't forget empty line in the end of file) + * @return This container. + */ + public RabbitMQContainer withRabbitMQConfig(MountableFile rabbitMQConf) { + return withRabbitMQConfigSysctl(rabbitMQConf); + } + + /** + * Overwrites the default RabbitMQ configuration file with the supplied one. + * + * This function doesn't work with RabbitMQ < 3.7. + * + * This function and the Sysctl format is recommended for RabbitMQ >= 3.7 + * + * @param rabbitMQConf The rabbitmq.config file to use (in sysctl format, don't forget empty line in the end of file) + * @return This container. + */ + public RabbitMQContainer withRabbitMQConfigSysctl(MountableFile rabbitMQConf) { + withEnv("RABBITMQ_CONFIG_FILE", "/etc/rabbitmq/rabbitmq-custom.conf"); + return withCopyFileToContainer(rabbitMQConf, "/etc/rabbitmq/rabbitmq-custom.conf"); + } + + /** + * Overwrites the default RabbitMQ configuration file with the supplied one. + * + * @param rabbitMQConf The rabbitmq.config file to use (in erlang format) + * @return This container. + */ + public RabbitMQContainer withRabbitMQConfigErlang(MountableFile rabbitMQConf) { + withEnv("RABBITMQ_CONFIG_FILE", "/etc/rabbitmq/rabbitmq-custom.config"); + return withCopyFileToContainer(rabbitMQConf, "/etc/rabbitmq/rabbitmq-custom.config"); + } +} diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java b/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java deleted file mode 100644 index 2893e812f09..00000000000 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQContainerTest.java +++ /dev/null @@ -1,335 +0,0 @@ -package org.testcontainers.containers; - -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.rabbitmq.client.Channel; -import com.rabbitmq.client.Connection; -import com.rabbitmq.client.ConnectionFactory; -import com.rabbitmq.client.DeliverCallback; -import org.junit.jupiter.api.Test; -import org.testcontainers.containers.RabbitMQContainer.SslVerification; -import org.testcontainers.utility.MountableFile; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; -import java.util.Collections; -import java.util.concurrent.TimeoutException; - -import javax.net.ssl.KeyManagerFactory; -import javax.net.ssl.SSLContext; -import javax.net.ssl.TrustManagerFactory; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; - -class RabbitMQContainerTest { - - public static final int DEFAULT_AMQPS_PORT = 5671; - - public static final int DEFAULT_AMQP_PORT = 5672; - - public static final int DEFAULT_HTTPS_PORT = 15671; - - public static final int DEFAULT_HTTP_PORT = 15672; - - @Test - void shouldCreateRabbitMQContainer() { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.start(); - - assertThat(container.getAdminPassword()).isEqualTo("guest"); - assertThat(container.getAdminUsername()).isEqualTo("guest"); - - assertThat(container.getAmqpsUrl()) - .isEqualTo(String.format("amqps://%s:%d", container.getHost(), container.getAmqpsPort())); - assertThat(container.getAmqpUrl()) - .isEqualTo(String.format("amqp://%s:%d", container.getHost(), container.getAmqpPort())); - assertThat(container.getHttpsUrl()) - .isEqualTo(String.format("https://%s:%d", container.getHost(), container.getHttpsPort())); - assertThat(container.getHttpUrl()) - .isEqualTo(String.format("http://%s:%d", container.getHost(), container.getHttpPort())); - - assertThat(container.getLivenessCheckPortNumbers()) - .containsExactlyInAnyOrder( - container.getMappedPort(DEFAULT_AMQP_PORT), - container.getMappedPort(DEFAULT_AMQPS_PORT), - container.getMappedPort(DEFAULT_HTTP_PORT), - container.getMappedPort(DEFAULT_HTTPS_PORT) - ); - - assertFunctionality(container); - } - } - - @Test - void shouldCreateRabbitMQContainerWithCustomCredentials() { - try ( - RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE) - .withAdminUser("admin") - .withAdminPassword("admin") - ) { - container.start(); - - assertThat(container.getAdminPassword()).isEqualTo("admin"); - assertThat(container.getAdminUsername()).isEqualTo("admin"); - - assertFunctionality(container); - } - } - - @Test - void shouldCreateRabbitMQContainerWithExchange() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.withExchange("test-exchange", "direct"); - - container.start(); - - assertThat(container.execInContainer("rabbitmqctl", "list_exchanges").getStdout()) - .containsPattern("test-exchange\\s+direct"); - } - } - - @Test - void shouldCreateRabbitMQContainerWithExchangeInVhost() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.withVhost("test-vhost"); - container.withExchange( - "test-vhost", - "test-exchange", - "direct", - false, - false, - false, - Collections.emptyMap() - ); - - container.start(); - - assertThat(container.execInContainer("rabbitmqctl", "list_exchanges", "-p", "test-vhost").getStdout()) - .containsPattern("test-exchange\\s+direct"); - } - } - - @Test - void shouldCreateRabbitMQContainerWithQueues() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container - .withQueue("queue-one") - .withQueue("queue-two", false, true, ImmutableMap.of("x-message-ttl", 1000)); - - container.start(); - - assertThat(container.execInContainer("rabbitmqctl", "list_queues", "name", "arguments").getStdout()) - .containsPattern("queue-one"); - assertThat(container.execInContainer("rabbitmqctl", "list_queues", "name", "arguments").getStdout()) - .containsPattern("queue-two\\s.*x-message-ttl"); - } - } - - @Test - void shouldMountConfigurationFile() { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.withRabbitMQConfig(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); - container.start(); - - assertThat(container.getLogs()).contains("debug"); // config file changes log level to `debug` - } - } - - @Test - void shouldMountConfigurationFileErlang() { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.withRabbitMQConfigErlang(MountableFile.forClasspathResource("/rabbitmq-custom.config")); - container.start(); - - assertThat(container.getLogs()).contains("debug"); // config file changes log level to `debug` - } - } - - @Test - void shouldMountConfigurationFileSysctl() { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.withRabbitMQConfigSysctl(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); - container.start(); - - assertThat(container.getLogs()).contains("debug"); // config file changes log level to `debug` - } - } - - @Test - void shouldStartTheWholeEnchilada() throws IOException, InterruptedException { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container - .withVhost("vhost1") - .withVhostLimit("vhost1", "max-connections", 1) - .withVhost("vhost2", true) - .withExchange("direct-exchange", "direct") - .withExchange("topic-exchange", "topic") - .withExchange("vhost1", "topic-exchange-2", "topic", false, false, true, Collections.emptyMap()) - .withExchange("vhost2", "topic-exchange-3", "topic") - .withExchange("topic-exchange-4", "topic", false, false, true, Collections.emptyMap()) - .withQueue("queue1") - .withQueue("queue2", true, false, ImmutableMap.of("x-message-ttl", 1000)) - .withQueue("vhost1", "queue3", true, false, ImmutableMap.of("x-message-ttl", 1000)) - .withQueue("vhost2", "queue4") - .withBinding("direct-exchange", "queue1") - .withBinding("vhost1", "topic-exchange-2", "queue3") - .withBinding("vhost2", "topic-exchange-3", "queue4", Collections.emptyMap(), "ss7", "queue") - .withUser("user1", "password1") - .withUser("user2", "password2", ImmutableSet.of("administrator")) - .withPermission("vhost1", "user1", ".*", ".*", ".*") - .withPolicy("max length policy", "^dog", ImmutableMap.of("max-length", 1), 1, "queues") - .withPolicy( - "alternate exchange policy", - "^direct-exchange", - ImmutableMap.of("alternate-exchange", "amq.direct") - ) - .withPolicy("vhost2", "ha-all", ".*", ImmutableMap.of("ha-mode", "all", "ha-sync-mode", "automatic")) - .withOperatorPolicy("operator policy 1", "^queue1", ImmutableMap.of("message-ttl", 1000), 1, "queues") - .withPluginsEnabled("rabbitmq_shovel", "rabbitmq_random_exchange"); - - container.start(); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "queues").getStdout()) - .contains("queue1", "queue2", "queue3", "queue4"); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "exchanges").getStdout()) - .contains( - "direct-exchange", - "topic-exchange", - "topic-exchange-2", - "topic-exchange-3", - "topic-exchange-4" - ); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "bindings").getStdout()) - .contains("direct-exchange", "topic-exchange-2", "topic-exchange-3"); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "users").getStdout()) - .contains("user1", "user2"); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "policies").getStdout()) - .contains("max length policy", "alternate exchange policy"); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "policies", "--vhost=vhost2").getStdout()) - .contains("ha-all", "ha-sync-mode"); - - assertThat(container.execInContainer("rabbitmqadmin", "list", "operator_policies").getStdout()) - .contains("operator policy 1"); - - assertThat( - container.execInContainer("rabbitmq-plugins", "is_enabled", "rabbitmq_shovel", "--quiet").getStdout() - ) - .contains("rabbitmq_shovel is enabled"); - - assertThat( - container - .execInContainer("rabbitmq-plugins", "is_enabled", "rabbitmq_random_exchange", "--quiet") - .getStdout() - ) - .contains("rabbitmq_random_exchange is enabled"); - } - } - - @Test - void shouldThrowExceptionForDodgyJson() { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - assertThatCode(() -> container.withQueue("queue2", true, false, ImmutableMap.of("x-message-ttl", container)) - ) - .hasMessageStartingWith("Failed to convert arguments into json"); - } - } - - @Test - void shouldWorkWithSSL() { - try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { - container.withSSL( - MountableFile.forClasspathResource("/certs/server_key.pem", 0644), - MountableFile.forClasspathResource("/certs/server_certificate.pem", 0644), - MountableFile.forClasspathResource("/certs/ca_certificate.pem", 0644), - SslVerification.VERIFY_PEER, - true - ); - - container.start(); - - assertThatCode(() -> { - ConnectionFactory connectionFactory = new ConnectionFactory(); - connectionFactory.useSslProtocol( - createSslContext("certs/client_key.p12", "password", "certs/truststore.jks", "password") - ); - connectionFactory.enableHostnameVerification(); - connectionFactory.setUri(container.getAmqpsUrl()); - connectionFactory.setPassword(container.getAdminPassword()); - Connection connection = connectionFactory.newConnection(); - Channel channel = connection - .openChannel() - .orElseThrow(() -> new RuntimeException("Failed to Open channel")); - channel.close(); - connection.close(); - }) - .doesNotThrowAnyException(); - } - } - - private SSLContext createSslContext( - String keystoreFile, - String keystorePassword, - String truststoreFile, - String truststorePassword - ) - throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException, UnrecoverableKeyException, KeyManagementException { - ClassLoader classLoader = getClass().getClassLoader(); - - KeyStore ks = KeyStore.getInstance("PKCS12"); - ks.load( - Files.newInputStream(new File(classLoader.getResource(keystoreFile).getFile()).toPath()), - keystorePassword.toCharArray() - ); - KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); - kmf.init(ks, "password".toCharArray()); - - KeyStore trustStore = KeyStore.getInstance("PKCS12"); - trustStore.load( - Files.newInputStream(new File(classLoader.getResource(truststoreFile).getFile()).toPath()), - truststorePassword.toCharArray() - ); - TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); - tmf.init(trustStore); - - SSLContext c = SSLContext.getInstance("TLSv1.2"); - c.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); - return c; - } - - private void assertFunctionality(RabbitMQContainer container) { - String queueName = "test-queue"; - String text = "Hello World!"; - - ConnectionFactory factory = new ConnectionFactory(); - factory.setHost(container.getHost()); - factory.setPort(container.getAmqpPort()); - factory.setUsername(container.getAdminUsername()); - factory.setPassword(container.getAdminPassword()); - try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { - channel.queueDeclare(queueName, false, false, false, null); - channel.basicPublish("", queueName, null, text.getBytes()); - - DeliverCallback deliverCallback = (consumerTag, delivery) -> { - String message = new String(delivery.getBody(), StandardCharsets.UTF_8); - assertThat(message).isEqualTo(text); - }; - channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {}); - } catch (IOException | TimeoutException e) { - throw new RuntimeException(e); - } - } -} diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQContainerTest.java b/modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQContainerTest.java new file mode 100644 index 00000000000..b3434b2d69d --- /dev/null +++ b/modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQContainerTest.java @@ -0,0 +1,123 @@ +package org.testcontainers.rabbitmq; + +import com.rabbitmq.client.Channel; +import com.rabbitmq.client.Connection; +import com.rabbitmq.client.ConnectionFactory; +import com.rabbitmq.client.DeliverCallback; +import org.junit.jupiter.api.Test; +import org.testcontainers.utility.MountableFile; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeoutException; + +import static org.assertj.core.api.Assertions.assertThat; + +class RabbitMQContainerTest { + + public static final int DEFAULT_AMQPS_PORT = 5671; + + public static final int DEFAULT_AMQP_PORT = 5672; + + public static final int DEFAULT_HTTPS_PORT = 15671; + + public static final int DEFAULT_HTTP_PORT = 15672; + + @Test + void shouldCreateRabbitMQContainer() { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { + container.start(); + + assertThat(container.getAdminPassword()).isEqualTo("guest"); + assertThat(container.getAdminUsername()).isEqualTo("guest"); + + assertThat(container.getAmqpsUrl()) + .isEqualTo(String.format("amqps://%s:%d", container.getHost(), container.getAmqpsPort())); + assertThat(container.getAmqpUrl()) + .isEqualTo(String.format("amqp://%s:%d", container.getHost(), container.getAmqpPort())); + assertThat(container.getHttpsUrl()) + .isEqualTo(String.format("https://%s:%d", container.getHost(), container.getHttpsPort())); + assertThat(container.getHttpUrl()) + .isEqualTo(String.format("http://%s:%d", container.getHost(), container.getHttpPort())); + + assertThat(container.getLivenessCheckPortNumbers()) + .containsExactlyInAnyOrder( + container.getMappedPort(DEFAULT_AMQP_PORT), + container.getMappedPort(DEFAULT_AMQPS_PORT), + container.getMappedPort(DEFAULT_HTTP_PORT), + container.getMappedPort(DEFAULT_HTTPS_PORT) + ); + + assertFunctionality(container); + } + } + + @Test + void shouldCreateRabbitMQContainerWithCustomCredentials() { + try ( + RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE) + .withAdminUser("admin") + .withAdminPassword("admin") + ) { + container.start(); + + assertThat(container.getAdminPassword()).isEqualTo("admin"); + assertThat(container.getAdminUsername()).isEqualTo("admin"); + + assertFunctionality(container); + } + } + + @Test + void shouldMountConfigurationFile() { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { + container.withRabbitMQConfig(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); + container.start(); + + assertThat(container.getLogs()).contains("debug"); // config file changes log level to `debug` + } + } + + @Test + void shouldMountConfigurationFileErlang() { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { + container.withRabbitMQConfigErlang(MountableFile.forClasspathResource("/rabbitmq-custom.config")); + container.start(); + + assertThat(container.getLogs()).contains("debug"); // config file changes log level to `debug` + } + } + + @Test + void shouldMountConfigurationFileSysctl() { + try (RabbitMQContainer container = new RabbitMQContainer(RabbitMQTestImages.RABBITMQ_IMAGE)) { + container.withRabbitMQConfigSysctl(MountableFile.forClasspathResource("/rabbitmq-custom.conf")); + container.start(); + + assertThat(container.getLogs()).contains("debug"); // config file changes log level to `debug` + } + } + + private void assertFunctionality(RabbitMQContainer container) { + String queueName = "test-queue"; + String text = "Hello World!"; + + ConnectionFactory factory = new ConnectionFactory(); + factory.setHost(container.getHost()); + factory.setPort(container.getAmqpPort()); + factory.setUsername(container.getAdminUsername()); + factory.setPassword(container.getAdminPassword()); + try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) { + channel.queueDeclare(queueName, false, false, false, null); + channel.basicPublish("", queueName, null, text.getBytes()); + + DeliverCallback deliverCallback = (consumerTag, delivery) -> { + String message = new String(delivery.getBody(), StandardCharsets.UTF_8); + assertThat(message).isEqualTo(text); + }; + channel.basicConsume(queueName, true, deliverCallback, consumerTag -> {}); + } catch (IOException | TimeoutException e) { + throw new RuntimeException(e); + } + } +} diff --git a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java b/modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQTestImages.java similarity index 82% rename from modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java rename to modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQTestImages.java index 0898cbdb350..56294f1c196 100644 --- a/modules/rabbitmq/src/test/java/org/testcontainers/containers/RabbitMQTestImages.java +++ b/modules/rabbitmq/src/test/java/org/testcontainers/rabbitmq/RabbitMQTestImages.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.rabbitmq; import org.testcontainers.utility.DockerImageName; From 76075028d514aa0b5797256ee68d2da8a5635ad9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 16:23:07 -0600 Subject: [PATCH 0916/1224] Add Toxiproxy container implementation under org.testcontainers.toxiproxy (#11091) --- docs/modules/toxiproxy.md | 12 ++--- .../containers/ToxiproxyContainer.java | 3 ++ .../toxiproxy/ToxiproxyContainer.java | 54 +++++++++++++++++++ .../ToxiproxyContainerTest.java} | 33 ++---------- 4 files changed, 66 insertions(+), 36 deletions(-) create mode 100644 modules/toxiproxy/src/main/java/org/testcontainers/toxiproxy/ToxiproxyContainer.java rename modules/toxiproxy/src/test/java/org/testcontainers/{containers/ToxiproxyTest.java => toxiproxy/ToxiproxyContainerTest.java} (83%) diff --git a/docs/modules/toxiproxy.md b/docs/modules/toxiproxy.md index 1b8229982e6..99178935b9a 100644 --- a/docs/modules/toxiproxy.md +++ b/docs/modules/toxiproxy.md @@ -17,7 +17,7 @@ A Toxiproxy container can be placed in between test code and a container, or in In either scenario, it is necessary to create a `ToxiproxyContainer` instance on the same Docker network, as follows: -[Creating a Toxiproxy container](../../modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java) inside_block:creatingProxy +[Creating a Toxiproxy container](../../modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java) inside_block:creatingProxy Next, it is necessary to instruct Toxiproxy to start proxying connections. @@ -26,13 +26,13 @@ Each `ToxiproxyContainer` can proxy to many target containers if necessary. We do this as follows: -[Starting proxying connections to a target container](../../modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java) inside_block:obtainProxyObject +[Starting proxying connections to a target container](../../modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java) inside_block:obtainProxyObject To establish a connection from the test code (on the host machine) to the target container via Toxiproxy, we obtain **Toxiproxy's** proxy host IP and port: -[Obtaining proxied host and port](../../modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java) inside_block:obtainProxiedHostAndPortForHostMachine +[Obtaining proxied host and port](../../modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java) inside_block:obtainProxiedHostAndPortForHostMachine Code under test should connect to this proxied host IP and port. @@ -56,13 +56,13 @@ Please see the [Toxiproxy documentation](https://github.com/Shopify/toxiproxy#to As one example, we can introduce latency and random jitter to proxied connections as follows: -[Adding latency to a connection](../../modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java) inside_block:addingLatency +[Adding latency to a connection](../../modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java) inside_block:addingLatency Additionally we can disable the proxy to simulate a complete interruption to the network connection: -[Cutting a connection](../../modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java) inside_block:disableProxy +[Cutting a connection](../../modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java) inside_block:disableProxy ## Adding this module to your project dependencies @@ -86,5 +86,3 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: ## Acknowledgements This module was inspired by a [hotels.com blog post](https://medium.com/hotels-com-technology/i-dont-know-about-resilience-testing-and-so-can-you-b3c59d80012d). - -[toxiproxy-java](https://github.com/trekawek/toxiproxy-java) is used to help control failure conditions. 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 c28c4e93ddf..4a3d1af003e 100644 --- a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java +++ b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java @@ -26,7 +26,10 @@ *
  • HTTP: 8474
  • *
  • Proxied Ports: 8666-8697
  • * + * + * @deprecated use {@link org.testcontainers.toxiproxy.ToxiproxyContainer} instead. */ +@Deprecated public class ToxiproxyContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("shopify/toxiproxy"); diff --git a/modules/toxiproxy/src/main/java/org/testcontainers/toxiproxy/ToxiproxyContainer.java b/modules/toxiproxy/src/main/java/org/testcontainers/toxiproxy/ToxiproxyContainer.java new file mode 100644 index 00000000000..b4ab7e29c96 --- /dev/null +++ b/modules/toxiproxy/src/main/java/org/testcontainers/toxiproxy/ToxiproxyContainer.java @@ -0,0 +1,54 @@ +package org.testcontainers.toxiproxy; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for Toxiproxy. + *

    + * Supported images: {@code ghcr.io/shopify/toxiproxy}, {@code shopify/toxiproxy} + *

    + * Exposed ports: + *

      + *
    • HTTP: 8474
    • + *
    • Proxied Ports: 8666-8697
    • + *
    + */ +public class ToxiproxyContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("shopify/toxiproxy"); + + private static final DockerImageName GHCR_IMAGE_NAME = DockerImageName.parse("ghcr.io/shopify/toxiproxy"); + + private static final int TOXIPROXY_CONTROL_PORT = 8474; + + private static final int FIRST_PROXIED_PORT = 8666; + + private static final int LAST_PROXIED_PORT = 8666 + 31; + + public ToxiproxyContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public ToxiproxyContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, GHCR_IMAGE_NAME); + + addExposedPorts(TOXIPROXY_CONTROL_PORT); + setWaitStrategy(new HttpWaitStrategy().forPath("/version").forPort(TOXIPROXY_CONTROL_PORT)); + + // allow up to 32 ports to be proxied (arbitrary value). Here we make the ports exposed; whether or not + // Toxiproxy will listen is controlled at runtime using getProxy(...) + for (int i = FIRST_PROXIED_PORT; i <= LAST_PROXIED_PORT; i++) { + addExposedPort(i); + } + } + + /** + * @return Publicly exposed Toxiproxy HTTP API control port. + */ + public int getControlPort() { + return getMappedPort(TOXIPROXY_CONTROL_PORT); + } +} diff --git a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java b/modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java similarity index 83% rename from modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java rename to modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java index 1e35c2d7206..2247f135f7b 100644 --- a/modules/toxiproxy/src/test/java/org/testcontainers/containers/ToxiproxyTest.java +++ b/modules/toxiproxy/src/test/java/org/testcontainers/toxiproxy/ToxiproxyContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.toxiproxy; import eu.rekawek.toxiproxy.Proxy; import eu.rekawek.toxiproxy.ToxiproxyClient; @@ -6,6 +6,8 @@ import org.junit.jupiter.api.AutoClose; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Network; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisConnectionException; @@ -16,7 +18,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.catchThrowable; -public class ToxiproxyTest { +public class ToxiproxyContainerTest { private static final Duration JEDIS_TIMEOUT = Duration.ofSeconds(10); @@ -157,33 +159,6 @@ public void testMultipleProxiesCanBeCreated() throws IOException { } } - @Test - public void testOriginalAndMappedPorts() { - final ToxiproxyContainer.ContainerProxy proxy = toxiproxy.getProxy("hostname", 7070); - - final int portViaToxiproxy = proxy.getOriginalProxyPort(); - assertThat(portViaToxiproxy).as("original port is correct").isEqualTo(8666); - - final ToxiproxyContainer.ContainerProxy proxy1 = toxiproxy.getProxy("hostname1", 8080); - assertThat(proxy1.getOriginalProxyPort()).as("original port is correct").isEqualTo(8667); - assertThat(proxy1.getProxyPort()) - .as("mapped port is correct") - .isEqualTo(toxiproxy.getMappedPort(proxy1.getOriginalProxyPort())); - - final ToxiproxyContainer.ContainerProxy proxy2 = toxiproxy.getProxy("hostname2", 9090); - assertThat(proxy2.getOriginalProxyPort()).as("original port is correct").isEqualTo(8668); - assertThat(proxy2.getProxyPort()) - .as("mapped port is correct") - .isEqualTo(toxiproxy.getMappedPort(proxy2.getOriginalProxyPort())); - } - - @Test - public void testProxyName() { - final ToxiproxyContainer.ContainerProxy proxy = toxiproxy.getProxy("hostname", 7070); - - assertThat(proxy.getName()).as("proxy name is hostname and port").isEqualTo("hostname:7070"); - } - private void checkCallWithLatency( Jedis jedis, final String description, From cb3498960d6a0d1d9b0e51767daed8cae6c5b20a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 17:16:26 -0600 Subject: [PATCH 0917/1224] Add Trino container implementation under org.testcontainers.trino (#11092) --- docs/modules/databases/trino.md | 2 +- .../containers/TrinoContainer.java | 3 + .../testcontainers/trino/TrinoContainer.java | 108 ++++++++++++++++++ .../TrinoContainerTest.java | 6 +- 4 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 modules/trino/src/main/java/org/testcontainers/trino/TrinoContainer.java rename modules/trino/src/test/java/org/testcontainers/{containers => trino}/TrinoContainerTest.java (93%) diff --git a/docs/modules/databases/trino.md b/docs/modules/databases/trino.md index a7ab7495de8..9cb6be8bb5b 100644 --- a/docs/modules/databases/trino.md +++ b/docs/modules/databases/trino.md @@ -7,7 +7,7 @@ Testcontainers module for [Trino](https://hub.docker.com/r/trinodb/trino) You can start a Trino container instance from any Java application by using: -[Container creation](../../../modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java) inside_block:container +[Container creation](../../../modules/trino/src/test/java/org/testcontainers/trino/TrinoContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all database container types. diff --git a/modules/trino/src/main/java/org/testcontainers/containers/TrinoContainer.java b/modules/trino/src/main/java/org/testcontainers/containers/TrinoContainer.java index 19da8d9252a..4f61b6e2352 100644 --- a/modules/trino/src/main/java/org/testcontainers/containers/TrinoContainer.java +++ b/modules/trino/src/main/java/org/testcontainers/containers/TrinoContainer.java @@ -15,7 +15,10 @@ * Supported image: {@code trinodb/trino} *

    * Exposed ports: 8080 + * + * @deprecated use {@link org.testcontainers.trino.TrinoContainer} instead. */ +@Deprecated public class TrinoContainer extends JdbcDatabaseContainer { static final String NAME = "trino"; diff --git a/modules/trino/src/main/java/org/testcontainers/trino/TrinoContainer.java b/modules/trino/src/main/java/org/testcontainers/trino/TrinoContainer.java new file mode 100644 index 00000000000..145ae4b454c --- /dev/null +++ b/modules/trino/src/main/java/org/testcontainers/trino/TrinoContainer.java @@ -0,0 +1,108 @@ +package org.testcontainers.trino; + +import com.google.common.base.Strings; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.VisibleForTesting; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.utility.DockerImageName; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Set; + +/** + * Testcontainers implementation for TrinoDB. + *

    + * Supported image: {@code trinodb/trino} + *

    + * Exposed ports: 8080 + */ +public class TrinoContainer extends JdbcDatabaseContainer { + + static final String NAME = "trino"; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("trinodb/trino"); + + static final String IMAGE = "trinodb/trino"; + + @VisibleForTesting + static final String DEFAULT_TAG = "352"; + + private static final int TRINO_PORT = 8080; + + private String username = "test"; + + private String catalog = null; + + public TrinoContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public TrinoContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + addExposedPort(TRINO_PORT); + } + + /** + * @return the ports on which to check if the container is ready + * @deprecated use {@link #getLivenessCheckPortNumbers()} instead + */ + @NotNull + @Override + @Deprecated + protected Set getLivenessCheckPorts() { + return super.getLivenessCheckPorts(); + } + + @Override + public String getDriverClassName() { + return "io.trino.jdbc.TrinoDriver"; + } + + @Override + public String getJdbcUrl() { + return String.format( + "jdbc:trino://%s:%s/%s", + getHost(), + getMappedPort(TRINO_PORT), + Strings.nullToEmpty(catalog) + ); + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return ""; + } + + @Override + public String getDatabaseName() { + return catalog; + } + + @Override + public String getTestQueryString() { + return "SELECT count(*) FROM tpch.tiny.nation"; + } + + @Override + public TrinoContainer withUsername(final String username) { + this.username = username; + return this; + } + + @Override + public TrinoContainer withDatabaseName(String dbName) { + this.catalog = dbName; + return this; + } + + public Connection createConnection() throws SQLException, NoDriverFoundException { + return createConnection(""); + } +} diff --git a/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java b/modules/trino/src/test/java/org/testcontainers/trino/TrinoContainerTest.java similarity index 93% rename from modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java rename to modules/trino/src/test/java/org/testcontainers/trino/TrinoContainerTest.java index a12df1bcda7..c76c1bbb322 100644 --- a/modules/trino/src/test/java/org/testcontainers/containers/TrinoContainerTest.java +++ b/modules/trino/src/test/java/org/testcontainers/trino/TrinoContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.trino; import org.junit.jupiter.api.Test; import org.testcontainers.TrinoTestImages; @@ -24,9 +24,7 @@ void testSimple() throws Exception { ResultSet resultSet = statement.executeQuery("SELECT DISTINCT node_version FROM system.runtime.nodes") ) { assertThat(resultSet.next()).as("results").isTrue(); - assertThat(resultSet.getString("node_version")) - .as("Trino version") - .isEqualTo(TrinoContainer.DEFAULT_TAG); + assertThat(resultSet.getString("node_version")).as("Trino version").isEqualTo("352"); assertContainerHasCorrectExposedAndLivenessCheckPorts(trino); } } From f56a6281a0f4a6483712b34050d7dc492991f040 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 17:16:34 -0600 Subject: [PATCH 0918/1224] Move TiDB tests under org.testcontainers.tidb (#11093) --- docs/modules/databases/tidb.md | 2 +- .../tidb/SimpleTiDBTest.java => tidb/TiDBContainerTest.java} | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) rename modules/tidb/src/test/java/org/testcontainers/{junit/tidb/SimpleTiDBTest.java => tidb/TiDBContainerTest.java} (93%) diff --git a/docs/modules/databases/tidb.md b/docs/modules/databases/tidb.md index 6ecc12de05b..3dfdc743bbe 100644 --- a/docs/modules/databases/tidb.md +++ b/docs/modules/databases/tidb.md @@ -7,7 +7,7 @@ Testcontainers module for [TiDB](https://hub.docker.com/r/pingcap/tidb) You can start a TiDB container instance from any Java application by using: -[Container creation](../../../modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java) inside_block:container +[Container creation](../../../modules/tidb/src/test/java/org/testcontainers/tidb/TiDBContainerTest.java) inside_block:container See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. diff --git a/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java b/modules/tidb/src/test/java/org/testcontainers/tidb/TiDBContainerTest.java similarity index 93% rename from modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java rename to modules/tidb/src/test/java/org/testcontainers/tidb/TiDBContainerTest.java index 9323e7d21ac..54ded93e69e 100644 --- a/modules/tidb/src/test/java/org/testcontainers/junit/tidb/SimpleTiDBTest.java +++ b/modules/tidb/src/test/java/org/testcontainers/tidb/TiDBContainerTest.java @@ -1,16 +1,15 @@ -package org.testcontainers.junit.tidb; +package org.testcontainers.tidb; import org.junit.jupiter.api.Test; import org.testcontainers.TiDBTestImages; import org.testcontainers.db.AbstractContainerDatabaseTest; -import org.testcontainers.tidb.TiDBContainer; import java.sql.ResultSet; import java.sql.SQLException; import static org.assertj.core.api.Assertions.assertThat; -class SimpleTiDBTest extends AbstractContainerDatabaseTest { +class TiDBContainerTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { From 71996afc78fc1ea02aa20ca4fbb5ce5c0be21bae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 17:16:43 -0600 Subject: [PATCH 0919/1224] Add DB2 container implementation under org.testcontainers.db2 (#11094) --- docs/modules/databases/db2.md | 6 +- .../containers/Db2Container.java | 2 + .../org/testcontainers/db2/Db2Container.java | 143 ++++++++++++++++++ .../org/testcontainers/Db2TestImages.java | 2 +- .../Db2ContainerTest.java} | 7 +- 5 files changed, 151 insertions(+), 9 deletions(-) create mode 100644 modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java rename modules/db2/src/test/java/org/testcontainers/{junit/db2/SimpleDb2Test.java => db2/Db2ContainerTest.java} (88%) diff --git a/docs/modules/databases/db2.md b/docs/modules/databases/db2.md index fde68a77afe..7a5ba79a86f 100644 --- a/docs/modules/databases/db2.md +++ b/docs/modules/databases/db2.md @@ -1,19 +1,17 @@ # DB2 Module -Testcontainers module for [DB2](https://hub.docker.com/r/ibmcom/db2) +Testcontainers module for [DB2](https://www.ibm.com/docs/en/db2/11.5.x?topic=deployments-db2-community-edition-docker) ## Usage example You can start a DB2 container instance from any Java application by using: -[Container definition](../../../modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java) inside_block:container +[Container definition](../../../modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java) inside_block:container !!! warning "EULA Acceptance" Due to licencing restrictions you are required to accept an EULA for this container image. To indicate that you accept the DB2 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: `ibmcom/db2:11.5.0.0a` (or, if you are overriding the docker image name/tag, update accordingly). - - Please see the [`ibmcom/db2` image documentation](https://hub.docker.com/r/ibmcom/db2) for a link to the EULA document. See [Database containers](./index.md) for documentation and usage that is common to all relational database container types. 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 18fb4aac0e6..9f5b9dfde89 100644 --- a/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java +++ b/modules/db2/src/main/java/org/testcontainers/containers/Db2Container.java @@ -18,7 +18,9 @@ *

      *
    • Database: 50000
    • *
    + * @deprecated use {@link org.testcontainers.db2.Db2Container} instead. */ +@Deprecated public class Db2Container extends JdbcDatabaseContainer { public static final String NAME = "db2"; diff --git a/modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java b/modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java new file mode 100644 index 00000000000..bdd182599e5 --- /dev/null +++ b/modules/db2/src/main/java/org/testcontainers/db2/Db2Container.java @@ -0,0 +1,143 @@ +package org.testcontainers.db2; + +import com.github.dockerjava.api.model.Capability; +import org.testcontainers.containers.JdbcDatabaseContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.LicenseAcceptance; + +import java.time.Duration; +import java.util.Set; + +/** + * Testcontainers implementation for IBM DB2. + *

    + * Supported images: {@code icr.io/db2_community/db2}, {@code ibmcom/db2} + *

    + * Exposed ports: + *

      + *
    • Database: 50000
    • + *
    + */ +public class Db2Container extends JdbcDatabaseContainer { + + public static final String NAME = "db2"; + + private static final DockerImageName DEFAULT_NEW_IMAGE_NAME = DockerImageName.parse("icr.io/db2_community/db2"); + + public static final int DB2_PORT = 50000; + + private String databaseName = "test"; + + private String username = "db2inst1"; + + private String password = "foobar1234"; + + public Db2Container(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public Db2Container(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_NEW_IMAGE_NAME); + + withCreateContainerCmdModifier(cmd -> cmd.withCapAdd(Capability.IPC_LOCK).withCapAdd(Capability.IPC_OWNER)); + waitingFor(Wait.forLogMessage(".*Setup has completed\\..*", 1).withStartupTimeout(Duration.ofMinutes(10))); + + addExposedPort(DB2_PORT); + } + + /** + * @return the ports on which to check if the container is ready + * @deprecated use {@link #getLivenessCheckPortNumbers()} instead + */ + @Override + @Deprecated + protected Set getLivenessCheckPorts() { + return super.getLivenessCheckPorts(); + } + + @Override + protected void configure() { + // If license was not accepted programmatically, check if it was accepted via resource file + if (!getEnvMap().containsKey("LICENSE")) { + LicenseAcceptance.assertLicenseAccepted(this.getDockerImageName()); + acceptLicense(); + } + + addEnv("DBNAME", databaseName); + addEnv("DB2INSTANCE", username); + addEnv("DB2INST1_PASSWORD", password); + + // These settings help the DB2 container start faster + if (!getEnvMap().containsKey("AUTOCONFIG")) { + addEnv("AUTOCONFIG", "false"); + } + if (!getEnvMap().containsKey("ARCHIVE_LOGS")) { + addEnv("ARCHIVE_LOGS", "false"); + } + } + + /** + * Accepts the license for the DB2 container by setting the LICENSE=accept + * variable as described at https://hub.docker.com/r/ibmcom/db2 + */ + public Db2Container acceptLicense() { + addEnv("LICENSE", "accept"); + return this; + } + + @Override + public String getDriverClassName() { + return "com.ibm.db2.jcc.DB2Driver"; + } + + @Override + public String getJdbcUrl() { + String additionalUrlParams = constructUrlParameters(":", ";", ";"); + return "jdbc:db2://" + getHost() + ":" + getMappedPort(DB2_PORT) + "/" + databaseName + additionalUrlParams; + } + + @Override + public String getUsername() { + return username; + } + + @Override + public String getPassword() { + return password; + } + + @Override + public String getDatabaseName() { + return databaseName; + } + + @Override + public Db2Container withUsername(String username) { + this.username = username; + return this; + } + + @Override + public Db2Container withPassword(String password) { + this.password = password; + return this; + } + + @Override + public Db2Container withDatabaseName(String dbName) { + this.databaseName = dbName; + return this; + } + + @Override + protected void waitUntilContainerStarted() { + getWaitStrategy().waitUntilReady(this); + } + + @Override + protected String getTestQueryString() { + return "SELECT 1 FROM SYSIBM.SYSDUMMY1"; + } +} diff --git a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java index b0bfc869272..002d030b1c5 100644 --- a/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java +++ b/modules/db2/src/test/java/org/testcontainers/Db2TestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface Db2TestImages { - DockerImageName DB2_IMAGE = DockerImageName.parse("ibmcom/db2:11.5.0.0a"); + DockerImageName DB2_IMAGE = DockerImageName.parse("icr.io/db2_community/db2:11.5.8.0"); } diff --git a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java b/modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java similarity index 88% rename from modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java rename to modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java index 95222330e09..6b17d1583f7 100644 --- a/modules/db2/src/test/java/org/testcontainers/junit/db2/SimpleDb2Test.java +++ b/modules/db2/src/test/java/org/testcontainers/db2/Db2ContainerTest.java @@ -1,8 +1,7 @@ -package org.testcontainers.junit.db2; +package org.testcontainers.db2; import org.junit.jupiter.api.Test; import org.testcontainers.Db2TestImages; -import org.testcontainers.containers.Db2Container; import org.testcontainers.db.AbstractContainerDatabaseTest; import java.sql.ResultSet; @@ -10,12 +9,12 @@ import static org.assertj.core.api.Assertions.assertThat; -class SimpleDb2Test extends AbstractContainerDatabaseTest { +class Db2ContainerTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - Db2Container db2 = new Db2Container("ibmcom/db2:11.5.0.0a").acceptLicense() + Db2Container db2 = new Db2Container("icr.io/db2_community/db2:11.5.8.0").acceptLicense() // } ) { db2.start(); From 154025623acc70b2f59da30141e808b978267f3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 17:17:08 -0600 Subject: [PATCH 0920/1224] Add MongoDB container implementation under org.testcontainers.mongodb (#11095) --- docs/modules/databases/mongodb.md | 4 +- .../containers/MongoDBContainer.java | 3 + .../mongodb/MongoDBContainer.java | 207 ++++++++++++++++++ .../AbstractMongo.java | 2 +- .../CompatibleImageTest.java | 6 +- .../MongoDBContainerTest.java | 8 +- 6 files changed, 220 insertions(+), 10 deletions(-) create mode 100644 modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBContainer.java rename modules/mongodb/src/test/java/org/testcontainers/{containers => mongodb}/AbstractMongo.java (98%) rename modules/mongodb/src/test/java/org/testcontainers/{containers => mongodb}/CompatibleImageTest.java (88%) rename modules/mongodb/src/test/java/org/testcontainers/{containers => mongodb}/MongoDBContainerTest.java (74%) diff --git a/docs/modules/databases/mongodb.md b/docs/modules/databases/mongodb.md index 0d410d115d5..cbd82aabc33 100644 --- a/docs/modules/databases/mongodb.md +++ b/docs/modules/databases/mongodb.md @@ -12,13 +12,13 @@ The MongoDB module provides two Testcontainers for MongoDB unit testing: The following example shows how to create a MongoDBContainer: -[Creating a MongoDB container](../../../modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java) inside_block:creatingMongoDBContainer +[Creating a MongoDB container](../../../modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBContainerTest.java) inside_block:creatingMongoDBContainer And how to start it: -[Starting a MongoDB container](../../../modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java) inside_block:startingMongoDBContainer +[Starting a MongoDB container](../../../modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBContainerTest.java) inside_block:startingMongoDBContainer !!! note diff --git a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java index e0bb04bb166..b986a720964 100644 --- a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java +++ b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java @@ -16,8 +16,11 @@ * Supported images: {@code mongo}, {@code mongodb/mongodb-community-server}, {@code mongodb/mongodb-enterprise-server} *

    * Exposed ports: 27017 + * + * @deprecated use {@link org.testcontainers.mongodb.MongoDBContainer} instead. */ @Slf4j +@Deprecated public class MongoDBContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mongo"); diff --git a/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBContainer.java new file mode 100644 index 00000000000..c61be6675ba --- /dev/null +++ b/modules/mongodb/src/main/java/org/testcontainers/mongodb/MongoDBContainer.java @@ -0,0 +1,207 @@ +package org.testcontainers.mongodb; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.NonNull; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.MountableFile; + +import java.io.IOException; + +/** + * Testcontainers implementation for MongoDB. + *

    + * Supported images: {@code mongo}, {@code mongodb/mongodb-community-server}, {@code mongodb/mongodb-enterprise-server} + *

    + * Exposed ports: 27017 + */ +@Slf4j +public class MongoDBContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("mongo"); + + private static final DockerImageName COMMUNITY_SERVER_IMAGE = DockerImageName.parse( + "mongodb/mongodb-community-server" + ); + + private static final DockerImageName ENTERPRISE_SERVER_IMAGE = DockerImageName.parse( + "mongodb/mongodb-enterprise-server" + ); + + private static final int MONGODB_INTERNAL_PORT = 27017; + + private static final int CONTAINER_EXIT_CODE_OK = 0; + + private static final int AWAIT_INIT_REPLICA_SET_ATTEMPTS = 60; + + private static final String MONGODB_DATABASE_NAME_DEFAULT = "test"; + + private static final String STARTER_SCRIPT = "/testcontainers_start.sh"; + + private boolean shardingEnabled; + + private boolean rsEnabled; + + public MongoDBContainer(@NonNull String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public MongoDBContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, COMMUNITY_SERVER_IMAGE, ENTERPRISE_SERVER_IMAGE); + + withExposedPorts(MONGODB_INTERNAL_PORT); + } + + @Override + protected void containerIsStarting(InspectContainerResponse containerInfo) { + if (this.shardingEnabled) { + copyFileToContainer(MountableFile.forClasspathResource("/sharding.sh", 0777), STARTER_SCRIPT); + } + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo, boolean reused) { + if (this.rsEnabled) { + initReplicaSet(reused); + } + } + + private String[] buildMongoEvalCommand(String command) { + return new String[] { + "sh", + "-c", + "mongosh mongo --eval \"" + command + "\" || mongo --eval \"" + command + "\"", + }; + } + + private void checkMongoNodeExitCode(ExecResult execResult) { + if (execResult.getExitCode() != CONTAINER_EXIT_CODE_OK) { + 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(ExecResult execResultWaitForMaster) { + if (execResultWaitForMaster.getExitCode() != CONTAINER_EXIT_CODE_OK) { + 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(boolean reused) { + if (reused && isReplicationSetAlreadyInitialized()) { + log.debug("Replica set already initialized."); + } else { + log.debug("Initializing a single node node replica set..."); + 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 + ); + ExecResult execResultWaitForMaster = execInContainer(buildMongoEvalCommand(buildMongoWaitCommand())); + log.debug(execResultWaitForMaster.getStdout()); + + checkMongoNodeExitCodeAfterWaiting(execResultWaitForMaster); + } + } + + public static class ReplicaSetInitializationException extends RuntimeException { + + ReplicaSetInitializationException(String errorMessage) { + super(errorMessage); + } + } + + @SneakyThrows + private boolean isReplicationSetAlreadyInitialized() { + // since we are creating a replica set with one node, this node must be primary (state = 1) + ExecResult execCheckRsInit = execInContainer( + buildMongoEvalCommand("if(db.adminCommand({replSetGetStatus: 1})['myState'] != 1) quit(900)") + ); + return execCheckRsInit.getExitCode() == CONTAINER_EXIT_CODE_OK; + } + + /** + * Enables replica set on the cluster + * + * @return this + */ + public MongoDBContainer withReplicaSet() { + this.rsEnabled = true; + withCommand("--replSet", "docker-rs"); + waitingFor(Wait.forLogMessage("(?i).*waiting for connections.*", 1)); + return this; + } + + /** + * Enables sharding on the cluster + * + * @return this + */ + public MongoDBContainer withSharding() { + this.shardingEnabled = true; + withCommand("-c", "while [ ! -f " + STARTER_SCRIPT + " ]; do sleep 0.1; done; " + STARTER_SCRIPT); + waitingFor(Wait.forLogMessage("(?i).*mongos ready.*", 1)); + withCreateContainerCmdModifier(cmd -> cmd.withEntrypoint("sh")); + return this; + } + + /** + * Gets a connection string url, unlike {@link #getReplicaSetUrl} this does not point to a + * database + * @return a connection url pointing to a mongodb instance + */ + public String getConnectionString() { + return String.format("mongodb://%s:%d", getHost(), getMappedPort(MONGODB_INTERNAL_PORT)); + } + + /** + * Gets a replica set url for the default {@value #MONGODB_DATABASE_NAME_DEFAULT} database. + * + * @return a replica set url. + */ + public String getReplicaSetUrl() { + return getReplicaSetUrl(MONGODB_DATABASE_NAME_DEFAULT); + } + + /** + * Gets a replica set url for a provided databaseName. + * + * @param databaseName a database name. + * @return a replica set url. + */ + public String getReplicaSetUrl(String databaseName) { + if (!isRunning()) { + throw new IllegalStateException("MongoDBContainer should be started first"); + } + return getConnectionString() + "/" + databaseName; + } +} diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/AbstractMongo.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/AbstractMongo.java similarity index 98% rename from modules/mongodb/src/test/java/org/testcontainers/containers/AbstractMongo.java rename to modules/mongodb/src/test/java/org/testcontainers/mongodb/AbstractMongo.java index 4fe23fbb50c..8bd0f99dbd5 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/AbstractMongo.java +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/AbstractMongo.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.mongodb; import com.mongodb.ReadConcern; import com.mongodb.ReadPreference; diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/CompatibleImageTest.java similarity index 88% rename from modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java rename to modules/mongodb/src/test/java/org/testcontainers/mongodb/CompatibleImageTest.java index 7cd7296c14a..b877dca8954 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/CompatibleImageTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/CompatibleImageTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.mongodb; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoClients; @@ -23,7 +23,7 @@ static String[] image() { void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { - final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10") + MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10").withReplicaSet() // } ) { // startingMongoDBContainer { @@ -36,7 +36,7 @@ void shouldExecuteTransactions() { @ParameterizedTest @MethodSource("image") void shouldSupportSharding(String image) { - try (final MongoDBContainer mongoDBContainer = new MongoDBContainer(image).withSharding()) { + try (MongoDBContainer mongoDBContainer = new MongoDBContainer(image).withSharding()) { mongoDBContainer.start(); final MongoClient mongoClient = MongoClients.create(mongoDBContainer.getReplicaSetUrl()); diff --git a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBContainerTest.java similarity index 74% rename from modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java rename to modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBContainerTest.java index 29d75f80640..816243d769e 100644 --- a/modules/mongodb/src/test/java/org/testcontainers/containers/MongoDBContainerTest.java +++ b/modules/mongodb/src/test/java/org/testcontainers/mongodb/MongoDBContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.mongodb; import org.junit.jupiter.api.Test; @@ -13,7 +13,7 @@ class MongoDBContainerTest extends AbstractMongo { void shouldExecuteTransactions() { try ( // creatingMongoDBContainer { - final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10") + MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10").withReplicaSet() // } ) { // startingMongoDBContainer { @@ -25,14 +25,14 @@ void shouldExecuteTransactions() { @Test void supportsMongoDB_7_0() { - try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0")) { + try (MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:7.0")) { mongoDBContainer.start(); } } @Test void shouldTestDatabaseName() { - try (final MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10")) { + try (MongoDBContainer mongoDBContainer = new MongoDBContainer("mongo:4.0.10")) { mongoDBContainer.start(); final String databaseName = "my-db"; assertThat(mongoDBContainer.getReplicaSetUrl(databaseName)).endsWith(databaseName); From 188c9c2492787eda05db5d6387a7c25500229378 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 18:29:14 -0600 Subject: [PATCH 0921/1224] Add Selenium container implementation under org.testcontainers.selenium (#11096) --- docs/modules/webdriver_containers.md | 24 +- .../containers/BrowserWebDriverContainer.java | 3 + .../selenium/BrowserWebDriverContainer.java | 283 ++++++++++++++++++ .../BaseWebDriverContainerTest.java | 9 +- .../BrowserWebDriverContainerTest.java | 25 +- ...ChromeRecordingWebDriverContainerTest.java | 25 +- .../ChromeWebDriverContainerTest.java | 6 +- .../ContainerWithoutCapabilitiesTest.java | 6 +- ...stomWaitTimeoutWebDriverContainerTest.java | 8 +- .../EdgeWebDriverContainerTest.java | 6 +- .../FirefoxWebDriverContainerTest.java | 6 +- .../LocalServerWebDriverContainerTest.java | 8 +- ...ecificImageNameWebDriverContainerTest.java | 7 +- 13 files changed, 342 insertions(+), 74 deletions(-) create mode 100644 modules/selenium/src/main/java/org/testcontainers/selenium/BrowserWebDriverContainer.java rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/BaseWebDriverContainerTest.java (87%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/BrowserWebDriverContainerTest.java (82%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/ChromeRecordingWebDriverContainerTest.java (88%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/ChromeWebDriverContainerTest.java (69%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/ContainerWithoutCapabilitiesTest.java (74%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/CustomWaitTimeoutWebDriverContainerTest.java (66%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/EdgeWebDriverContainerTest.java (69%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/FirefoxWebDriverContainerTest.java (70%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/LocalServerWebDriverContainerTest.java (87%) rename modules/selenium/src/test/java/org/testcontainers/{junit => selenium}/SpecificImageNameWebDriverContainerTest.java (63%) diff --git a/docs/modules/webdriver_containers.md b/docs/modules/webdriver_containers.md index 65b39bc5a8f..a42f261d79c 100644 --- a/docs/modules/webdriver_containers.md +++ b/docs/modules/webdriver_containers.md @@ -23,14 +23,14 @@ every test. The following field in your JUnit UI test class will prepare a container running Chrome: -[Chrome](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java) inside_block:junitRule +[Chrome](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeWebDriverContainerTest.java) inside_block:junitRule Now, instead of instantiating an instance of WebDriver directly, use the following to obtain an instance inside your test methods: -[RemoteWebDriver](../../modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java) inside_block:getWebDriver +[RemoteWebDriver](../../modules/selenium/src/test/java/org/testcontainers/selenium/LocalServerWebDriverContainerTest.java) inside_block:getWebDriver You can then use this driver instance like a regular WebDriver. @@ -38,7 +38,7 @@ You can then use this driver instance like a regular WebDriver. Note that, if you want to test a **web application running on the host machine** (the machine the JUnit tests are running on - which is quite likely), you'll need to use [the host exposing](../features/networking.md#exposing-host-ports-to-the-container) feature of Testcontainers, e.g.: -[Open Web Page](../../modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java) inside_block:getPage +[Open Web Page](../../modules/selenium/src/test/java/org/testcontainers/selenium/LocalServerWebDriverContainerTest.java) inside_block:getPage @@ -48,9 +48,9 @@ running on - which is quite likely), you'll need to use [the host exposing](../f At the moment, Chrome, Firefox and Edge are supported. To switch, simply change the first parameter to the rule constructor: -[Chrome](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java) inside_block:junitRule -[Firefox](../../modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java) inside_block:junitRule -[Edge](../../modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java) inside_block:junitRule +[Chrome](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeWebDriverContainerTest.java) inside_block:junitRule +[Firefox](../../modules/selenium/src/test/java/org/testcontainers/selenium/FirefoxWebDriverContainerTest.java) inside_block:junitRule +[Edge](../../modules/selenium/src/test/java/org/testcontainers/selenium/EdgeWebDriverContainerTest.java) inside_block:junitRule ### Recording videos @@ -59,8 +59,8 @@ By default, no videos will be recorded. However, you can instruct Testcontainers just for failing tests. -[Record all Tests](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java) inside_block:recordAll -[Record failing Tests](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java) inside_block:recordFailing +[Record all Tests](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java) inside_block:recordAll +[Record failing Tests](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java) inside_block:recordFailing Note that the second parameter of `withRecordingMode` should be a directory where recordings can be saved. @@ -68,13 +68,13 @@ Note that the second parameter of `withRecordingMode` should be a directory wher By default, the video will be recorded in [FLV](https://en.wikipedia.org/wiki/Flash_Video) format, but you can specify it explicitly or change it to [MP4](https://en.wikipedia.org/wiki/MPEG-4_Part_14) using `withRecordingMode` method with `VncRecordingFormat` option: -[Video Format in MP4](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java) inside_block:recordMp4 -[Video Format in FLV](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java) inside_block:recordFlv +[Video Format in MP4](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java) inside_block:recordMp4 +[Video Format in FLV](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java) inside_block:recordFlv If you would like to customise the file name of the recording, or provide a different directory at runtime based on the description of the test and/or its success or failure, you may provide a custom recording file factory as follows: -[CustomRecordingFileFactory](../../modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java) inside_block:withRecordingFileFactory +[CustomRecordingFileFactory](../../modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java) inside_block:withRecordingFileFactory @@ -82,7 +82,7 @@ Note the factory must implement `org.testcontainers.containers.RecordingFileFact ## More examples -A few different examples are shown in [ChromeWebDriverContainerTest.java](https://github.com/testcontainers/testcontainers-java/blob/main/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java). +A few different examples are shown in [ChromeWebDriverContainerTest.java](https://github.com/testcontainers/testcontainers-java/blob/main/modules/selenium/src/test/java/org/testcontainers/selenium/ChromeWebDriverContainerTest.java). ## Adding this module to your project dependencies 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 8cdb6ca611c..53ee8ba5577 100644 --- a/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java +++ b/modules/selenium/src/main/java/org/testcontainers/containers/BrowserWebDriverContainer.java @@ -46,7 +46,10 @@ * {@code selenium/standalone-edge}, {@code selenium/standalone-chrome-debug}, {@code selenium/standalone-firefox-debug} *

    * Exposed ports: 4444 + * + * @deprecated use {@link org.testcontainers.selenium.BrowserWebDriverContainer} instead. */ +@Deprecated public class BrowserWebDriverContainer> extends GenericContainer implements LinkableContainer, TestLifecycleAware { diff --git a/modules/selenium/src/main/java/org/testcontainers/selenium/BrowserWebDriverContainer.java b/modules/selenium/src/main/java/org/testcontainers/selenium/BrowserWebDriverContainer.java new file mode 100644 index 00000000000..97ac23f5d55 --- /dev/null +++ b/modules/selenium/src/main/java/org/testcontainers/selenium/BrowserWebDriverContainer.java @@ -0,0 +1,283 @@ +package org.testcontainers.selenium; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.AccessMode; +import com.github.dockerjava.api.model.Bind; +import com.github.dockerjava.api.model.Volume; +import com.google.common.collect.ImmutableSet; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.SystemUtils; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.DefaultRecordingFileFactory; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.RecordingFileFactory; +import org.testcontainers.containers.VncRecordingContainer; +import org.testcontainers.containers.VncRecordingContainer.VncRecordingFormat; +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; +import org.testcontainers.utility.DockerImageName; + +import java.io.File; +import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; +import java.nio.file.Files; +import java.time.Duration; +import java.util.Optional; +import java.util.Set; + +/** + * A chrome/firefox/custom container based on SeleniumHQ's standalone container sets. + *

    + * Supported images: {@code selenium/standalone-chrome}, {@code selenium/standalone-firefox}, + * {@code selenium/standalone-edge}, {@code selenium/standalone-chrome-debug}, {@code selenium/standalone-firefox-debug} + *

    + * Exposed ports: 4444 + */ +public class BrowserWebDriverContainer + extends GenericContainer + implements TestLifecycleAware { + + private static final DockerImageName CHROME_IMAGE = DockerImageName.parse("selenium/standalone-chrome"); + + private static final DockerImageName FIREFOX_IMAGE = DockerImageName.parse("selenium/standalone-firefox"); + + private static final DockerImageName EDGE_IMAGE = DockerImageName.parse("selenium/standalone-edge"); + + private static final DockerImageName CHROME_DEBUG_IMAGE = DockerImageName.parse("selenium/standalone-chrome-debug"); + + private static final DockerImageName FIREFOX_DEBUG_IMAGE = DockerImageName.parse( + "selenium/standalone-firefox-debug" + ); + + private static final DockerImageName[] COMPATIBLE_IMAGES = new DockerImageName[] { + CHROME_IMAGE, + FIREFOX_IMAGE, + EDGE_IMAGE, + CHROME_DEBUG_IMAGE, + FIREFOX_DEBUG_IMAGE, + }; + + private static final String DEFAULT_PASSWORD = "secret"; + + private static final int SELENIUM_PORT = 4444; + + private static final int VNC_PORT = 5900; + + private static final String NO_PROXY_KEY = "no_proxy"; + + private static final String TC_TEMP_DIR_PREFIX = "tc"; + + private VncRecordingMode recordingMode = VncRecordingMode.RECORD_FAILING; + + private VncRecordingFormat recordingFormat; + + private RecordingFileFactory recordingFileFactory; + + private File vncRecordingDirectory; + + private VncRecordingContainer vncRecordingContainer = null; + + private static final Logger LOGGER = LoggerFactory.getLogger(BrowserWebDriverContainer.class); + + /** + * Constructor taking a specific webdriver container name and tag + * @param dockerImageName Name of the selenium docker image + */ + public BrowserWebDriverContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + /** + * Constructor taking a specific webdriver container name and tag + * @param dockerImageName Name of the selenium docker image + */ + public BrowserWebDriverContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(COMPATIBLE_IMAGES); + + waitingFor(getDefaultWaitStrategy()); + + withRecordingFileFactory(new DefaultRecordingFileFactory()); + // We have to force SKIP mode for the recording by default because we don't know if the image has VNC or not + recordingMode = VncRecordingMode.SKIP; + } + + @NotNull + @Override + protected Set getLivenessCheckPorts() { + Integer seleniumPort = getMappedPort(SELENIUM_PORT); + if (recordingMode == VncRecordingMode.SKIP) { + return ImmutableSet.of(seleniumPort); + } else { + return ImmutableSet.of(seleniumPort, getMappedPort(VNC_PORT)); + } + } + + @Override + protected void configure() { + if (recordingMode != VncRecordingMode.SKIP) { + if (vncRecordingDirectory == null) { + try { + vncRecordingDirectory = Files.createTempDirectory(TC_TEMP_DIR_PREFIX).toFile(); + } catch (IOException e) { + // should never happen as per javadoc, since we use valid prefix + logger().error("Exception while trying to create temp directory", e); + throw new ContainerLaunchException("Exception while trying to create temp directory", e); + } + } + + if (getNetwork() == null) { + withNetwork(Network.SHARED); + } + + vncRecordingContainer = + new VncRecordingContainer(this) + .withVncPassword(DEFAULT_PASSWORD) + .withVncPort(VNC_PORT) + .withVideoFormat(recordingFormat); + } + + String timeZone = System.getProperty("user.timezone"); + + if (timeZone == null || timeZone.isEmpty()) { + timeZone = "Etc/UTC"; + } + + addExposedPorts(SELENIUM_PORT, VNC_PORT); + addEnv("TZ", timeZone); + + if (!getEnvMap().containsKey(NO_PROXY_KEY)) { + addEnv(NO_PROXY_KEY, "localhost"); + } + + setCommand("/opt/bin/entry_point.sh"); + + if (getShmSize() == null) { + if (SystemUtils.IS_OS_WINDOWS) { + withSharedMemorySize(512 * FileUtils.ONE_MB); + } else { + this.getBinds().add(new Bind("/dev/shm", new Volume("/dev/shm"), AccessMode.rw)); + } + } + + /* + * Some unreliability of the selenium browser containers has been observed, so allow multiple attempts to start. + */ + setStartupAttempts(3); + } + + public URL getSeleniumAddress() { + try { + return new URL("http", getHost(), getMappedPort(SELENIUM_PORT), "/wd/hub"); + } catch (MalformedURLException e) { + e.printStackTrace(); // TODO + return null; + } + } + + public String getVncAddress() { + return "vnc://vnc:secret@" + getHost() + ":" + getMappedPort(VNC_PORT); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + if (vncRecordingContainer != null) { + LOGGER.debug("Starting VNC recording"); + vncRecordingContainer.start(); + } + } + + @Override + public void afterTest(TestDescription description, Optional throwable) { + retainRecordingIfNeeded(description.getFilesystemFriendlyName(), !throwable.isPresent()); + } + + @Override + public void stop() { + if (vncRecordingContainer != null) { + try { + vncRecordingContainer.stop(); + } catch (Exception e) { + LOGGER.debug("Failed to stop vncRecordingContainer", e); + } + vncRecordingContainer = null; + } + + super.stop(); + } + + private void retainRecordingIfNeeded(String prefix, boolean succeeded) { + final boolean shouldRecord; + switch (recordingMode) { + case RECORD_ALL: + shouldRecord = true; + break; + case RECORD_FAILING: + shouldRecord = !succeeded; + break; + default: + shouldRecord = false; + break; + } + + if (shouldRecord) { + File recordingFile = recordingFileFactory.recordingFileForTest( + vncRecordingDirectory, + prefix, + succeeded, + vncRecordingContainer.getVideoFormat() + ); + LOGGER.info("Screen recordings for test {} will be stored at: {}", prefix, recordingFile); + + vncRecordingContainer.saveRecordingToFile(recordingFile); + } + } + + public BrowserWebDriverContainer withRecordingMode(VncRecordingMode recordingMode, File vncRecordingDirectory) { + return withRecordingMode(recordingMode, vncRecordingDirectory, null); + } + + public BrowserWebDriverContainer withRecordingMode( + VncRecordingMode recordingMode, + File vncRecordingDirectory, + VncRecordingFormat recordingFormat + ) { + this.recordingMode = recordingMode; + this.vncRecordingDirectory = vncRecordingDirectory; + this.recordingFormat = recordingFormat; + return self(); + } + + public BrowserWebDriverContainer withRecordingFileFactory(RecordingFileFactory recordingFileFactory) { + this.recordingFileFactory = recordingFileFactory; + return self(); + } + + private WaitStrategy getDefaultWaitStrategy() { + final WaitStrategy logWaitStrategy = new LogMessageWaitStrategy() + .withRegEx( + ".*(RemoteWebDriver instances should connect to|Selenium Server is up and running|Started Selenium Standalone).*\n" + ) + .withStartupTimeout(Duration.ofMinutes(1)); + + return new WaitAllStrategy() + .withStrategy(logWaitStrategy) + .withStrategy(new HostPortWaitStrategy()) + .withStartupTimeout(Duration.ofMinutes(1)); + } + + public enum VncRecordingMode { + SKIP, + RECORD_ALL, + RECORD_FAILING, + } +} diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/BaseWebDriverContainerTest.java similarity index 87% rename from modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/BaseWebDriverContainerTest.java index bb35b664301..eb7f946b6fa 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/BaseWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/BaseWebDriverContainerTest.java @@ -1,10 +1,9 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.openqa.selenium.By; import org.openqa.selenium.Capabilities; import org.openqa.selenium.WebElement; import org.openqa.selenium.remote.RemoteWebDriver; -import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; @@ -30,7 +29,7 @@ public class BaseWebDriverContainerTest { HELLO_WORLD.start(); } - protected static void doSimpleExplore(BrowserWebDriverContainer rule, Capabilities capabilities) { + protected static void doSimpleExplore(BrowserWebDriverContainer rule, Capabilities capabilities) { RemoteWebDriver driver = new RemoteWebDriver(rule.getSeleniumAddress(), capabilities); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30)); System.out.println("Selenium remote URL is: " + rule.getSeleniumAddress()); @@ -46,11 +45,11 @@ protected static void doSimpleExplore(BrowserWebDriverContainer rule, Capabil } protected void assertBrowserNameIs( - BrowserWebDriverContainer rule, + BrowserWebDriverContainer container, String expectedName, Capabilities capabilities ) { - RemoteWebDriver driver = new RemoteWebDriver(rule.getSeleniumAddress(), capabilities); + RemoteWebDriver driver = new RemoteWebDriver(container.getSeleniumAddress(), capabilities); driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30)); String actual = driver.getCapabilities().getBrowserName(); assertThat(actual).as(String.format("actual browser name is %s", actual)).isEqualTo(expectedName); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/BrowserWebDriverContainerTest.java similarity index 82% rename from modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/BrowserWebDriverContainerTest.java index d41b59fe7ed..b5e632cd217 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/BrowserWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/BrowserWebDriverContainerTest.java @@ -1,12 +1,9 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import com.github.dockerjava.api.command.InspectContainerResponse; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.SystemUtils; import org.junit.jupiter.api.Test; -import org.openqa.selenium.chrome.ChromeOptions; -import org.openqa.selenium.firefox.FirefoxOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; import java.util.Collections; import java.util.List; @@ -24,8 +21,9 @@ class BrowserWebDriverContainerTest { @Test void honorPresetNoProxyEnvironment() { try ( - BrowserWebDriverContainer chromeWithNoProxySet = (BrowserWebDriverContainer) new BrowserWebDriverContainer() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chromeWithNoProxySet = new BrowserWebDriverContainer( + "selenium/standalone-chrome:4.13.0" + ) .withEnv(NO_PROXY_KEY, NO_PROXY_VALUE) ) { chromeWithNoProxySet.start(); @@ -38,8 +36,9 @@ void honorPresetNoProxyEnvironment() { @Test void provideDefaultNoProxyEnvironmentIfNotSet() { try ( - BrowserWebDriverContainer chromeWithoutNoProxySet = new BrowserWebDriverContainer() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chromeWithoutNoProxySet = new BrowserWebDriverContainer( + "selenium/standalone-chrome:4.13.0" + ) ) { chromeWithoutNoProxySet.start(); @@ -52,8 +51,9 @@ void provideDefaultNoProxyEnvironmentIfNotSet() { void createContainerWithShmVolume() { assumeThat(SystemUtils.IS_OS_WINDOWS).isTrue(); try ( - BrowserWebDriverContainer webDriverContainer = new BrowserWebDriverContainer() - .withCapabilities(new FirefoxOptions()) + BrowserWebDriverContainer webDriverContainer = new BrowserWebDriverContainer( + "selenium/standalone-firefox:4.13.0" + ) ) { webDriverContainer.start(); @@ -68,9 +68,10 @@ void createContainerWithShmVolume() { @Test void createContainerWithoutShmVolume() { try ( - BrowserWebDriverContainer webDriverContainer = new BrowserWebDriverContainer<>() + BrowserWebDriverContainer webDriverContainer = new BrowserWebDriverContainer( + "selenium/standalone-firefox:4.13.0" + ) .withSharedMemorySize(512 * FileUtils.ONE_MB) - .withCapabilities(new FirefoxOptions()) ) { webDriverContainer.start(); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java similarity index 88% rename from modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java index 2c6fa241469..dbb39b86599 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeRecordingWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/ChromeRecordingWebDriverContainerTest.java @@ -1,18 +1,17 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import com.google.common.io.PatternFilenameFilter; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.openqa.selenium.chrome.ChromeOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; -import org.testcontainers.containers.BrowserWebDriverContainer.VncRecordingMode; import org.testcontainers.containers.DefaultRecordingFileFactory; import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.VncRecordingContainer; import org.testcontainers.containers.VncRecordingContainer.VncRecordingFormat; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; import org.testcontainers.lifecycle.TestDescription; +import org.testcontainers.selenium.BrowserWebDriverContainer.VncRecordingMode; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; @@ -46,8 +45,7 @@ void recordingTestThatShouldBeRecordedAndRetainedInFlvFormatAsDefault() throws I try ( // recordAll { // To do this, simply add extra parameters to the rule constructor, so video will default to FLV format: - BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") .withRecordingMode(VncRecordingMode.RECORD_ALL, target) // } .withRecordingFileFactory(new DefaultRecordingFileFactory()) @@ -58,7 +56,7 @@ void recordingTestThatShouldBeRecordedAndRetainedInFlvFormatAsDefault() throws I } } - private File[] runSimpleExploreInContainer(BrowserWebDriverContainer container, String fileNamePattern) + private File[] runSimpleExploreInContainer(BrowserWebDriverContainer container, String fileNamePattern) throws InterruptedException { container.start(); @@ -88,8 +86,7 @@ void recordingTestShouldHaveFlvExtension() throws InterruptedException { try ( // recordFlv { // Set (explicitly) FLV format for recorded video: - BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") .withRecordingMode(VncRecordingMode.RECORD_ALL, target, VncRecordingFormat.FLV) // } .withRecordingFileFactory(new DefaultRecordingFileFactory()) @@ -106,8 +103,7 @@ void recordingTestShouldHaveMp4Extension() throws InterruptedException { try ( // recordMp4 { // Set MP4 format for recorded video: - BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") .withRecordingMode(VncRecordingMode.RECORD_ALL, target, VncRecordingFormat.MP4) // } .withRecordingFileFactory(new DefaultRecordingFileFactory()) @@ -122,8 +118,7 @@ void recordingTestShouldHaveMp4Extension() throws InterruptedException { void recordingTestThatShouldHaveCorrectDuration() throws IOException, InterruptedException { MountableFile mountableFile; try ( - BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") .withRecordingMode(VncRecordingMode.RECORD_ALL, vncRecordingDirectory.toFile()) .withRecordingFileFactory(new DefaultRecordingFileFactory()) .withNetwork(NETWORK) @@ -168,9 +163,8 @@ class ChromeThatRecordsFailingTests { void recordingTestThatShouldBeRecordedButNotPersisted() { try ( // withRecordingFileFactory { - BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() + BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") // } - .withCapabilities(new ChromeOptions()) // withRecordingFileFactory { .withRecordingFileFactory(new CustomRecordingFileFactory()) // } @@ -188,8 +182,7 @@ void recordingTestThatShouldBeRecordedAndRetained() throws InterruptedException try ( // recordFailing { // or if you only want videos for test failures: - BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") .withRecordingMode(VncRecordingMode.RECORD_FAILING, target) // } .withRecordingFileFactory(new DefaultRecordingFileFactory()) diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/ChromeWebDriverContainerTest.java similarity index 69% rename from modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/ChromeWebDriverContainerTest.java index 33809568aa6..85f0378f84a 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/ChromeWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/ChromeWebDriverContainerTest.java @@ -1,15 +1,13 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; class ChromeWebDriverContainerTest extends BaseWebDriverContainerTest { // junitRule { - public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") // } .withNetwork(NETWORK); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/ContainerWithoutCapabilitiesTest.java similarity index 74% rename from modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/ContainerWithoutCapabilitiesTest.java index 2ffc407a9e4..c706a0ce0ef 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/ContainerWithoutCapabilitiesTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/ContainerWithoutCapabilitiesTest.java @@ -1,15 +1,15 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.AutoClose; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; class ContainerWithoutCapabilitiesTest extends BaseWebDriverContainerTest { @AutoClose - public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>().withNetwork(NETWORK); + public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") + .withNetwork(NETWORK); @BeforeEach public void setUp() { diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/CustomWaitTimeoutWebDriverContainerTest.java similarity index 66% rename from modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/CustomWaitTimeoutWebDriverContainerTest.java index 757be9a3a3d..61d14bab65f 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/CustomWaitTimeoutWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/CustomWaitTimeoutWebDriverContainerTest.java @@ -1,16 +1,16 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.Test; import org.openqa.selenium.chrome.ChromeOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; import java.time.Duration; import java.time.temporal.ChronoUnit; class CustomWaitTimeoutWebDriverContainerTest extends BaseWebDriverContainerTest { - public BrowserWebDriverContainer chromeWithCustomTimeout = new BrowserWebDriverContainer<>() - .withCapabilities(new ChromeOptions()) + public BrowserWebDriverContainer chromeWithCustomTimeout = new BrowserWebDriverContainer( + "selenium/standalone-chrome:4.13.0" + ) .withStartupTimeout(Duration.of(30, ChronoUnit.SECONDS)) .withNetwork(NETWORK); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/EdgeWebDriverContainerTest.java similarity index 69% rename from modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/EdgeWebDriverContainerTest.java index 40904cff369..d99df91f8e1 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/EdgeWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/EdgeWebDriverContainerTest.java @@ -1,15 +1,13 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.openqa.selenium.edge.EdgeOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; class EdgeWebDriverContainerTest extends BaseWebDriverContainerTest { // junitRule { - public BrowserWebDriverContainer edge = new BrowserWebDriverContainer<>() - .withCapabilities(new EdgeOptions()) + public BrowserWebDriverContainer edge = new BrowserWebDriverContainer("selenium/standalone-edge:4.13.0") // } .withNetwork(NETWORK); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/FirefoxWebDriverContainerTest.java similarity index 70% rename from modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/FirefoxWebDriverContainerTest.java index e5003f6ae12..50545168260 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/FirefoxWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/FirefoxWebDriverContainerTest.java @@ -1,15 +1,13 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.openqa.selenium.firefox.FirefoxOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; class FirefoxWebDriverContainerTest extends BaseWebDriverContainerTest { // junitRule { - public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer<>() - .withCapabilities(new FirefoxOptions()) + public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer("selenium/standalone-firefox:4.13.0") // } .withNetwork(NETWORK); diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/LocalServerWebDriverContainerTest.java similarity index 87% rename from modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/LocalServerWebDriverContainerTest.java index 0c93fde97dc..e5819b11786 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/LocalServerWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/LocalServerWebDriverContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -9,7 +9,6 @@ import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.RemoteWebDriver; import org.testcontainers.Testcontainers; -import org.testcontainers.containers.BrowserWebDriverContainer; import static org.assertj.core.api.Assertions.assertThat; @@ -19,9 +18,8 @@ */ class LocalServerWebDriverContainerTest { - public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer<>() - .withAccessToHost(true) - .withCapabilities(new ChromeOptions()); + public BrowserWebDriverContainer chrome = new BrowserWebDriverContainer("selenium/standalone-chrome:4.13.0") + .withAccessToHost(true); private int localPort; diff --git a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java b/modules/selenium/src/test/java/org/testcontainers/selenium/SpecificImageNameWebDriverContainerTest.java similarity index 63% rename from modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java rename to modules/selenium/src/test/java/org/testcontainers/selenium/SpecificImageNameWebDriverContainerTest.java index f8e6c739b82..c01dc5ae97f 100644 --- a/modules/selenium/src/test/java/org/testcontainers/junit/SpecificImageNameWebDriverContainerTest.java +++ b/modules/selenium/src/test/java/org/testcontainers/selenium/SpecificImageNameWebDriverContainerTest.java @@ -1,17 +1,14 @@ -package org.testcontainers.junit; +package org.testcontainers.selenium; import org.junit.jupiter.api.Test; import org.openqa.selenium.firefox.FirefoxOptions; -import org.testcontainers.containers.BrowserWebDriverContainer; import org.testcontainers.utility.DockerImageName; class SpecificImageNameWebDriverContainerTest extends BaseWebDriverContainerTest { private static final DockerImageName FIREFOX_IMAGE = DockerImageName.parse("selenium/standalone-firefox:4.10.0"); - public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer<>(FIREFOX_IMAGE) - .withCapabilities(new FirefoxOptions()) - .withNetwork(NETWORK); + public BrowserWebDriverContainer firefox = new BrowserWebDriverContainer(FIREFOX_IMAGE).withNetwork(NETWORK); @Test void simpleExploreTest() { From 96a3ee749c843c22ce08cf22e99083ce4ede5925 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 9 Oct 2025 19:19:07 -0600 Subject: [PATCH 0922/1224] Add Neo4J container implementation under org.testcontainers.neo4j (#11097) --- docs/modules/databases/neo4j.md | 18 +- .../containers/Neo4jContainer.java | 3 + .../testcontainers/neo4j/Neo4jContainer.java | 358 ++++++++++++++++++ .../Neo4jContainerTest.java | 4 +- 4 files changed, 372 insertions(+), 11 deletions(-) create mode 100644 modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java rename modules/neo4j/src/test/java/org/testcontainers/{containers => neo4j}/Neo4jContainerTest.java (98%) diff --git a/docs/modules/databases/neo4j.md b/docs/modules/databases/neo4j.md index 18f7a957ea2..a8570fe7270 100644 --- a/docs/modules/databases/neo4j.md +++ b/docs/modules/databases/neo4j.md @@ -29,7 +29,7 @@ You are not limited to Unit tests, and you can use an instance of the Neo4j Test A custom password can be provided: -[Custom password](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:withAdminPassword +[Custom password](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:withAdminPassword ### Disable authentication @@ -37,7 +37,7 @@ A custom password can be provided: Authentication can be disabled: -[Disable authentication](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:withoutAuthentication +[Disable authentication](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:withoutAuthentication ### Random password @@ -45,7 +45,7 @@ Authentication can be disabled: A random (`UUID`-random based) password can be set: -[Random password](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:withRandomPassword +[Random password](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:withRandomPassword ### Neo4j-Configuration @@ -54,7 +54,7 @@ Neo4j's Docker image needs Neo4j configuration options in a dedicated format. The container takes care of that, and you can configure the database with standard options like the following: -[Neo4j configuration](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:neo4jConfiguration +[Neo4j configuration](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:neo4jConfiguration ### Add custom plugins @@ -62,13 +62,13 @@ The container takes care of that, and you can configure the database with standa Custom plugins, like APOC, can be copied over to the container from any classpath or host resource like this: -[Plugin jar](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:registerPluginsJar +[Plugin jar](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:registerPluginsJar Whole directories work as well: -[Plugin folder](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:registerPluginsPath +[Plugin folder](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:registerPluginsPath ### Add Neo4j Docker Labs plugins @@ -81,7 +81,7 @@ or [Neo4j 5 plugin list](https://neo4j.com/docs/operations-manual/5/configuratio Please the method `withPlugins(String... plugins)`. -[Configure Neo4j Labs Plugins](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:configureLabsPlugins +[Configure Neo4j Labs Plugins](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:configureLabsPlugins @@ -90,7 +90,7 @@ or [Neo4j 5 plugin list](https://neo4j.com/docs/operations-manual/5/configuratio If you have an existing database (`graph.db`) you want to work with, copy it over to the container like this: -[Copy database](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:copyDatabase +[Copy database](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:copyDatabase !!! note @@ -101,7 +101,7 @@ If you have an existing database (`graph.db`) you want to work with, copy it ove If you need the Neo4j enterprise license, you can declare your Neo4j container like this: -[Enterprise edition](../../../modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java) inside_block:enterpriseEdition +[Enterprise edition](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:enterpriseEdition This creates a Testcontainers based on the Docker image build with the Enterprise version of Neo4j 4.4. 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 bd3499567d4..64c4df9f350 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -30,7 +30,10 @@ *

  • HTTP: 7474
  • *
  • HTTPS: 7473
  • * + * + * @deprecated use {@link org.testcontainers.neo4j.Neo4jContainer} instead. */ +@Deprecated public class Neo4jContainer extends GenericContainer { /** diff --git a/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java new file mode 100644 index 00000000000..23a94c98c8f --- /dev/null +++ b/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java @@ -0,0 +1,358 @@ +package org.testcontainers.neo4j; + +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.containers.wait.strategy.WaitAllStrategy; +import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.ComparableVersion; +import org.testcontainers.utility.DockerImageName; +import org.testcontainers.utility.LicenseAcceptance; +import org.testcontainers.utility.MountableFile; + +import java.net.HttpURLConnection; +import java.time.Duration; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * Testcontainers implementation for Neo4j. + *

    + * Supported image: {@code neo4j} + *

    + * Exposed ports: + *

      + *
    • Bolt: 7687
    • + *
    • HTTP: 7474
    • + *
    • HTTPS: 7473
    • + *
    + */ +public class Neo4jContainer extends GenericContainer { + + /** + * The image defaults to the official Neo4j image: Neo4j. + */ + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("neo4j"); + + /** + * The default tag (version) to use. + */ + private static final String DEFAULT_TAG = "4.4"; + + private static final String ENTERPRISE_TAG = DEFAULT_TAG + "-enterprise"; + + /** + * Default port for the binary Bolt protocol. + */ + private static final int DEFAULT_BOLT_PORT = 7687; + + /** + * The port of the transactional HTTPS endpoint: Neo4j REST API. + */ + private static final int DEFAULT_HTTPS_PORT = 7473; + + /** + * The port of the transactional HTTP endpoint: Neo4j REST API. + */ + private static final int DEFAULT_HTTP_PORT = 7474; + + /** + * The official image requires a change of password by default from "neo4j" to something else. This defaults to "password". + */ + private static final String DEFAULT_ADMIN_PASSWORD = "password"; + + private static final String AUTH_FORMAT = "neo4j/%s"; + + private final boolean standardImage; + + private String adminPassword = DEFAULT_ADMIN_PASSWORD; + + private final Set labsPlugins = new HashSet<>(); + + /** + * Default wait strategies + */ + public static final WaitStrategy WAIT_FOR_BOLT = new LogMessageWaitStrategy() + .withRegEx(String.format(".*Bolt enabled on .*:%d\\.\n", DEFAULT_BOLT_PORT)); + + private static final WaitStrategy WAIT_FOR_HTTP = new HttpWaitStrategy() + .forPort(DEFAULT_HTTP_PORT) + .forStatusCodeMatching(response -> response == HttpURLConnection.HTTP_OK); + + /** + * Creates a Neo4jContainer using a specific docker image. + * + * @param dockerImageName The docker image to use. + */ + public Neo4jContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + /** + * Creates a Neo4jContainer using a specific docker image. + * + * @param dockerImageName The docker image to use. + */ + public Neo4jContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + this.standardImage = dockerImageName.getUnversionedPart().equals(DEFAULT_IMAGE_NAME.getUnversionedPart()); + + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + this.waitStrategy = + new WaitAllStrategy() + .withStrategy(WAIT_FOR_BOLT) + .withStrategy(WAIT_FOR_HTTP) + .withStartupTimeout(Duration.ofMinutes(2)); + + addExposedPorts(DEFAULT_BOLT_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); + } + + @Override + public Set getLivenessCheckPortNumbers() { + return Stream + .of(DEFAULT_BOLT_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT) + .map(this::getMappedPort) + .collect(Collectors.toSet()); + } + + @Override + protected void configure() { + configureAuth(); + configureLabsPlugins(); + configureWaitStrategy(); + } + + /** + * Configured via {@link Neo4jContainer#withAdminPassword(String)} or {@link Neo4jContainer#withoutAuthentication()} + * It is only possible to set the correct auth in the configuration call. + * Also, the custom methods overrule the set env parameter. + */ + private void configureAuth() { + String neo4jAuthEnvKey = "NEO4J_AUTH"; + if (!getEnvMap().containsKey(neo4jAuthEnvKey) || !DEFAULT_ADMIN_PASSWORD.equals(this.adminPassword)) { + boolean emptyAdminPassword = this.adminPassword == null || this.adminPassword.isEmpty(); + String neo4jAuth = emptyAdminPassword ? "none" : String.format(AUTH_FORMAT, this.adminPassword); + addEnv(neo4jAuthEnvKey, neo4jAuth); + } + } + + /** + * Configured via {@link Neo4jContainer#withLabsPlugins}. + * Configuration can only happen in the configuration call because there is no default. + */ + private void configureLabsPlugins() { + String neo4jLabsPluginsEnvKey = "NEO4JLABS_PLUGINS"; + if (!getEnv().contains(neo4jLabsPluginsEnvKey) && !this.labsPlugins.isEmpty()) { + String enabledPlugins = + this.labsPlugins.stream().map(pluginName -> "\"" + pluginName + "\"").collect(Collectors.joining(",")); + + addEnv(neo4jLabsPluginsEnvKey, "[" + enabledPlugins + "]"); + } + } + + /** + * Update the default Neo4jContainer wait strategy based on the exposed ports. + * Still possible to override the startup timeout before starting the container via {@link WaitStrategy#withStartupTimeout(Duration)}. + */ + private void configureWaitStrategy() { + List exposedPorts = getExposedPorts(); + boolean boltExposed = exposedPorts.contains(DEFAULT_BOLT_PORT); + boolean httpExposed = exposedPorts.contains(DEFAULT_HTTP_PORT); + boolean onlyBoltExposed = boltExposed && !httpExposed; + boolean onlyHttpExposed = !boltExposed && httpExposed; + + if (onlyBoltExposed) { + this.waitStrategy = + new WaitAllStrategy().withStrategy(WAIT_FOR_BOLT).withStartupTimeout(Duration.ofMinutes(2)); + } else if (onlyHttpExposed) { + this.waitStrategy = + new WaitAllStrategy().withStrategy(WAIT_FOR_HTTP).withStartupTimeout(Duration.ofMinutes(2)); + } + } + + /** + * @return Bolt URL for use with Neo4j's Java-Driver. + */ + public String getBoltUrl() { + return String.format("bolt://" + getHost() + ":" + getMappedPort(DEFAULT_BOLT_PORT)); + } + + /** + * @return URL of the transactional HTTP endpoint. + */ + public String getHttpUrl() { + return String.format("http://" + getHost() + ":" + getMappedPort(DEFAULT_HTTP_PORT)); + } + + /** + * @return URL of the transactional HTTPS endpoint. + */ + public String getHttpsUrl() { + return String.format("https://" + getHost() + ":" + getMappedPort(DEFAULT_HTTPS_PORT)); + } + + /** + * Configures the container to use the enterprise edition of the default docker image. + *

    + * Please have a look at the Neo4j Licensing page. While the Neo4j + * Community Edition can be used for free in your projects under the GPL v3 license, Neo4j Enterprise edition + * needs either a commercial, education or evaluation license. + * + * @return This container. + */ + public Neo4jContainer withEnterpriseEdition() { + if (!standardImage) { + throw new IllegalStateException( + String.format("Cannot use enterprise version with alternative image %s.", getDockerImageName()) + ); + } + + setDockerImageName(DEFAULT_IMAGE_NAME.withTag(ENTERPRISE_TAG).asCanonicalNameString()); + LicenseAcceptance.assertLicenseAccepted(getDockerImageName()); + + addEnv("NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes"); + + return self(); + } + + /** + * Sets the admin password for the default account (which is
    neo4j
    ). A null value or an empty string + * disables authentication. + * + * @param adminPassword The admin password for the default database account. + * @return This container. + */ + public Neo4jContainer withAdminPassword(final String adminPassword) { + if (adminPassword != null && adminPassword.length() < 8) { + logger().warn("Your provided admin password is too short and will not work with Neo4j 5.3+."); + } + this.adminPassword = adminPassword; + return self(); + } + + /** + * Disables authentication. + * + * @return This container. + */ + public Neo4jContainer withoutAuthentication() { + return withAdminPassword(null); + } + + /** + * Copies an existing {@code graph.db} folder into the container. This can either be a classpath resource or a + * host resource. Please have a look at the factory methods in {@link MountableFile}. + *
    + * If you want to map your database into the container instead of copying them, please use {@code #withClasspathResourceMapping}, + * but this will only work when your test does not run in a container itself. + *
    + * Note: This method only works with Neo4j 3.5. + *
    + * Mapping would work like this: + *
    +     *      @Container
    +     *      private static final Neo4jContainer databaseServer = new Neo4jContainer<>()
    +     *          .withClasspathResourceMapping("/test-graph.db", "/data/databases/graph.db", BindMode.READ_WRITE);
    +     * 
    + * + * @param graphDb The graph.db folder to copy into the container + * @throws IllegalArgumentException If the database version is not 3.5. + * @return This container. + */ + public Neo4jContainer withDatabase(MountableFile graphDb) { + if (!isNeo4jDatabaseVersionSupportingDbCopy()) { + throw new IllegalArgumentException( + "Copying database folder is not supported for Neo4j instances with version 4.0 or higher." + ); + } + return withCopyFileToContainer(graphDb, "/data/databases/graph.db"); + } + + /** + * Adds plugins to the given directory to the container. If {@code plugins} denotes a directory, than all of that + * directory is mapped to Neo4j's plugins. Otherwise, single resources are copied over. + *
    + * If you want to map your plugins into the container instead of copying them, please use {@code #withClasspathResourceMapping}, + * but this will only work when your test does not run in a container itself. + * + * @param plugins + * @return This container. + */ + public Neo4jContainer withPlugins(MountableFile plugins) { + return withCopyFileToContainer(plugins, "/var/lib/neo4j/plugins/"); + } + + /** + * Adds Neo4j configuration properties to the container. The properties can be added as in the official Neo4j + * configuration, the method automatically translate them into the format required by the Neo4j container. + * + * @param key The key to configure, i.e. {@code dbms.security.procedures.unrestricted} + * @param value The value to set + * @return This container. + */ + public Neo4jContainer withNeo4jConfig(String key, String value) { + addEnv(formatConfigurationKey(key), value); + return self(); + } + + /** + * @return The admin password for the neo4j account or literal null if auth is disabled. + */ + public String getAdminPassword() { + return adminPassword; + } + + /** + * Registers one or more Neo4j plugins for server startup. + * The plugins are listed here + * + * + * @param plugins The Neo4j plugins that should get started with the server. + * @return This container. + */ + public Neo4jContainer withPlugins(String... plugins) { + this.labsPlugins.addAll(Arrays.asList(plugins)); + return self(); + } + + private static String formatConfigurationKey(String plainConfigKey) { + final String prefix = "NEO4J_"; + + return String.format("%s%s", prefix, plainConfigKey.replaceAll("_", "__").replaceAll("\\.", "_")); + } + + private boolean isNeo4jDatabaseVersionSupportingDbCopy() { + String usedImageVersion = DockerImageName.parse(getDockerImageName()).getVersionPart(); + ComparableVersion usedComparableVersion = new ComparableVersion(usedImageVersion); + + boolean versionSupportingDbCopy = + usedComparableVersion.isLessThan("4.0") && usedComparableVersion.isGreaterThanOrEqualTo("2"); + + if (versionSupportingDbCopy) { + return true; + } + if (!usedComparableVersion.isSemanticVersion()) { + logger() + .warn( + "Version {} is not a semantic version. The function \"withDatabase\" will fail.", + usedImageVersion + ); + logger().warn("Copying databases is only supported for Neo4j versions 3.5.x"); + } + + return false; + } + + public Neo4jContainer withRandomPassword() { + return withAdminPassword(UUID.randomUUID().toString()); + } +} diff --git a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java similarity index 98% rename from modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java rename to modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java index 997e90c4788..82e8bc16e08 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/containers/Neo4jContainerTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.neo4j; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; @@ -263,7 +263,7 @@ void shouldRespectCustomWaitStrategy() { neo4jContainer.configure(); - assertThat(neo4jContainer.getWaitStrategy()).isInstanceOf(CustomDummyWaitStrategy.class); + assertThat(neo4jContainer).extracting("waitStrategy").isInstanceOf(CustomDummyWaitStrategy.class); } @Test From 9cbe1381ffe0d35c72f3741d1b0520383a7b80ed Mon Sep 17 00:00:00 2001 From: Fokion Sotiropoulos Date: Fri, 10 Oct 2025 06:26:55 +0100 Subject: [PATCH 0923/1224] Add support for specifying Docker image in DockerComposeContainer and ComposeContainer (#9871) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #9222 --------- Co-authored-by: Eddú Meléndez --- .../containers/ComposeContainer.java | 101 ++++++++++++++---- .../containers/DockerComposeContainer.java | 92 +++++++++++++--- .../containers/ComposeContainerTest.java | 49 +++++++++ .../ComposeContainerWithServicesTest.java | 41 +++++-- .../containers/ComposeOverridesTest.java | 71 ++++++------ .../containers/ComposeProfilesOptionTest.java | 22 ++-- ...DockerComposeContainerCustomImageTest.java | 50 +++++++++ ...ockerComposeContainerWithServicesTest.java | 51 +++++++-- .../DockerComposeOverridesTest.java | 72 +++++++------ .../DockerComposeProfilesOptionTest.java | 26 ++--- .../testcontainers/junit/BaseComposeTest.java | 2 +- .../junit/BaseDockerComposeTest.java | 4 +- .../junit/ComposeContainerOverrideTest.java | 11 +- .../junit/ComposeContainerPortViaEnvTest.java | 2 + .../junit/ComposeContainerScalingTest.java | 2 + .../junit/ComposeContainerTest.java | 6 +- .../ComposeContainerVolumeRemovalTest.java | 3 +- .../junit/ComposeContainerWithBuildTest.java | 3 +- .../ComposeContainerWithCopyFilesTest.java | 5 + .../ComposeContainerWithOptionsTest.java | 17 +-- .../ComposeContainerWithWaitStrategies.java | 11 +- .../junit/ComposeErrorHandlingTest.java | 6 +- .../junit/ComposePassthroughTest.java | 2 + .../junit/ComposeWaitStrategyTest.java | 7 +- .../junit/ComposeWithIdentifierTest.java | 2 + .../junit/ComposeWithNetworkTest.java | 2 + .../DockerComposeContainerPortViaEnvTest.java | 4 + .../DockerComposeContainerScalingTest.java | 2 + .../junit/DockerComposeContainerTest.java | 5 + ...ckerComposeContainerVolumeRemovalTest.java | 6 +- .../DockerComposeContainerWithBuildTest.java | 6 +- ...ckerComposeContainerWithCopyFilesTest.java | 4 + ...DockerComposeContainerWithOptionsTest.java | 19 ++-- .../junit/DockerComposeErrorHandlingTest.java | 2 + .../junit/DockerComposeLocalImageTest.java | 2 + .../junit/DockerComposeLogConsumerTest.java | 2 + .../junit/DockerComposePassthroughTest.java | 2 + .../junit/DockerComposeServiceTest.java | 4 + .../junit/DockerComposeV2FormatTest.java | 4 + ...ckerComposeV2FormatWithIdentifierTest.java | 4 + .../junit/DockerComposeV2WithNetworkTest.java | 4 + .../junit/DockerComposeWaitStrategyTest.java | 7 +- .../utility/AuthenticatedImagePullTest.java | 7 +- .../jupiter/DockerComposeContainerTests.java | 2 + .../spock/ComposeContainerIT.groovy | 2 + .../spock/SharedComposeContainerIT.groovy | 2 + 46 files changed, 577 insertions(+), 173 deletions(-) create mode 100644 core/src/test/java/org/testcontainers/containers/ComposeContainerTest.java create mode 100644 core/src/test/java/org/testcontainers/containers/DockerComposeContainerCustomImageTest.java diff --git a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java index e8061363a18..539ca957764 100644 --- a/core/src/main/java/org/testcontainers/containers/ComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/ComposeContainer.java @@ -16,6 +16,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -59,7 +60,7 @@ public class ComposeContainer implements Startable { public static final String COMPOSE_EXECUTABLE = SystemUtils.IS_OS_WINDOWS ? "docker.exe" : "docker"; - private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("docker:24.0.2"); + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("docker"); private final ComposeDelegate composeDelegate; @@ -67,28 +68,92 @@ public class ComposeContainer implements Startable { private List filesInDirectory = new ArrayList<>(); + /** + * Creates a new ComposeContainer using the specified Docker image and compose files. + * + * @param image The Docker image to use for the container + * @param composeFiles One or more Docker Compose configuration files + */ + public ComposeContainer(DockerImageName image, File... composeFiles) { + this(image, Arrays.asList(composeFiles)); + } + + /** + * Creates a new ComposeContainer using the specified Docker image and compose files. + * + * @param image The Docker image to use for the container + * @param composeFiles A list of Docker Compose configuration files + */ + public ComposeContainer(DockerImageName image, List composeFiles) { + this(image, Base58.randomString(6).toLowerCase(), composeFiles); + } + + /** + * Creates a new ComposeContainer with the specified Docker image, identifier, and compose files. + * + * @param image The Docker image to use for the container + * @param identifier A unique identifier for this compose environment + * @param composeFiles One or more Docker Compose configuration files + */ + public ComposeContainer(DockerImageName image, String identifier, File... composeFiles) { + this(image, identifier, Arrays.asList(composeFiles)); + } + + /** + * Creates a new ComposeContainer with the specified Docker image, identifier, and a single compose file. + * + * @param image The Docker image to use for the container + * @param identifier A unique identifier for this compose environment + * @param composeFile A Docker Compose configuration file + */ + public ComposeContainer(DockerImageName image, String identifier, File composeFile) { + this(image, identifier, Collections.singletonList(composeFile)); + } + + /** + * Creates a new ComposeContainer with the specified Docker image, identifier, and compose files. + * + * @param image The Docker image to use for the container + * @param identifier A unique identifier for this compose environment + * @param composeFiles A list of Docker Compose configuration files + */ + public ComposeContainer(DockerImageName image, String identifier, List composeFiles) { + image.assertCompatibleWith(DEFAULT_IMAGE_NAME); + this.composeDelegate = + new ComposeDelegate(ComposeDelegate.ComposeVersion.V2, composeFiles, identifier, COMPOSE_EXECUTABLE, image); + this.project = this.composeDelegate.getProject(); + } + + /** + * Use the new constructor {@link #ComposeContainer(DockerImageName image, File... composeFiles)} + */ public ComposeContainer(File... composeFiles) { - this(Arrays.asList(composeFiles)); + this(DEFAULT_IMAGE_NAME, Arrays.asList(composeFiles)); + this.localCompose = true; } + /** + * Use the new constructor {@link #ComposeContainer(DockerImageName image, List composeFiles)} + */ public ComposeContainer(List composeFiles) { - this(Base58.randomString(6).toLowerCase(), composeFiles); + this(DEFAULT_IMAGE_NAME, composeFiles); + this.localCompose = true; } + /** + * Use the new constructor {@link #ComposeContainer(DockerImageName image, String identifier, File... composeFile)} + */ public ComposeContainer(String identifier, File... composeFiles) { - this(identifier, Arrays.asList(composeFiles)); + this(DEFAULT_IMAGE_NAME, identifier, Arrays.asList(composeFiles)); + this.localCompose = true; } + /** + * Use the new constructor {@link #ComposeContainer(DockerImageName image, String identifier, List composeFiles)} + */ public ComposeContainer(String identifier, List composeFiles) { - this.composeDelegate = - new ComposeDelegate( - ComposeDelegate.ComposeVersion.V2, - composeFiles, - identifier, - COMPOSE_EXECUTABLE, - DEFAULT_IMAGE_NAME - ); - this.project = this.composeDelegate.getProject(); + this(DEFAULT_IMAGE_NAME, identifier, composeFiles); + this.localCompose = true; } @Override @@ -234,16 +299,6 @@ public ComposeContainer withEnv(Map env) { return this; } - /** - * Use a local Docker Compose binary instead of a container. - * - * @return this instance, for chaining - */ - public ComposeContainer withLocalCompose(boolean localCompose) { - this.localCompose = localCompose; - return this; - } - /** * Whether to pull images first. * diff --git a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java index dd06b181b42..bfdaf169dd5 100644 --- a/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java +++ b/core/src/main/java/org/testcontainers/containers/DockerComposeContainer.java @@ -16,6 +16,7 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -58,31 +59,103 @@ public class DockerComposeContainer> i public static final String COMPOSE_EXECUTABLE = SystemUtils.IS_OS_WINDOWS ? "docker-compose.exe" : "docker-compose"; - private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("docker/compose:1.29.2"); - private final ComposeDelegate composeDelegate; private String project; private List filesInDirectory = new ArrayList<>(); - @Deprecated + /** + * Creates a new DockerComposeContainer using the specified Docker image and compose files. + * + * @param image The Docker image to use for the container + * @param composeFiles One or more Docker Compose configuration files + */ + public DockerComposeContainer(DockerImageName image, File... composeFiles) { + this(image, Arrays.asList(composeFiles)); + } + + /** + * Creates a new DockerComposeContainer using the specified Docker image and compose files. + * + * @param image The Docker image to use for the container + * @param composeFiles A list of Docker Compose configuration files + */ + public DockerComposeContainer(DockerImageName image, List composeFiles) { + this(image, Base58.randomString(6).toLowerCase(), composeFiles); + } + + /** + * Creates a new DockerComposeContainer with the specified Docker image, identifier, and compose files. + * + * @param image The Docker image to use for the container + * @param identifier A unique identifier for this compose environment + * @param composeFiles One or more Docker Compose configuration files + */ + public DockerComposeContainer(DockerImageName image, String identifier, File... composeFiles) { + this(image, identifier, Arrays.asList(composeFiles)); + } + + /** + * Creates a new DockerComposeContainer with the specified Docker image, identifier, and a single compose file. + * + * @param image The Docker image to use for the container + * @param identifier A unique identifier for this compose environment + * @param composeFile A Docker Compose configuration file + */ + public DockerComposeContainer(DockerImageName image, String identifier, File composeFile) { + this(image, identifier, Collections.singletonList(composeFile)); + } + + /** + * Creates a new DockerComposeContainer with the specified Docker image, identifier, and compose files. + * + * @param image The Docker image to use for the container + * @param identifier A unique identifier for this compose environment + * @param composeFiles A list of Docker Compose configuration files + */ + public DockerComposeContainer(DockerImageName image, String identifier, List composeFiles) { + this.composeDelegate = + new ComposeDelegate(ComposeDelegate.ComposeVersion.V1, composeFiles, identifier, COMPOSE_EXECUTABLE, image); + this.project = this.composeDelegate.getProject(); + } + + /** + * Use the new constructor {@link #DockerComposeContainer(DockerImageName image, String identifier, File composeFile)} + */ public DockerComposeContainer(File composeFile, String identifier) { this(identifier, composeFile); + this.localCompose = true; } + /** + * Use the new constructor {@link #DockerComposeContainer(DockerImageName image, List composeFiles)} + */ public DockerComposeContainer(File... composeFiles) { this(Arrays.asList(composeFiles)); + this.localCompose = true; } + /** + * Use the new constructor {@link #DockerComposeContainer(DockerImageName image, List composeFiles)} + */ + @Deprecated public DockerComposeContainer(List composeFiles) { this(Base58.randomString(6).toLowerCase(), composeFiles); + this.localCompose = true; } + /** + * Use the new constructor {@link #DockerComposeContainer(DockerImageName image, String identifier, File... composeFiles)} + */ public DockerComposeContainer(String identifier, File... composeFiles) { this(identifier, Arrays.asList(composeFiles)); + this.localCompose = true; } + /** + * Use the new constructor {@link #DockerComposeContainer(DockerImageName image, String identifier, List composeFiles)} + */ public DockerComposeContainer(String identifier, List composeFiles) { this.composeDelegate = new ComposeDelegate( @@ -90,9 +163,10 @@ public DockerComposeContainer(String identifier, List composeFiles) { composeFiles, identifier, COMPOSE_EXECUTABLE, - DEFAULT_IMAGE_NAME + DockerImageName.parse("docker/compose:1.29.2") ); this.project = this.composeDelegate.getProject(); + this.localCompose = true; } @Override @@ -234,16 +308,6 @@ public SELF withEnv(Map env) { return self(); } - /** - * Use a local Docker Compose binary instead of a container. - * - * @return this instance, for chaining - */ - public SELF withLocalCompose(boolean localCompose) { - this.localCompose = localCompose; - return self(); - } - /** * Whether to pull images first. * diff --git a/core/src/test/java/org/testcontainers/containers/ComposeContainerTest.java b/core/src/test/java/org/testcontainers/containers/ComposeContainerTest.java new file mode 100644 index 00000000000..cee985d36df --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/ComposeContainerTest.java @@ -0,0 +1,49 @@ +package org.testcontainers.containers; + +import org.junit.jupiter.api.Test; +import org.testcontainers.utility.DockerImageName; + +import java.io.File; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +class ComposeContainerTest { + + public static final String DOCKER_IMAGE = "docker:25.0.2"; + + private static final String COMPOSE_FILE_PATH = "src/test/resources/v2-compose-test.yml"; + + @Test + void testWithCustomDockerImage() { + ComposeContainer composeContainer = new ComposeContainer( + DockerImageName.parse(DOCKER_IMAGE), + new File(COMPOSE_FILE_PATH) + ); + composeContainer.start(); + verifyContainerCreation(composeContainer); + composeContainer.stop(); + } + + @Test + void testWithCustomDockerImageAndIdentifier() { + ComposeContainer composeContainer = new ComposeContainer( + DockerImageName.parse(DOCKER_IMAGE), + "myidentifier", + new File(COMPOSE_FILE_PATH) + ); + composeContainer.start(); + verifyContainerCreation(composeContainer); + composeContainer.stop(); + } + + private void verifyContainerCreation(ComposeContainer composeContainer) { + Optional redis = composeContainer.getContainerByServiceName("redis"); + assertThat(redis) + .hasValueSatisfying(container -> { + assertThat(container.isRunning()).isTrue(); + assertThat(container.getContainerInfo().getConfig().getLabels()) + .containsEntry("com.docker.compose.version", "2.24.5"); + }); + } +} diff --git a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java index 6d141ac08f1..8b3b3fa8fa5 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.rnorth.ducttape.TimeoutException; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.time.Duration; @@ -29,7 +30,10 @@ class ComposeContainerWithServicesTest { @Test void testDesiredSubsetOfServicesAreStarted() { - try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE).withServices("redis")) { + try ( + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + .withServices("redis") + ) { compose.start(); verifyStartedContainers(compose, "redis-1"); @@ -38,7 +42,10 @@ void testDesiredSubsetOfServicesAreStarted() { @Test void testDesiredSubsetOfScaledServicesAreStarted() { - try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE).withScaledService("redis", 2)) { + try ( + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + .withScaledService("redis", 2) + ) { compose.start(); verifyStartedContainers(compose, "redis-1", "redis-2"); @@ -48,7 +55,7 @@ void testDesiredSubsetOfScaledServicesAreStarted() { @Test void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { try ( - ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) .withServices("redis") .withScaledService("redis", 2) ) { @@ -61,7 +68,7 @@ void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { @Test void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { try ( - ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) .withServices("other") .withScaledService("redis", 2) ) { @@ -73,7 +80,9 @@ void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { @Test void testAllServicesAreStartedIfNotSpecified() { - try (ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE)) { + try ( + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + ) { compose.start(); verifyStartedContainers(compose, "redis-1", "other-1"); @@ -82,7 +91,12 @@ void testAllServicesAreStartedIfNotSpecified() { @Test void testScaleInComposeFileIsRespected() { - try (ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_INLINE_SCALE)) { + try ( + ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + COMPOSE_FILE_WITH_INLINE_SCALE + ) + ) { compose.start(); // the compose file includes `scale: 3` for the redis container @@ -95,7 +109,10 @@ void testStartupTimeoutSetsTheHighestTimeout() { assertThat( catchThrowable(() -> { try ( - ComposeContainer compose = new ComposeContainer(SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + SIMPLE_COMPOSE_FILE + ) .withServices("redis") .withStartupTimeout(Duration.ofMillis(1)) .withExposedService( @@ -115,7 +132,10 @@ void testStartupTimeoutSetsTheHighestTimeout() { @Test void testWaitingForHealthcheck() { try ( - ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK) + ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + COMPOSE_FILE_WITH_HEALTHCHECK + ) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) ) { compose.start(); @@ -127,7 +147,10 @@ void testWaitingForHealthcheck() { @Test void testWaitingForHealthcheckWithRestartDoesNotCrash() { try ( - ComposeContainer compose = new ComposeContainer(COMPOSE_FILE_WITH_HEALTHCHECK) + ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + COMPOSE_FILE_WITH_HEALTHCHECK + ) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) ) { compose.start(); diff --git a/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java index 1ed03ae9315..ed948df5bd3 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeOverridesTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.utility.CommandLine; +import org.testcontainers.utility.DockerImageName; import java.io.BufferedReader; import java.io.File; @@ -47,47 +48,49 @@ public static Iterable data() { @ParameterizedTest(name = "{index}: local[{0}], composeFiles[{2}], expectedEnvVar[{1}]") @MethodSource("data") void test(boolean localMode, String expectedEnvVar, File... composeFiles) { + ComposeContainer compose; if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DOCKER_EXECUTABLE)) .as("docker executable exists") .isTrue(); + compose = new ComposeContainer(composeFiles).withExposedService(SERVICE_NAME, SERVICE_PORT); + } else { + compose = + new ComposeContainer(DockerImageName.parse("docker:25.0.2"), composeFiles) + .withExposedService(SERVICE_NAME, SERVICE_PORT); } - try ( - ComposeContainer compose = new ComposeContainer(composeFiles) - .withLocalCompose(localMode) - .withExposedService(SERVICE_NAME, SERVICE_PORT) - ) { - compose.start(); - - BufferedReader br = Unreliables.retryUntilSuccess( - 10, - TimeUnit.SECONDS, - () -> { - Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); - - Socket socket = new Socket( - compose.getServiceHost(SERVICE_NAME, SERVICE_PORT), - compose.getServicePort(SERVICE_NAME, SERVICE_PORT) - ); - return new BufferedReader(new InputStreamReader(socket.getInputStream())); - } - ); - - Unreliables.retryUntilTrue( - 10, - TimeUnit.SECONDS, - () -> { - while (br.ready()) { - String line = br.readLine(); - if (line.contains(expectedEnvVar)) { - return true; - } + + compose.start(); + + BufferedReader br = Unreliables.retryUntilSuccess( + 10, + TimeUnit.SECONDS, + () -> { + Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); + + Socket socket = new Socket( + compose.getServiceHost(SERVICE_NAME, SERVICE_PORT), + compose.getServicePort(SERVICE_NAME, SERVICE_PORT) + ); + return new BufferedReader(new InputStreamReader(socket.getInputStream())); + } + ); + + Unreliables.retryUntilTrue( + 10, + TimeUnit.SECONDS, + () -> { + while (br.ready()) { + String line = br.readLine(); + if (line.contains(expectedEnvVar)) { + return true; } - Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); - return false; } - ); - } + Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); + return false; + } + ); + compose.stop(); } } diff --git a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java index 8a176fdcddb..3770d617ebb 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeProfilesOptionTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.utility.CommandLine; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -20,21 +21,24 @@ public static Boolean[] local() { @ParameterizedTest @MethodSource("local") void testProfileOption(boolean localMode) { + ComposeContainer compose; if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(ComposeContainer.COMPOSE_EXECUTABLE)) .as("docker executable exists") .isTrue(); - } - try ( // composeContainerWithLocalCompose { - ComposeContainer compose = new ComposeContainer(COMPOSE_FILE) - .withLocalCompose(true) - // } - .withOptions("--profile=cache") - ) { - compose.start(); - assertThat(compose.listChildContainers()).hasSize(1); + compose = + new ComposeContainer(COMPOSE_FILE) + // } + .withOptions("--profile=cache"); + } else { + compose = + new ComposeContainer(DockerImageName.parse("docker:25.0.2"), COMPOSE_FILE) + .withOptions("--profile=cache"); } + compose.start(); + assertThat(compose.listChildContainers()).hasSize(1); + compose.stop(); } } diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerCustomImageTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerCustomImageTest.java new file mode 100644 index 00000000000..46ee86a8c23 --- /dev/null +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerCustomImageTest.java @@ -0,0 +1,50 @@ +package org.testcontainers.containers; + +import org.junit.jupiter.api.Test; +import org.testcontainers.utility.DockerImageName; + +import java.io.File; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +class DockerComposeContainerCustomImageTest { + + public static final String DOCKER_IMAGE = "docker/compose:debian-1.29.2"; + + private static final String COMPOSE_FILE_PATH = "src/test/resources/scaled-compose-test.yml"; + + @Test + void testWithCustomDockerImage() { + DockerComposeContainer composeContainer = new DockerComposeContainer<>( + DockerImageName.parse(DOCKER_IMAGE), + "testing", + new File(COMPOSE_FILE_PATH) + ); + composeContainer.start(); + verifyContainerCreation(composeContainer); + composeContainer.stop(); + } + + @Test + void testWithCustomDockerImageAndIdentifier() { + DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse(DOCKER_IMAGE), + "myidentifier", + new File(COMPOSE_FILE_PATH) + ); + composeContainer.start(); + verifyContainerCreation(composeContainer); + composeContainer.stop(); + } + + private void verifyContainerCreation(DockerComposeContainer composeContainer) { + Optional redis = composeContainer.getContainerByServiceName("redis"); + assertThat(redis) + .hasValueSatisfying(container -> { + assertThat(container.isRunning()).isTrue(); + assertThat(container.getContainerInfo().getConfig().getLabels()) + .containsEntry("com.docker.compose.version", "1.29.2"); + }); + } +} diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java index cc6c124fde0..52d8d003003 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeContainerWithServicesTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.rnorth.ducttape.TimeoutException; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.time.Duration; @@ -30,7 +31,11 @@ class DockerComposeContainerWithServicesTest { @Test void testDesiredSubsetOfServicesAreStarted() { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE).withServices("redis") + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + SIMPLE_COMPOSE_FILE + ) + .withServices("redis") ) { compose.start(); @@ -41,7 +46,10 @@ void testDesiredSubsetOfServicesAreStarted() { @Test void testDesiredSubsetOfScaledServicesAreStarted() { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + SIMPLE_COMPOSE_FILE + ) .withScaledService("redis", 2) ) { compose.start(); @@ -53,7 +61,10 @@ void testDesiredSubsetOfScaledServicesAreStarted() { @Test void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + SIMPLE_COMPOSE_FILE + ) .withServices("redis") .withScaledService("redis", 2) ) { @@ -66,7 +77,10 @@ void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { @Test void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + SIMPLE_COMPOSE_FILE + ) .withServices("other") .withScaledService("redis", 2) ) { @@ -78,7 +92,12 @@ void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { @Test void testAllServicesAreStartedIfNotSpecified() { - try (DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE)) { + try ( + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + SIMPLE_COMPOSE_FILE + ) + ) { compose.start(); verifyStartedContainers(compose, "redis_1", "other_1"); @@ -87,7 +106,12 @@ void testAllServicesAreStartedIfNotSpecified() { @Test void testScaleInComposeFileIsRespected() { - try (DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_INLINE_SCALE)) { + try ( + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + COMPOSE_FILE_WITH_INLINE_SCALE + ) + ) { compose.start(); // the compose file includes `scale: 3` for the redis container @@ -100,7 +124,10 @@ void testStartupTimeoutSetsTheHighestTimeout() { assertThat( catchThrowable(() -> { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(SIMPLE_COMPOSE_FILE) + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + SIMPLE_COMPOSE_FILE + ) .withServices("redis") .withStartupTimeout(Duration.ofMillis(1)) .withExposedService( @@ -120,7 +147,10 @@ void testStartupTimeoutSetsTheHighestTimeout() { @Test void testWaitingForHealthcheck() { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK) + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + COMPOSE_FILE_WITH_HEALTHCHECK + ) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) ) { compose.start(); @@ -132,7 +162,10 @@ void testWaitingForHealthcheck() { @Test void testWaitingForHealthcheckWithRestartDoesNotCrash() { try ( - DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE_WITH_HEALTHCHECK) + DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), + COMPOSE_FILE_WITH_HEALTHCHECK + ) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) ) { compose.start(); diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java index eb66fbabc38..e3bd499cc45 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeOverridesTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.utility.CommandLine; +import org.testcontainers.utility.DockerImageName; import java.io.BufferedReader; import java.io.File; @@ -44,6 +45,7 @@ public static Iterable data() { @ParameterizedTest(name = "{index}: local[{0}], composeFiles[{2}], expectedEnvVar[{1}]") @MethodSource("data") void test(boolean localMode, String expectedEnvVar, File... composeFiles) { + DockerComposeContainer compose; if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) @@ -52,42 +54,44 @@ void test(boolean localMode, String expectedEnvVar, File... composeFiles) { Assumptions .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) .doesNotStartWith("Docker Compose version v2"); + + compose = new DockerComposeContainer(composeFiles).withExposedService(SERVICE_NAME, SERVICE_PORT); + } else { + compose = + new DockerComposeContainer(DockerImageName.parse("docker/compose:debian-1.29.2"), composeFiles) + .withExposedService(SERVICE_NAME, SERVICE_PORT); } - try ( - DockerComposeContainer compose = new DockerComposeContainer(composeFiles) - .withLocalCompose(localMode) - .withExposedService(SERVICE_NAME, SERVICE_PORT) - ) { - compose.start(); - - BufferedReader br = Unreliables.retryUntilSuccess( - 10, - TimeUnit.SECONDS, - () -> { - Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); - - Socket socket = new Socket( - compose.getServiceHost(SERVICE_NAME, SERVICE_PORT), - compose.getServicePort(SERVICE_NAME, SERVICE_PORT) - ); - return new BufferedReader(new InputStreamReader(socket.getInputStream())); - } - ); - - Unreliables.retryUntilTrue( - 10, - TimeUnit.SECONDS, - () -> { - while (br.ready()) { - String line = br.readLine(); - if (line.contains(expectedEnvVar)) { - return true; - } + + compose.start(); + + BufferedReader br = Unreliables.retryUntilSuccess( + 10, + TimeUnit.SECONDS, + () -> { + Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS); + + Socket socket = new Socket( + compose.getServiceHost(SERVICE_NAME, SERVICE_PORT), + compose.getServicePort(SERVICE_NAME, SERVICE_PORT) + ); + return new BufferedReader(new InputStreamReader(socket.getInputStream())); + } + ); + + Unreliables.retryUntilTrue( + 10, + TimeUnit.SECONDS, + () -> { + while (br.ready()) { + String line = br.readLine(); + if (line.contains(expectedEnvVar)) { + return true; } - Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); - return false; } - ); - } + Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS); + return false; + } + ); + compose.stop(); } } diff --git a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java index 20a52566201..46f29b0a281 100644 --- a/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java +++ b/core/src/test/java/org/testcontainers/containers/DockerComposeProfilesOptionTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.utility.CommandLine; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -15,14 +16,13 @@ public static Boolean[] local() { return new Boolean[] { Boolean.TRUE, Boolean.FALSE }; } - public boolean localMode; - public static final File COMPOSE_FILE = new File("src/test/resources/compose-profile-option/compose-test.yml"); @ParameterizedTest(name = "{0}") @MethodSource("local") - void testProfileOption() { - if (this.localMode) { + void testProfileOption(boolean localMode) { + DockerComposeContainer compose; + if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) .as("docker-compose executable exists") @@ -30,14 +30,16 @@ void testProfileOption() { Assumptions .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) .doesNotStartWith("Docker Compose version v2"); + + compose = new DockerComposeContainer<>(COMPOSE_FILE).withOptions("--profile=cache"); + } else { + compose = + new DockerComposeContainer<>(DockerImageName.parse("docker/compose:debian-1.29.2"), COMPOSE_FILE) + .withOptions("--profile=cache"); } - try ( - DockerComposeContainer compose = new DockerComposeContainer<>(COMPOSE_FILE) - .withOptions("--profile=cache") - .withLocalCompose(this.localMode) - ) { - compose.start(); - assertThat(compose.listChildContainers()).hasSize(1); - } + + compose.start(); + assertThat(compose.listChildContainers()).hasSize(1); + compose.stop(); } } diff --git a/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java b/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java index fc28f771749..334b69740b7 100644 --- a/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java +++ b/core/src/test/java/org/testcontainers/junit/BaseComposeTest.java @@ -58,7 +58,7 @@ void secondTest() { assertThat(jedis.get("test")).as("Tests use fresh container instances").isEqualTo("3"); // if these end up using the same container one of the test methods will fail. - // However, @Rule creates a separate DockerComposeContainer instance per test, so this just shouldn't happen + // However, @Rule creates a separate ComposeContainer instance per test, so this just shouldn't happen } @BeforeEach diff --git a/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java b/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java index 926fa301836..58459c2d807 100644 --- a/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java +++ b/core/src/test/java/org/testcontainers/junit/BaseDockerComposeTest.java @@ -2,7 +2,6 @@ import com.github.dockerjava.api.model.Network; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -16,6 +15,7 @@ import java.util.stream.Collectors; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assumptions.assumeThat; /** * Created by rnorth on 21/05/2016. @@ -30,7 +30,7 @@ public abstract class BaseDockerComposeTest { @BeforeAll public static void checkVersion() { - Assumptions.assumeTrue(TestEnvironment.dockerApiAtLeast("1.22")); + assumeThat(TestEnvironment.dockerApiAtLeast("1.22")).isTrue(); } @Test diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java index 8e5651903f6..028d883b320 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerState; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -17,7 +18,10 @@ class ComposeContainerOverrideTest { @Test void readEnvironment() { - try (ComposeContainer compose = new ComposeContainer(BASE).withExposedService("redis", 6379)) { + try ( + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), BASE) + .withExposedService("redis", 6379) + ) { compose.start(); InspectContainerResponse container = compose .getContainerByServiceName("redis-1") @@ -29,7 +33,10 @@ void readEnvironment() { @Test void resetEnvironment() { - try (ComposeContainer compose = new ComposeContainer(BASE, OVERRIDE).withExposedService("redis", 6379)) { + try ( + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), BASE, OVERRIDE) + .withExposedService("redis", 6379) + ) { compose.start(); InspectContainerResponse container = compose .getContainerByServiceName("redis-1") diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java index dfe51acbebb..b45db1a4f8a 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -9,6 +10,7 @@ class ComposeContainerPortViaEnvTest extends BaseComposeTest { @AutoClose public ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/v2-compose-test-port-via-env.yml") ) .withExposedService("redis-1", REDIS_PORT) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java index 7614b49e303..50c6ef062ef 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestEnvironment; import redis.clients.jedis.Jedis; @@ -26,6 +27,7 @@ public static void checkVersion() { @AutoClose public ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/composev2/scaled-compose-test.yml") ) .withScaledService("redis", 3) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java index 2d87cd3aa49..9e68c7513df 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java @@ -3,7 +3,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerState; -import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.io.IOException; @@ -18,6 +18,7 @@ class ComposeContainerTest extends BaseComposeTest { // composeContainerConstructor { public ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/composev2/compose-test.yml") ) .withExposedService("redis-1", REDIS_PORT) @@ -86,7 +87,8 @@ void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { filePathNotStartWithDotSlash.deleteOnExit(); Files.write(filePathNotStartWithDotSlash.toPath(), validYaml.getBytes(StandardCharsets.UTF_8)); - final DockerComposeContainer dockerComposeContainer = new DockerComposeContainer<>( + final ComposeContainer dockerComposeContainer = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), filePathNotStartWithDotSlash ); assertThat(dockerComposeContainer).as("Container created using docker compose file").isNotNull(); diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java index 1898f5d580b..cebfc2a9706 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.LinkedHashSet; @@ -28,7 +29,7 @@ void performTest(boolean removeVolumes, boolean shouldVolumesBePresentAfterRunni final AtomicReference volumeName = new AtomicReference<>(""); try ( - ComposeContainer environment = new ComposeContainer(composeFile) + ComposeContainer environment = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), composeFile) .withExposedService("redis", 6379) .withRemoveVolumes(removeVolumes) .withRemoveImages(ComposeContainer.RemoveImages.ALL) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java index 589766f9184..03ced374f70 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java @@ -7,6 +7,7 @@ import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.concurrent.TimeUnit; @@ -37,7 +38,7 @@ void performTest( final AtomicReference builtImageName = new AtomicReference<>(""); final AtomicReference pulledImageName = new AtomicReference<>(""); try ( - ComposeContainer environment = new ComposeContainer(composeFile) + ComposeContainer environment = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), composeFile) .withExposedService("customredis", 6379) .withBuild(true) .withRemoveImages(removeMode) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java index 33dc092cc51..cc9c2dad594 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.io.IOException; @@ -17,6 +18,7 @@ class ComposeContainerWithCopyFilesTest { void testShouldCopyAllFilesByDefault() throws IOException { try ( ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/compose-file-copy-inclusions/compose.yml") ) .withExposedService("app", 8080) @@ -32,6 +34,7 @@ void testShouldCopyAllFilesByDefault() throws IOException { void testWithFileCopyInclusionUsingFilePath() throws IOException { try ( ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") ) .withExposedService("app", 8080) @@ -51,6 +54,7 @@ void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { try ( // composeContainerWithCopyFiles { ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") ) .withExposedService("app", 8080) @@ -69,6 +73,7 @@ void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { void testShouldNotBeAbleToStartIfNeededEnvFileIsNotCopied() { try ( ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") ) .withExposedService("app", 8080) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java index e8bca173a54..800da177137 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithOptionsTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.utility.CommandLine; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.Set; @@ -21,7 +22,7 @@ class ComposeContainerWithOptionsTest { public static Stream params() { return Stream.of( - // Test the happy day case. THe compatibility option should be accepted by docker-compose. + // Test the happy day case. The compatibility option should be accepted by docker-compose. Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, @@ -55,19 +56,23 @@ public static Stream params() { @ParameterizedTest(name = "docker-compose test [compose file: {0}, local: {1}, options: {2}, expected result: {3}]") @MethodSource("params") void performTest(File composeFile, boolean localMode, Set options, boolean expectError) { + ComposeContainer environment; if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(ComposeContainer.COMPOSE_EXECUTABLE)) .as("docker executable exists") .isTrue(); + environment = new ComposeContainer(composeFile).withOptions(options.stream().toArray(String[]::new)); + } else { + environment = + new ComposeContainer(DockerImageName.parse("docker:25.0.2"), composeFile) + .withOptions(options.stream().toArray(String[]::new)); } - try ( - ComposeContainer environment = new ComposeContainer(composeFile) - .withOptions(options.stream().toArray(String[]::new)) - .withLocalCompose(localMode) - ) { + + try { environment.start(); assertThat(expectError).isFalse(); + environment.stop(); } catch (Exception e) { assertThat(expectError).isTrue(); } diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java index 82a1a5e57ad..07ce8e41ef1 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.time.Duration; @@ -17,7 +18,10 @@ class ComposeContainerWithWaitStrategies { void testComposeContainerConstructor() { try ( // composeContainerWithCombinedWaitStrategies { - ComposeContainer compose = new ComposeContainer(new File("src/test/resources/composev2/compose-test.yml")) + ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + new File("src/test/resources/composev2/compose-test.yml") + ) .withExposedService("redis-1", REDIS_PORT, Wait.forSuccessfulCommand("redis-cli ping")) .withExposedService("db-1", 3306, Wait.forLogMessage(".*ready for connections.*\\n", 1)) // } @@ -31,7 +35,10 @@ void testComposeContainerConstructor() { void testComposeContainerWaitForPortWithTimeout() { try ( // composeContainerWaitForPortWithTimeout { - ComposeContainer compose = new ComposeContainer(new File("src/test/resources/composev2/compose-test.yml")) + ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + new File("src/test/resources/composev2/compose-test.yml") + ) .withExposedService( "redis-1", REDIS_PORT, diff --git a/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java b/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java index a5e8e77c12f..acabcaf9e87 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -14,7 +15,10 @@ class ComposeErrorHandlingTest { void simpleTest() { assertThat( catchThrowable(() -> { - ComposeContainer environment = new ComposeContainer(new File("src/test/resources/invalid-compose.yml")) + ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + new File("src/test/resources/invalid-compose.yml") + ) .withExposedService("something", 123); }) ) diff --git a/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java b/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java index 97ea43d38c9..7bc47d79c9d 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java @@ -7,6 +7,7 @@ import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestEnvironment; import java.io.File; @@ -26,6 +27,7 @@ public static void checkVersion() { @AutoClose public ComposeContainer compose = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/v2-compose-test-passthrough.yml") ) .withEnv("foo", "bar") diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java index 73553f70fdf..2bec1aec819 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java @@ -7,6 +7,7 @@ import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.time.Duration; @@ -23,7 +24,11 @@ class ComposeWaitStrategyTest { @BeforeEach public final void setUp() { - environment = new ComposeContainer(new File("src/test/resources/composev2/compose-test.yml")); + environment = + new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), + new File("src/test/resources/composev2/compose-test.yml") + ); } @AfterEach diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java index 71d80918d7c..c02b9874126 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -9,6 +10,7 @@ class ComposeWithIdentifierTest extends BaseComposeTest { @AutoClose public ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), "TEST", new File("src/test/resources/v2-compose-test.yml") ) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java index cfda1971600..1003c3d5404 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.AutoClose; import org.testcontainers.containers.ComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -9,6 +10,7 @@ class ComposeWithNetworkTest extends BaseComposeTest { @AutoClose public ComposeContainer environment = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/v2-compose-test-with-network.yml") ) .withExposedService("redis-1", REDIS_PORT); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java index 0cf523836a5..46af463834c 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerPortViaEnvTest.java @@ -1,14 +1,18 @@ package org.testcontainers.junit; import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Disabled; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; +@Disabled class DockerComposeContainerPortViaEnvTest extends BaseDockerComposeTest { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/v2-compose-test-port-via-env.yml") ) .withExposedService("redis_1", REDIS_PORT) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java index 90256bb0f37..d5be511f44b 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerScalingTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestEnvironment; import redis.clients.jedis.Jedis; @@ -29,6 +30,7 @@ public static void checkVersion() { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/scaled-compose-test.yml") ) .withScaledService("redis", 3) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java index 568eaae53cf..2bc855cacb2 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerTest.java @@ -1,9 +1,11 @@ package org.testcontainers.junit; import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.io.IOException; @@ -17,10 +19,12 @@ /** * Created by rnorth on 08/08/2015. */ +@Disabled class DockerComposeContainerTest extends BaseDockerComposeTest { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/compose-test.yml") ) .withExposedService("redis_1", REDIS_PORT) @@ -96,6 +100,7 @@ void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { Files.write(filePathNotStartWithDotSlash.toPath(), validYaml.getBytes(StandardCharsets.UTF_8)); final DockerComposeContainer dockerComposeContainer = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:debian-1.29.2"), filePathNotStartWithDotSlash ); assertThat(dockerComposeContainer).as("Container could not be created using docker compose file").isNotNull(); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java index 557cc7e27db..2ec9a51e197 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerVolumeRemovalTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.LinkedHashSet; @@ -27,7 +28,10 @@ void performTest(boolean removeVolumes, boolean shouldVolumesBePresentAfterRunni final AtomicReference volumeName = new AtomicReference<>(""); try ( - DockerComposeContainer environment = new DockerComposeContainer<>(composeFile) + DockerComposeContainer environment = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:1.29.2"), + composeFile + ) .withExposedService("redis", 6379) .withRemoveVolumes(removeVolumes) .withRemoveImages(DockerComposeContainer.RemoveImages.ALL) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java index 8f8da1e6450..4c3c69e8d76 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java @@ -7,6 +7,7 @@ import org.rnorth.ducttape.unreliables.Unreliables; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.concurrent.TimeUnit; @@ -37,7 +38,10 @@ void performTest( final AtomicReference builtImageName = new AtomicReference<>(""); final AtomicReference pulledImageName = new AtomicReference<>(""); try ( - DockerComposeContainer environment = new DockerComposeContainer<>(composeFile) + DockerComposeContainer environment = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:1.29.2"), + composeFile + ) .withExposedService("customredis", 6379) .withBuild(true) .withRemoveImages(removeMode) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java index 69853a4e0d3..c543678faab 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithCopyFilesTest.java @@ -3,6 +3,7 @@ import io.restassured.RestAssured; import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.io.IOException; @@ -15,6 +16,7 @@ class DockerComposeContainerWithCopyFilesTest { void testShouldCopyAllFilesByDefault() throws IOException { try ( DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/compose-file-copy-inclusions/compose.yml") ) .withExposedService("app", 8080) @@ -30,6 +32,7 @@ void testShouldCopyAllFilesByDefault() throws IOException { void testWithFileCopyInclusionUsingFilePath() throws IOException { try ( DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") ) .withExposedService("app", 8080) @@ -48,6 +51,7 @@ void testWithFileCopyInclusionUsingFilePath() throws IOException { void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { try ( DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") ) .withExposedService("app", 8080) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java index d4b684ef010..84508326522 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithOptionsTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.params.provider.MethodSource; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.utility.CommandLine; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.Set; @@ -21,7 +22,7 @@ class DockerComposeContainerWithOptionsTest { public static Stream params() { return Stream.of( - // Test the happy day case. THe compatibility option should be accepted by docker-compose. + // Test the happy day case. The compatibility option should be accepted by docker-compose. Arguments.of( new File("src/test/resources/compose-options-test/with-deploy-block.yml"), false, @@ -55,6 +56,7 @@ public static Stream params() { @ParameterizedTest(name = "docker-compose test [compose file: {0}, local: {1}, options: {2}, expected result: {3}]") @MethodSource("params") void performTest(File composeFile, boolean localMode, Set options, boolean expectError) { + DockerComposeContainer environment; if (localMode) { Assumptions .assumeThat(CommandLine.executableExists(DockerComposeContainer.COMPOSE_EXECUTABLE)) @@ -63,14 +65,19 @@ void performTest(File composeFile, boolean localMode, Set options, boole Assumptions .assumeThat(CommandLine.runShellCommand("docker-compose", "--version")) .doesNotStartWith("Docker Compose version v2"); + + environment = + new DockerComposeContainer<>(composeFile).withOptions(options.stream().toArray(String[]::new)); + } else { + environment = + new DockerComposeContainer<>(DockerImageName.parse("docker/compose:debian-1.29.2"), composeFile) + .withOptions(options.stream().toArray(String[]::new)); } - try ( - DockerComposeContainer environment = new DockerComposeContainer<>(composeFile) - .withOptions(options.stream().toArray(String[]::new)) - .withLocalCompose(localMode) - ) { + + try { environment.start(); assertThat(expectError).isEqualTo(false); + environment.stop(); } catch (Exception e) { assertThat(expectError).isEqualTo(true); } diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java index 9d0f4a19f1e..907011329ec 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeErrorHandlingTest.java @@ -2,6 +2,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -15,6 +16,7 @@ void simpleTest() { assertThat( catchThrowable(() -> { DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/invalid-compose.yml") ) .withExposedService("something", 123); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java index 2c77092e1bd..1853a2d4ff1 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeLocalImageTest.java @@ -5,6 +5,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.DockerClientFactory; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -15,6 +16,7 @@ void usesLocalImageEvenWhenPullFails() throws InterruptedException { tagImage("redis:6-alpine", "redis-local", "latest"); DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/local-compose-test.yml") ) .withExposedService("redis", 6379); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java index 7b9100d1e35..7f63bdce9fd 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeLogConsumerTest.java @@ -4,6 +4,7 @@ import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.output.OutputFrame.OutputType; import org.testcontainers.containers.output.WaitingConsumer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.util.concurrent.TimeUnit; @@ -15,6 +16,7 @@ class DockerComposeLogConsumerTest { void testLogConsumer() throws TimeoutException { WaitingConsumer logConsumer = new WaitingConsumer(); DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/v2-compose-test.yml") ) .withExposedService("redis_1", 6379) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java index 0bc8ace7ab7..a4f2707c583 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposePassthroughTest.java @@ -5,6 +5,7 @@ import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.wait.strategy.HostPortWaitStrategy; +import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.TestEnvironment; import java.io.File; @@ -25,6 +26,7 @@ void testContainerInstanceProperties() { TestWaitStrategy waitStrategy = new TestWaitStrategy(); try ( DockerComposeContainer compose = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/v2-compose-test-passthrough.yml") ) .withEnv("foo", "bar") diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java index 2496b7ee0bc..c1c295ef238 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeServiceTest.java @@ -1,18 +1,22 @@ package org.testcontainers.junit; import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +@Disabled class DockerComposeServiceTest extends BaseDockerComposeTest { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/compose-test.yml") ) .withServices("redis") diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java index c7b066b39b8..8a8f8f0da0b 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatTest.java @@ -1,17 +1,21 @@ package org.testcontainers.junit; import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Disabled; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; /** * Created by rnorth on 21/05/2016. */ +@Disabled class DockerComposeV2FormatTest extends BaseDockerComposeTest { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/v2-compose-test.yml") ) .withExposedService("redis_1", REDIS_PORT); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java index d8f4e57dbd9..dd198181d41 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeV2FormatWithIdentifierTest.java @@ -1,14 +1,18 @@ package org.testcontainers.junit; import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Disabled; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; +@Disabled class DockerComposeV2FormatWithIdentifierTest extends BaseDockerComposeTest { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), "TEST", new File("src/test/resources/v2-compose-test.yml") ) diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java index bc95f0229b7..2cf506059c5 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeV2WithNetworkTest.java @@ -1,14 +1,18 @@ package org.testcontainers.junit; import org.junit.jupiter.api.AutoClose; +import org.junit.jupiter.api.Disabled; import org.testcontainers.containers.DockerComposeContainer; +import org.testcontainers.utility.DockerImageName; import java.io.File; +@Disabled class DockerComposeV2WithNetworkTest extends BaseDockerComposeTest { @AutoClose public DockerComposeContainer environment = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/v2-compose-test-with-network.yml") ) .withExposedService("redis_1", REDIS_PORT); diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java index 9f8c2c9ab49..6f56ef9c24a 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeWaitStrategyTest.java @@ -7,6 +7,7 @@ import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; +import org.testcontainers.utility.DockerImageName; import java.io.File; import java.time.Duration; @@ -23,7 +24,11 @@ class DockerComposeWaitStrategyTest { @BeforeEach public final void setUp() { - environment = new DockerComposeContainer<>(new File("src/test/resources/compose-test.yml")); + environment = + new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:1.29.2"), + new File("src/test/resources/compose-test.yml") + ); } @AfterEach diff --git a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java index 1f6fbc1551a..171bd9a4381 100644 --- a/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java +++ b/core/src/test/java/org/testcontainers/utility/AuthenticatedImagePullTest.java @@ -130,7 +130,12 @@ void testThatAuthLocatorIsUsedForDockerComposePull() throws IOException { Files.write(tempFile, composeFileContent.getBytes()); // Start the docker compose project, which will require an authenticated pull - try (final DockerComposeContainer compose = new DockerComposeContainer<>(tempFile.toFile())) { + try ( + final DockerComposeContainer compose = new DockerComposeContainer<>( + DockerImageName.parse("docker/compose:1.29.2"), + tempFile.toFile() + ) + ) { compose.start(); assertThat( diff --git a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java index 7a43ed67a7d..460d50a856b 100644 --- a/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java +++ b/modules/junit-jupiter/src/test/java/org/testcontainers/junit/jupiter/DockerComposeContainerTests.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; import org.testcontainers.containers.DockerComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; import java.io.File; @@ -17,6 +18,7 @@ class DockerComposeContainerTests { @Container private DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse("docker/compose:1.29.2"), new File("src/test/resources/docker-compose.yml") ) .withExposedService("whoami_1", 80, Wait.forHttp("/")); diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy index 7294d534275..ff473aea1de 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy @@ -4,12 +4,14 @@ import org.apache.http.client.methods.HttpGet import org.apache.http.impl.client.HttpClientBuilder import org.testcontainers.containers.DockerComposeContainer import org.testcontainers.containers.wait.strategy.Wait +import org.testcontainers.utility.DockerImageName import spock.lang.Specification @Testcontainers class ComposeContainerIT extends Specification { DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse("docker/compose:debian-1.29.2"), new File("src/test/resources/docker-compose.yml")) .withExposedService("whoami_1", 80, Wait.forHttp("/")) diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy index f728212278f..953d476b160 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy @@ -4,6 +4,7 @@ import org.apache.http.client.methods.HttpGet import org.apache.http.impl.client.HttpClientBuilder import org.testcontainers.containers.DockerComposeContainer import org.testcontainers.containers.wait.strategy.Wait +import org.testcontainers.utility.DockerImageName import spock.lang.Shared import spock.lang.Specification @@ -12,6 +13,7 @@ class SharedComposeContainerIT extends Specification { @Shared DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse("docker/compose:debian-1.29.2"), new File("src/test/resources/docker-compose.yml")) .withExposedService("whoami_1", 80, Wait.forHttp("/")) From ed397a7c4dabbd9ee4d47e8ce1d5d38dd939b151 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 9 Oct 2025 23:33:33 -0600 Subject: [PATCH 0924/1224] Revert "Remove LinkableContainer from NginxContainer (#10386)" This reverts commit e14ea8421096148a97adbc4dcf7adf52dc30d4a0. --- .../java/org/testcontainers/containers/NginxContainer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) 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 d7c201e6474..6d4c8249fca 100644 --- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.jetbrains.annotations.NotNull; +import org.testcontainers.containers.traits.LinkableContainer; import org.testcontainers.utility.DockerImageName; import java.net.MalformedURLException; @@ -11,7 +12,9 @@ * @deprecated use {@link org.testcontainers.nginx.NginxContainer} instead. */ @Deprecated -public class NginxContainer extends GenericContainer { +public class NginxContainer> + extends GenericContainer + implements LinkableContainer { private static final int NGINX_DEFAULT_PORT = 80; @@ -50,7 +53,7 @@ public void setCustomContent(String htmlContentPath) { } @Deprecated - public NginxContainer withCustomContent(String htmlContentPath) { + public SELF withCustomContent(String htmlContentPath) { this.setCustomContent(htmlContentPath); return self(); } From 49637a016c7d654c52fb90a4887eca49b56b4a46 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 9 Oct 2025 23:45:54 -0600 Subject: [PATCH 0925/1224] Revert "Drop module's default constructors (#10385)" This reverts commit cfe90d50ee4baa2e3c4df7fddb404bda663cf172. --- .../containers/CockroachContainer.java | 8 ++++++++ .../org/testcontainers/containers/Db2Container.java | 8 ++++++++ .../containers/InfluxDBContainer.java | 13 +++++++++++++ .../containers/localstack/LocalStackContainer.java | 8 ++++++++ .../containers/MockServerContainer.java | 8 ++++++++ .../testcontainers/containers/MongoDBContainer.java | 10 ++++++++++ .../containers/MSSQLServerContainer.java | 8 ++++++++ .../testcontainers/containers/MySQLContainer.java | 8 ++++++++ .../testcontainers/containers/Neo4jContainer.java | 9 +++++++++ .../testcontainers/containers/NginxContainer.java | 10 ++++++++++ .../testcontainers/containers/OracleContainer.java | 8 ++++++++ .../containers/OrientDBContainer.java | 10 ++++++++++ .../containers/PostgreSQLContainer.java | 8 ++++++++ .../testcontainers/containers/PulsarContainer.java | 11 +++++++++++ .../containers/RabbitMQContainer.java | 11 +++++++++++ .../testcontainers/containers/SolrContainer.java | 11 +++++++++++ .../containers/ToxiproxyContainer.java | 10 ++++++++++ 17 files changed, 159 insertions(+) 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 855c37a03c8..461b0467767 100644 --- a/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java +++ b/modules/cockroachdb/src/main/java/org/testcontainers/containers/CockroachContainer.java @@ -55,6 +55,14 @@ public class CockroachContainer extends JdbcDatabaseContainer { private String password = "foobar1234"; + /** + * @deprecated use {@link #Db2Container(DockerImageName)} instead + */ + @Deprecated + public Db2Container() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public Db2Container(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } 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 f54971dfc7a..8e908e8e229 100644 --- a/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java +++ b/modules/influxdb/src/main/java/org/testcontainers/containers/InfluxDBContainer.java @@ -24,6 +24,11 @@ public class InfluxDBContainer> extends Gen private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("influxdb"); + private static final String DEFAULT_TAG = "1.4.3"; + + @Deprecated + public static final String VERSION = DEFAULT_TAG; + private static final int NO_CONTENT_STATUS_CODE = 204; @Getter @@ -61,6 +66,14 @@ public class InfluxDBContainer> extends Gen private final boolean isAtLeastMajorVersion2; + /** + * @deprecated use {@link #InfluxDBContainer(DockerImageName)} instead + */ + @Deprecated + public InfluxDBContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + /** * @deprecated use {@link #InfluxDBContainer(DockerImageName)} instead */ 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 083f642e11c..ce50313d429 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 @@ -86,6 +86,14 @@ public class LocalStackContainer extends GenericContainer { private final boolean isVersion2; + /** + * @deprecated use {@link #LocalStackContainer(DockerImageName)} instead + */ + @Deprecated + public LocalStackContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + /** * @deprecated use {@link #LocalStackContainer(DockerImageName)} instead */ 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 f69c5e86a6d..47d2399d934 100644 --- a/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java +++ b/modules/mockserver/src/main/java/org/testcontainers/containers/MockServerContainer.java @@ -20,6 +20,14 @@ public class MockServerContainer extends GenericContainer { public static final int PORT = 1080; + /** + * @deprecated use {@link #MockServerContainer(DockerImageName)} instead + */ + @Deprecated + public MockServerContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + /** * @deprecated use {@link #MockServerContainer(DockerImageName)} instead */ diff --git a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java index b986a720964..d30f45739c0 100644 --- a/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java +++ b/modules/mongodb/src/main/java/org/testcontainers/containers/MongoDBContainer.java @@ -33,6 +33,8 @@ public class MongoDBContainer extends GenericContainer { "mongodb/mongodb-enterprise-server" ); + private static final String DEFAULT_TAG = "4.0.10"; + private static final int CONTAINER_EXIT_CODE_OK = 0; private static final int AWAIT_INIT_REPLICA_SET_ATTEMPTS = 60; @@ -43,6 +45,14 @@ public class MongoDBContainer extends GenericContainer { private boolean shardingEnabled; + /** + * @deprecated use {@link #MongoDBContainer(DockerImageName)} instead + */ + @Deprecated + public MongoDBContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public MongoDBContainer(@NonNull final String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java index a30de6549ba..07f8a064c00 100644 --- a/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java +++ b/modules/mssqlserver/src/main/java/org/testcontainers/containers/MSSQLServerContainer.java @@ -47,6 +47,14 @@ public class MSSQLServerContainer> exten Pattern.compile("[^a-zA-Z0-9]+", Pattern.CASE_INSENSITIVE), }; + /** + * @deprecated use {@link #MSSQLServerContainer(DockerImageName)} instead + */ + @Deprecated + public MSSQLServerContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public MSSQLServerContainer(final String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java index 9f5b31531c4..36315b2fe48 100644 --- a/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/containers/MySQLContainer.java @@ -44,6 +44,14 @@ public class MySQLContainer> extends JdbcDatab private static final String MYSQL_ROOT_USER = "root"; + /** + * @deprecated use {@link #MySQLContainer(DockerImageName)} instead + */ + @Deprecated + public MySQLContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public MySQLContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java index 64c4df9f350..b4077d7fbda 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -86,6 +86,15 @@ public class Neo4jContainer extends GenericContainer { .forPort(DEFAULT_HTTP_PORT) .forStatusCodeMatching(response -> response == HttpURLConnection.HTTP_OK); + /** + * Creates a Neo4jContainer using the official Neo4j docker image. + * @deprecated use {@link #Neo4jContainer(DockerImageName)} instead + */ + @Deprecated + public Neo4jContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + /** * Creates a Neo4jContainer using a specific docker image. * 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 6d4c8249fca..c66149d2417 100644 --- a/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/containers/NginxContainer.java @@ -20,6 +20,16 @@ public class NginxContainer> private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("nginx"); + private static final String DEFAULT_TAG = "1.9.4"; + + /** + * @deprecated use {@link #NginxContainer(DockerImageName)} instead + */ + @Deprecated + public NginxContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public NginxContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java b/modules/oracle-xe/src/main/java/org/testcontainers/containers/OracleContainer.java index 07db62a7b2e..75b16779f40 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 @@ -63,6 +63,14 @@ public class OracleContainer extends JdbcDatabaseContainer { private boolean usingSid = false; + /** + * @deprecated use {@link #OracleContainer(DockerImageName)} instead + */ + @Deprecated + public OracleContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public OracleContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java index 67c81be7e90..aeaf053ff0a 100644 --- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java +++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java @@ -36,6 +36,8 @@ public class OrientDBContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("orientdb"); + private static final String DEFAULT_TAG = "3.0.24-tp3"; + private static final String DEFAULT_USERNAME = "admin"; private static final String DEFAULT_PASSWORD = "admin"; @@ -58,6 +60,14 @@ public class OrientDBContainer extends GenericContainer { private ODatabaseSession session; + /** + * @deprecated use {@link #OrientDBContainer(DockerImageName)} instead + */ + @Deprecated + public OrientDBContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public OrientDBContainer(@NonNull String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java index d45b9d5683d..4824654957f 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/containers/PostgreSQLContainer.java @@ -44,6 +44,14 @@ public class PostgreSQLContainer> extends private static final String FSYNC_OFF_OPTION = "fsync=off"; + /** + * @deprecated use {@link #PostgreSQLContainer(DockerImageName)} or {@link #PostgreSQLContainer(String)} instead + */ + @Deprecated + public PostgreSQLContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public PostgreSQLContainer(final String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java index 49475d09511..7305fbd622c 100644 --- a/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java +++ b/modules/pulsar/src/main/java/org/testcontainers/containers/PulsarContainer.java @@ -34,12 +34,23 @@ public class PulsarContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("apachepulsar/pulsar"); + @Deprecated + private static final String DEFAULT_TAG = "3.0.0"; + private final WaitAllStrategy waitAllStrategy = new WaitAllStrategy(); private boolean functionsWorkerEnabled = false; private boolean transactionsEnabled = false; + /** + * @deprecated use {@link #PulsarContainer(DockerImageName)} instead + */ + @Deprecated + public PulsarContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + /** * @deprecated use {@link #PulsarContainer(DockerImageName)} instead */ 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 b7b2eb35051..6db9f6b4cf0 100644 --- a/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java +++ b/modules/rabbitmq/src/main/java/org/testcontainers/containers/RabbitMQContainer.java @@ -38,6 +38,8 @@ public class RabbitMQContainer extends GenericContainer { */ private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("rabbitmq"); + private static final String DEFAULT_TAG = "3.7.25-management-alpine"; + private static final int DEFAULT_AMQP_PORT = 5672; private static final int DEFAULT_AMQPS_PORT = 5671; @@ -52,6 +54,15 @@ public class RabbitMQContainer extends GenericContainer { private final List> values = new ArrayList<>(); + /** + * Creates a RabbitMQ container using the official RabbitMQ docker image. + * @deprecated use {@link #RabbitMQContainer(DockerImageName)} instead + */ + @Deprecated + public RabbitMQContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + /** * Creates a RabbitMQ container using a specific docker image. * diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java index 16c3a0d62d4..c4172bb8e01 100644 --- a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java +++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java @@ -28,6 +28,9 @@ public class SolrContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("solr"); + @Deprecated + public static final String DEFAULT_TAG = "8.3.0"; + public static final Integer ZOOKEEPER_PORT = 9983; public static final Integer SOLR_PORT = 8983; @@ -36,6 +39,14 @@ public class SolrContainer extends GenericContainer { private final ComparableVersion imageVersion; + /** + * @deprecated use {@link #SolrContainer(DockerImageName)} instead + */ + @Deprecated + public SolrContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public SolrContainer(final String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } diff --git a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java index 4a3d1af003e..a3f12516f8d 100644 --- a/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java +++ b/modules/toxiproxy/src/main/java/org/testcontainers/containers/ToxiproxyContainer.java @@ -34,6 +34,8 @@ public class ToxiproxyContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("shopify/toxiproxy"); + private static final String DEFAULT_TAG = "2.1.0"; + private static final DockerImageName GHCR_IMAGE_NAME = DockerImageName.parse("ghcr.io/shopify/toxiproxy"); private static final int TOXIPROXY_CONTROL_PORT = 8474; @@ -48,6 +50,14 @@ public class ToxiproxyContainer extends GenericContainer { private final AtomicInteger nextPort = new AtomicInteger(FIRST_PROXIED_PORT); + /** + * @deprecated use {@link #ToxiproxyContainer(DockerImageName)} instead + */ + @Deprecated + public ToxiproxyContainer() { + this(DEFAULT_IMAGE_NAME.withTag(DEFAULT_TAG)); + } + public ToxiproxyContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } From e3fe7c9dce049ab1365578402c6a0a66862fdd4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 9 Oct 2025 23:48:55 -0600 Subject: [PATCH 0926/1224] Revert "Make Neo4jContainer generic and drop deprecated method (#10388)" This reverts commit 71cc7293332d30a1495713cfe4d75259599602d9. --- .../containers/Neo4jExampleTest.java | 2 +- .../containers/Neo4jContainer.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java b/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java index abf42a115de..38c22a0ff45 100644 --- a/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java +++ b/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java @@ -27,7 +27,7 @@ class Neo4jExampleTest { @Container - private static Neo4jContainer neo4jContainer = new Neo4jContainer(DockerImageName.parse("neo4j:4.4")) + private static Neo4jContainer neo4jContainer = new Neo4jContainer<>(DockerImageName.parse("neo4j:4.4")) .withoutAuthentication(); // Disable password @Test 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 b4077d7fbda..f7fc0beacfe 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/containers/Neo4jContainer.java @@ -34,7 +34,7 @@ * @deprecated use {@link org.testcontainers.neo4j.Neo4jContainer} instead. */ @Deprecated -public class Neo4jContainer extends GenericContainer { +public class Neo4jContainer> extends GenericContainer { /** * The image defaults to the official Neo4j image: Neo4j. @@ -217,7 +217,7 @@ public String getHttpsUrl() { * * @return This container. */ - public Neo4jContainer withEnterpriseEdition() { + public S withEnterpriseEdition() { if (!standardImage) { throw new IllegalStateException( String.format("Cannot use enterprise version with alternative image %s.", getDockerImageName()) @@ -239,7 +239,7 @@ public Neo4jContainer withEnterpriseEdition() { * @param adminPassword The admin password for the default database account. * @return This container. */ - public Neo4jContainer withAdminPassword(final String adminPassword) { + public S withAdminPassword(final String adminPassword) { if (adminPassword != null && adminPassword.length() < 8) { logger().warn("Your provided admin password is too short and will not work with Neo4j 5.3+."); } @@ -252,7 +252,7 @@ public Neo4jContainer withAdminPassword(final String adminPassword) { * * @return This container. */ - public Neo4jContainer withoutAuthentication() { + public S withoutAuthentication() { return withAdminPassword(null); } @@ -276,7 +276,7 @@ public Neo4jContainer withoutAuthentication() { * @throws IllegalArgumentException If the database version is not 3.5. * @return This container. */ - public Neo4jContainer withDatabase(MountableFile graphDb) { + public S withDatabase(MountableFile graphDb) { if (!isNeo4jDatabaseVersionSupportingDbCopy()) { throw new IllegalArgumentException( "Copying database folder is not supported for Neo4j instances with version 4.0 or higher." @@ -295,7 +295,7 @@ public Neo4jContainer withDatabase(MountableFile graphDb) { * @param plugins * @return This container. */ - public Neo4jContainer withPlugins(MountableFile plugins) { + public S withPlugins(MountableFile plugins) { return withCopyFileToContainer(plugins, "/var/lib/neo4j/plugins/"); } @@ -307,7 +307,7 @@ public Neo4jContainer withPlugins(MountableFile plugins) { * @param value The value to set * @return This container. */ - public Neo4jContainer withNeo4jConfig(String key, String value) { + public S withNeo4jConfig(String key, String value) { addEnv(formatConfigurationKey(key), value); return self(); } @@ -330,7 +330,7 @@ public String getAdminPassword() { * @param plugins The Neo4j plugins that should get started with the server. * @return This container. */ - public Neo4jContainer withPlugins(String... plugins) { + public S withPlugins(String... plugins) { this.labsPlugins.addAll(Arrays.asList(plugins)); return self(); } @@ -363,7 +363,7 @@ private boolean isNeo4jDatabaseVersionSupportingDbCopy() { return false; } - public Neo4jContainer withRandomPassword() { + public S withRandomPassword() { return withAdminPassword(UUID.randomUUID().toString()); } } From 2cce248fe6fb11888bb622a60f0e03b399cdbfad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 10 Oct 2025 05:59:26 -0600 Subject: [PATCH 0927/1224] Add OrientDB container implementation under org.testcontainers.orientdb (#11098) --- docs/modules/databases/orientdb.md | 2 +- .../containers/OrientDBContainer.java | 3 + .../orientdb/OrientDBContainer.java | 140 ++++++++++++++++++ .../OrientDBContainerTest.java | 56 ++++--- 4 files changed, 182 insertions(+), 19 deletions(-) create mode 100644 modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java rename modules/orientdb/src/test/java/org/testcontainers/{containers => orientdb}/OrientDBContainerTest.java (58%) diff --git a/docs/modules/databases/orientdb.md b/docs/modules/databases/orientdb.md index 40a26100ae1..a1f57098d99 100644 --- a/docs/modules/databases/orientdb.md +++ b/docs/modules/databases/orientdb.md @@ -7,7 +7,7 @@ Testcontainers module for [OrientDB](https://hub.docker.com/_/orientdb/) You can start an OrientDB container instance from any Java application by using: -[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java) inside_block:container +[Container creation](../../../modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java) inside_block:container ## Adding this module to your project dependencies 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 aeaf053ff0a..e21472dd16a 100644 --- a/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java +++ b/modules/orientdb/src/main/java/org/testcontainers/containers/OrientDBContainer.java @@ -29,7 +29,10 @@ *
  • Database: 2424
  • *
  • Studio: 2480
  • * + * + * @deprecated use {@link org.testcontainers.orientdb.OrientDBContainer} instead. */ +@Deprecated public class OrientDBContainer extends GenericContainer { private static final Logger LOGGER = LoggerFactory.getLogger(OrientDBContainer.class); diff --git a/modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java b/modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java new file mode 100644 index 00000000000..753d32951e7 --- /dev/null +++ b/modules/orientdb/src/main/java/org/testcontainers/orientdb/OrientDBContainer.java @@ -0,0 +1,140 @@ +package org.testcontainers.orientdb; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.NonNull; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.DockerImageName; + +import java.io.IOException; + +/** + * Testcontainers implementation for OrientDB. + *

    + * Supported image: {@code orientdb} + *

    + * Exposed ports: + *

      + *
    • Database: 2424
    • + *
    • Studio: 2480
    • + *
    + */ +public class OrientDBContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("orientdb"); + + private static final String DEFAULT_USERNAME = "admin"; + + private static final String DEFAULT_PASSWORD = "admin"; + + private static final String DEFAULT_SERVER_USER = "root"; + + private static final String DEFAULT_SERVER_PASSWORD = "root"; + + private static final String DEFAULT_DATABASE_NAME = "testcontainers"; + + private static final int DEFAULT_BINARY_PORT = 2424; + + private static final int DEFAULT_HTTP_PORT = 2480; + + private String databaseName; + + private String serverPassword; + + private Transferable scriptPath; + + public OrientDBContainer(@NonNull String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public OrientDBContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + this.serverPassword = DEFAULT_SERVER_PASSWORD; + this.databaseName = DEFAULT_DATABASE_NAME; + + waitingFor(Wait.forLogMessage(".*OrientDB Studio available.*", 1)); + addExposedPorts(DEFAULT_BINARY_PORT, DEFAULT_HTTP_PORT); + } + + @Override + protected void configure() { + addEnv("ORIENTDB_ROOT_PASSWORD", serverPassword); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + try { + String createDb = String.format( + "CREATE DATABASE remote:localhost/%s %s %s plocal; CONNECT remote:localhost/%s %s %s; CREATE USER %s IDENTIFIED BY %s ROLE admin;", + this.databaseName, + DEFAULT_SERVER_USER, + this.serverPassword, + this.databaseName, + DEFAULT_SERVER_USER, + this.serverPassword, + DEFAULT_USERNAME, + DEFAULT_PASSWORD + ); + execInContainer("/orientdb/bin/console.sh", createDb); + + if (this.scriptPath != null) { + copyFileToContainer(this.scriptPath, "/opt/testcontainers/script.osql"); + String loadScript = String.format( + "CONNECT remote:localhost/%s %s %s; LOAD SCRIPT /opt/testcontainers/script.osql", + this.databaseName, + DEFAULT_SERVER_USER, + this.serverPassword + ); + execInContainer("/orientdb/bin/console.sh", loadScript); + } + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + } + + public String getDatabaseName() { + return databaseName; + } + + public OrientDBContainer withDatabaseName(final String databaseName) { + this.databaseName = databaseName; + return self(); + } + + public OrientDBContainer withServerPassword(final String serverPassword) { + this.serverPassword = serverPassword; + return self(); + } + + public OrientDBContainer withScriptPath(Transferable scriptPath) { + this.scriptPath = scriptPath; + return self(); + } + + public String getServerUrl() { + return "remote:" + getHost() + ":" + getMappedPort(2424); + } + + public String getDbUrl() { + return getServerUrl() + "/" + this.databaseName; + } + + public String getServerUser() { + return DEFAULT_SERVER_USER; + } + + public String getServerPassword() { + return this.serverPassword; + } + + public String getUsername() { + return DEFAULT_USERNAME; + } + + public String getPassword() { + return DEFAULT_PASSWORD; + } +} diff --git a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java b/modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java similarity index 58% rename from modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java rename to modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java index af6778505ec..2952b70f216 100644 --- a/modules/orientdb/src/test/java/org/testcontainers/containers/OrientDBContainerTest.java +++ b/modules/orientdb/src/test/java/org/testcontainers/orientdb/OrientDBContainerTest.java @@ -1,6 +1,8 @@ -package org.testcontainers.containers; +package org.testcontainers.orientdb; import com.orientechnologies.orient.core.db.ODatabaseSession; +import com.orientechnologies.orient.core.db.OrientDB; +import com.orientechnologies.orient.core.db.OrientDBConfig; import org.junit.jupiter.api.Test; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; @@ -12,26 +14,24 @@ class OrientDBContainerTest { private static final DockerImageName ORIENTDB_IMAGE = DockerImageName.parse("orientdb:3.2.0-tp3"); @Test - void shouldReturnTheSameSession() { + void shouldInitializeWithCommands() { try ( // container { OrientDBContainer orientdb = new OrientDBContainer("orientdb:3.2.0-tp3") // } ) { orientdb.start(); - final ODatabaseSession session = orientdb.getSession(); - final ODatabaseSession session2 = orientdb.getSession(); - - assertThat(session).isSameAs(session2); - } - } - - @Test - void shouldInitializeWithCommands() { - try (OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE)) { - orientdb.start(); - - final ODatabaseSession session = orientdb.getSession(); + OrientDB orientDB = new OrientDB( + orientdb.getServerUrl(), + orientdb.getServerUser(), + orientdb.getServerPassword(), + OrientDBConfig.defaultConfig() + ); + ODatabaseSession session = orientDB.open( + orientdb.getDatabaseName(), + orientdb.getUsername(), + orientdb.getPassword() + ); session.command("CREATE CLASS Person EXTENDS V"); session.command("INSERT INTO Person set name='john'"); @@ -52,7 +52,17 @@ void shouldQueryWithGremlin() { ) { orientdb.start(); - final ODatabaseSession session = orientdb.getSession("admin", "admin"); + OrientDB orientDB = new OrientDB( + orientdb.getServerUrl(), + orientdb.getServerUser(), + orientdb.getServerPassword(), + OrientDBConfig.defaultConfig() + ); + ODatabaseSession session = orientDB.open( + orientdb.getDatabaseName(), + orientdb.getUsername(), + orientdb.getPassword() + ); session.command("CREATE CLASS Person EXTENDS V"); session.command("INSERT INTO Person set name='john'"); @@ -66,7 +76,7 @@ void shouldQueryWithGremlin() { void shouldInitializeDatabaseFromScript() { try ( OrientDBContainer orientdb = new OrientDBContainer(ORIENTDB_IMAGE) - .withScriptPath("initscript.osql") + .withScriptPath(MountableFile.forClasspathResource("initscript.osql")) .withDatabaseName("persons") ) { orientdb.start(); @@ -74,7 +84,17 @@ void shouldInitializeDatabaseFromScript() { assertThat(orientdb.getDbUrl()) .isEqualTo("remote:" + orientdb.getHost() + ":" + orientdb.getMappedPort(2424) + "/persons"); - final ODatabaseSession session = orientdb.getSession(); + OrientDB orientDB = new OrientDB( + orientdb.getServerUrl(), + orientdb.getServerUser(), + orientdb.getServerPassword(), + OrientDBConfig.defaultConfig() + ); + ODatabaseSession session = orientDB.open( + orientdb.getDatabaseName(), + orientdb.getUsername(), + orientdb.getPassword() + ); assertThat(session.query("SELECT FROM Person").stream()).hasSize(4); } From a7f14aa74969340d1e1cf14050d6bb15cee78f6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 13 Oct 2025 11:54:17 -0600 Subject: [PATCH 0928/1224] Polish --- .../testcontainers/cratedb/CrateDBContainer.java | 2 +- .../org/testcontainers/neo4j/Neo4jContainer.java | 11 +++++------ .../postgresql/PostgreSQLContainer.java | 14 +++++++------- .../testcontainers/containers/PrestoContainer.java | 11 ++++++----- .../org/testcontainers/solace/SolaceContainer.java | 2 +- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java b/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java index 039128174c1..d91704eba3d 100644 --- a/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java +++ b/modules/cratedb/src/main/java/org/testcontainers/cratedb/CrateDBContainer.java @@ -47,7 +47,7 @@ public CrateDBContainer(final DockerImageName dockerImageName) { dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); withCommand("crate -C discovery.type=single-node"); - this.waitStrategy = Wait.forHttp("/").forPort(CRATEDB_HTTP_PORT).forStatusCode(200); + waitingFor(Wait.forHttp("/").forPort(CRATEDB_HTTP_PORT).forStatusCode(200)); addExposedPort(CRATEDB_PG_PORT); addExposedPort(CRATEDB_HTTP_PORT); diff --git a/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java index 23a94c98c8f..e96204ac418 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java @@ -104,11 +104,12 @@ public Neo4jContainer(final DockerImageName dockerImageName) { dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); - this.waitStrategy = + waitingFor( new WaitAllStrategy() .withStrategy(WAIT_FOR_BOLT) .withStrategy(WAIT_FOR_HTTP) - .withStartupTimeout(Duration.ofMinutes(2)); + .withStartupTimeout(Duration.ofMinutes(2)) + ); addExposedPorts(DEFAULT_BOLT_PORT, DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); } @@ -168,11 +169,9 @@ private void configureWaitStrategy() { boolean onlyHttpExposed = !boltExposed && httpExposed; if (onlyBoltExposed) { - this.waitStrategy = - new WaitAllStrategy().withStrategy(WAIT_FOR_BOLT).withStartupTimeout(Duration.ofMinutes(2)); + waitingFor(new WaitAllStrategy().withStrategy(WAIT_FOR_BOLT).withStartupTimeout(Duration.ofMinutes(2))); } else if (onlyHttpExposed) { - this.waitStrategy = - new WaitAllStrategy().withStrategy(WAIT_FOR_HTTP).withStartupTimeout(Duration.ofMinutes(2)); + waitingFor(new WaitAllStrategy().withStrategy(WAIT_FOR_HTTP).withStartupTimeout(Duration.ofMinutes(2))); } } diff --git a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java index 9b02019052d..27521487a23 100644 --- a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java +++ b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLContainer.java @@ -2,7 +2,7 @@ import org.jetbrains.annotations.NotNull; import org.testcontainers.containers.JdbcDatabaseContainer; -import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; import java.time.Duration; @@ -50,12 +50,12 @@ public PostgreSQLContainer(final DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME, PGVECTOR_IMAGE_NAME); - this.waitStrategy = - new LogMessageWaitStrategy() - .withRegEx(".*database system is ready to accept connections.*\\s") - .withTimes(2) - .withStartupTimeout(Duration.of(60, ChronoUnit.SECONDS)); - this.setCommand("postgres", "-c", FSYNC_OFF_OPTION); + waitingFor( + Wait + .forLogMessage(".*database system is ready to accept connections.*\\s", 2) + .withStartupTimeout(Duration.of(60, ChronoUnit.SECONDS)) + ); + setCommand("postgres", "-c", FSYNC_OFF_OPTION); addExposedPort(POSTGRESQL_PORT); } 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 946f6a95c6d..ac01eff1882 100644 --- a/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java +++ b/modules/presto/src/main/java/org/testcontainers/containers/PrestoContainer.java @@ -2,7 +2,7 @@ import com.google.common.base.Strings; import org.jetbrains.annotations.NotNull; -import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.utility.DockerImageName; import java.sql.Connection; @@ -47,10 +47,11 @@ public PrestoContainer(final DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); - this.waitStrategy = - new LogMessageWaitStrategy() - .withRegEx(".*======== SERVER STARTED ========.*") - .withStartupTimeout(Duration.of(60, ChronoUnit.SECONDS)); + waitingFor( + Wait + .forLogMessage(".*======== SERVER STARTED ========.*", 1) + .withStartupTimeout(Duration.of(60, ChronoUnit.SECONDS)) + ); addExposedPort(PRESTO_PORT); } diff --git a/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java b/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java index 00db0606536..2ab22c8ffa6 100644 --- a/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java +++ b/modules/solace/src/main/java/org/testcontainers/solace/SolaceContainer.java @@ -79,7 +79,7 @@ public SolaceContainer(DockerImageName dockerImageName) { .withShmSize(SHM_SIZE) .withUlimits(new Ulimit[] { new Ulimit("nofile", 2448L, 1048576L) }); }); - this.waitStrategy = Wait.forLogMessage(SOLACE_READY_MESSAGE, 1).withStartupTimeout(Duration.ofSeconds(60)); + waitingFor(Wait.forLogMessage(SOLACE_READY_MESSAGE, 1).withStartupTimeout(Duration.ofSeconds(60))); withExposedPorts(8080); withEnv("username_admin_globalaccesslevel", "admin"); withEnv("username_admin_password", "admin"); From c8aa7c7582a2e17ebd1734cd4e8b65a0d3135cd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 13 Oct 2025 23:08:16 -0600 Subject: [PATCH 0929/1224] Move CassandraDatabaseDelegate and CassandraQueryWaitStrategy to org.testcontainers.cassandra (#11105) --- .../java/org/testcontainers/cassandra/CassandraContainer.java | 2 -- .../cassandra/{delegate => }/CassandraDatabaseDelegate.java | 3 +-- .../cassandra/{wait => }/CassandraQueryWaitStrategy.java | 3 +-- .../containers/delegate/CassandraDatabaseDelegate.java | 2 +- .../containers/wait/CassandraQueryWaitStrategy.java | 2 +- 5 files changed, 4 insertions(+), 8 deletions(-) rename modules/cassandra/src/main/java/org/testcontainers/cassandra/{delegate => }/CassandraDatabaseDelegate.java (96%) rename modules/cassandra/src/main/java/org/testcontainers/cassandra/{wait => }/CassandraQueryWaitStrategy.java (93%) diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java index 73a0c83443e..e10488176ac 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java @@ -1,8 +1,6 @@ package org.testcontainers.cassandra; import com.github.dockerjava.api.command.InspectContainerResponse; -import org.testcontainers.cassandra.delegate.CassandraDatabaseDelegate; -import org.testcontainers.cassandra.wait.CassandraQueryWaitStrategy; import org.testcontainers.containers.GenericContainer; import org.testcontainers.ext.ScriptUtils; import org.testcontainers.ext.ScriptUtils.ScriptLoadException; diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java similarity index 96% rename from modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java rename to modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java index 47b92958ea5..6965b3a1df8 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/delegate/CassandraDatabaseDelegate.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java @@ -1,10 +1,9 @@ -package org.testcontainers.cassandra.delegate; +package org.testcontainers.cassandra; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import org.testcontainers.cassandra.CassandraContainer; import org.testcontainers.containers.Container; import org.testcontainers.containers.ContainerState; import org.testcontainers.containers.ExecConfig; diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java similarity index 93% rename from modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java rename to modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java index 1d1004eb3df..d42f9f7c324 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/wait/CassandraQueryWaitStrategy.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java @@ -1,7 +1,6 @@ -package org.testcontainers.cassandra.wait; +package org.testcontainers.cassandra; import org.rnorth.ducttape.TimeoutException; -import org.testcontainers.cassandra.delegate.CassandraDatabaseDelegate; import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; import org.testcontainers.delegate.DatabaseDelegate; diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java b/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java index 33372ca6c78..7b7739490ea 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/delegate/CassandraDatabaseDelegate.java @@ -14,7 +14,7 @@ /** * Cassandra database delegate * - * @deprecated use {@link org.testcontainers.cassandra.delegate.CassandraDatabaseDelegate} instead. + * @deprecated use {@link org.testcontainers.cassandra.CassandraDatabaseDelegate} instead. */ @Slf4j @RequiredArgsConstructor diff --git a/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java b/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java index 362e33e3543..9694711de6e 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java +++ b/modules/cassandra/src/main/java/org/testcontainers/containers/wait/CassandraQueryWaitStrategy.java @@ -13,7 +13,7 @@ /** * Waits until Cassandra returns its version * - * @deprecated use {@link org.testcontainers.cassandra.wait.CassandraQueryWaitStrategy} instead. + * @deprecated use {@link org.testcontainers.cassandra.CassandraQueryWaitStrategy} instead. */ @Deprecated public class CassandraQueryWaitStrategy extends AbstractWaitStrategy { From 11881bfc6610a212d36af27f49e587071d0c4975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20K=C3=A5sene?= <6691406+ThomasKasene@users.noreply.github.com> Date: Tue, 14 Oct 2025 07:14:06 +0200 Subject: [PATCH 0930/1224] Fix Kafka listeners and advertised listeners config to come out of sync (#11068) --- .../org/testcontainers/kafka/ConfluentKafkaContainer.java | 6 +++--- .../main/java/org/testcontainers/kafka/KafkaContainer.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java index abbd2bfd908..381ba836715 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/ConfluentKafkaContainer.java @@ -6,7 +6,7 @@ import org.testcontainers.utility.DockerImageName; import java.util.ArrayList; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.function.Supplier; @@ -22,9 +22,9 @@ public class ConfluentKafkaContainer extends GenericContainer listeners = new HashSet<>(); + private final Set listeners = new LinkedHashSet<>(); - private final Set> advertisedListeners = new HashSet<>(); + private final Set> advertisedListeners = new LinkedHashSet<>(); public ConfluentKafkaContainer(String imageName) { this(DockerImageName.parse(imageName)); diff --git a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java index e946e0a8992..375fd132f6c 100644 --- a/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java +++ b/modules/kafka/src/main/java/org/testcontainers/kafka/KafkaContainer.java @@ -6,7 +6,7 @@ import org.testcontainers.utility.DockerImageName; import java.util.ArrayList; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.function.Supplier; @@ -28,9 +28,9 @@ public class KafkaContainer extends GenericContainer { private static final String STARTER_SCRIPT = "/tmp/testcontainers_start.sh"; - private final Set listeners = new HashSet<>(); + private final Set listeners = new LinkedHashSet<>(); - private final Set> advertisedListeners = new HashSet<>(); + private final Set> advertisedListeners = new LinkedHashSet<>(); public KafkaContainer(String imageName) { this(DockerImageName.parse(imageName)); From fb73ad16c6aeb0684b1b1352251f652aafb7c422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Mon, 13 Oct 2025 23:16:25 -0600 Subject: [PATCH 0931/1224] Add Solr container implementation under org.testcontainers.solr (#11104) --- docs/modules/solr.md | 2 +- .../containers/SolrContainer.java | 2 + .../testcontainers/solr/SolrContainer.java | 156 ++++++++++++++++++ .../SolrContainerTest.java | 4 +- 4 files changed, 161 insertions(+), 3 deletions(-) create mode 100644 modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java rename modules/solr/src/test/java/org/testcontainers/{containers => solr}/SolrContainerTest.java (97%) diff --git a/docs/modules/solr.md b/docs/modules/solr.md index a332c7cbcbe..73546dcbd6d 100644 --- a/docs/modules/solr.md +++ b/docs/modules/solr.md @@ -9,7 +9,7 @@ Note that it's based on the [official Docker image](https://hub.docker.com/_/sol 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 +[Using a Solr container](../../modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java) inside_block:solrContainerUsage ## Adding this module to your project dependencies diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java index c4172bb8e01..a921eb2f458 100644 --- a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java +++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java @@ -23,6 +23,8 @@ *
  • Solr: 8983
  • *
  • Zookeeper: 9983
  • * + * + * @deprecated use {@link org.testcontainers.solr.SolrContainer} instead. */ public class SolrContainer extends GenericContainer { diff --git a/modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java new file mode 100644 index 00000000000..536afa69dfd --- /dev/null +++ b/modules/solr/src/main/java/org/testcontainers/solr/SolrContainer.java @@ -0,0 +1,156 @@ +package org.testcontainers.solr; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import lombok.SneakyThrows; +import org.apache.commons.lang3.StringUtils; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.SolrClientUtils; +import org.testcontainers.containers.SolrContainerConfiguration; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.ComparableVersion; +import org.testcontainers.utility.DockerImageName; + +import java.net.URL; +import java.time.Duration; +import java.util.HashSet; +import java.util.Set; + +/** + * Testcontainers implementation for Solr. + *

    + * Supported image: {@code solr} + *

    + * Exposed ports: + *

      + *
    • Solr: 8983
    • + *
    • Zookeeper: 9983
    • + *
    + */ +public class SolrContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("solr"); + + public static final Integer ZOOKEEPER_PORT = 9983; + + public static final Integer SOLR_PORT = 8983; + + private SolrContainerConfiguration configuration; + + private final ComparableVersion imageVersion; + + public SolrContainer(final String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + public SolrContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + waitingFor( + Wait.forLogMessage(".*o\\.e\\.j\\.s\\.Server Started.*", 1).withStartupTimeout(Duration.ofMinutes(1)) + ); + this.configuration = new SolrContainerConfiguration(); + this.imageVersion = new ComparableVersion(dockerImageName.getVersionPart()); + } + + 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 if you want to use a schema"); + } + // Generate Command Builder + String command = "solr start -f"; + // Add Default Ports + addExposedPort(SOLR_PORT); + + // Configure Zookeeper + if (configuration.isZookeeper()) { + addExposedPort(ZOOKEEPER_PORT); + if (this.imageVersion.isGreaterThanOrEqualTo("9.7.0")) { + command = "-DzkRun --host localhost"; + } else { + command = "-DzkRun -h localhost"; + } + } + + // Apply generated Command + 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", "-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( + getHost(), + getSolrPort(), + configuration.getConfigurationName(), + configuration.getSolrConfiguration(), + configuration.getSolrSchema() + ); + } + + SolrClientUtils.createCollection( + getHost(), + getSolrPort(), + configuration.getCollectionName(), + configuration.getConfigurationName() + ); + } +} diff --git a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java b/modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java similarity index 97% rename from modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java rename to modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java index 0e463d11111..f63c4d38164 100644 --- a/modules/solr/src/test/java/org/testcontainers/containers/SolrContainerTest.java +++ b/modules/solr/src/test/java/org/testcontainers/solr/SolrContainerTest.java @@ -1,4 +1,4 @@ -package org.testcontainers.containers; +package org.testcontainers.solr; import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.SolrServerException; @@ -12,7 +12,7 @@ import static org.assertj.core.api.Assertions.assertThat; -public class SolrContainerTest { +class SolrContainerTest { private SolrClient client = null; From 16d93e363f2816e34ab827364d4df3565ab2e64f Mon Sep 17 00:00:00 2001 From: Maxime Wiewiora <48218208+maximevw@users.noreply.github.com> Date: Tue, 14 Oct 2025 18:41:53 +0200 Subject: [PATCH 0932/1224] Fix CassandraContainer wait strategy when SSL is configured (#9419) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #9410 --------- Co-authored-by: Eddú Meléndez --- docs/modules/databases/cassandra.md | 13 + .../cassandra/CassandraContainer.java | 47 +- .../cassandra/CassandraDatabaseDelegate.java | 22 +- .../cassandra/CassandraQueryWaitStrategy.java | 13 +- modules/cassandra/src/main/resources/cqlshrc | 7 + .../cassandra/CassandraContainerTest.java | 104 +- .../cassandra-ssl-configuration/cassandra.cer | Bin 0 -> 882 bytes .../cassandra.yaml | 1233 +++++++++++++++++ .../cassandra-ssl-configuration/keystore.p12 | Bin 0 -> 2734 bytes .../truststore.p12 | Bin 0 -> 1270 bytes .../resources/client-ssl/cassandra.cer.pem | 26 + .../resources/client-ssl/cassandra.key.pem | 32 + 12 files changed, 1487 insertions(+), 10 deletions(-) create mode 100644 modules/cassandra/src/main/resources/cqlshrc create mode 100644 modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.cer create mode 100644 modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.yaml create mode 100644 modules/cassandra/src/test/resources/cassandra-ssl-configuration/keystore.p12 create mode 100644 modules/cassandra/src/test/resources/cassandra-ssl-configuration/truststore.p12 create mode 100644 modules/cassandra/src/test/resources/client-ssl/cassandra.cer.pem create mode 100644 modules/cassandra/src/test/resources/client-ssl/cassandra.key.pem diff --git a/docs/modules/databases/cassandra.md b/docs/modules/databases/cassandra.md index 5a062e4a059..80dcb220454 100644 --- a/docs/modules/databases/cassandra.md +++ b/docs/modules/databases/cassandra.md @@ -20,6 +20,19 @@ This example connects to the Cassandra cluster: [Running init script with required authentication](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java) inside_block:init-with-auth +## Using secure connection (TLS) + +If you override the default `cassandra.yaml` with a version setting the property `client_encryption_options.optional` +to `false`, you have to provide a valid client certificate and key (PEM format) when you initialize your container: + + +[SSL setup](../../../modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java) inside_block:with-ssl-config + + +!!! hint + To generate the client certificate and key, please refer to + [this documentation](https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/configuration/secureSSLCertificates.html). + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java index e10488176ac..3fb8554f137 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.cassandra; import com.github.dockerjava.api.command.InspectContainerResponse; +import org.apache.commons.lang3.StringUtils; import org.testcontainers.containers.GenericContainer; import org.testcontainers.ext.ScriptUtils; import org.testcontainers.ext.ScriptUtils.ScriptLoadException; @@ -37,6 +38,10 @@ public class CassandraContainer extends GenericContainer { private String initScriptPath; + private String clientCertFile; + + private String clientKeyFile; + public CassandraContainer(String dockerImageName) { this(DockerImageName.parse(dockerImageName)); } @@ -66,6 +71,15 @@ protected void configure() { .ofNullable(configLocation) .map(MountableFile::forClasspathResource) .ifPresent(mountableFile -> withCopyFileToContainer(mountableFile, CONTAINER_CONFIG_LOCATION)); + + // If a secure connection is required by Cassandra configuration, copy the user certificate and key to a + // dedicated location and define a cqlshrc file with the appropriate SSL configuration. + // See: https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/configuration/secureCqlshSSL.html + if (isSslRequired()) { + withCopyFileToContainer(MountableFile.forClasspathResource(clientCertFile), "ssl/user_cert.pem"); + withCopyFileToContainer(MountableFile.forClasspathResource(clientKeyFile), "ssl/user_key.pem"); + withCopyFileToContainer(MountableFile.forClasspathResource("cqlshrc"), "/root/.cassandra/cqlshrc"); + } } @Override @@ -106,9 +120,11 @@ private void runInitScriptIfRequired() { * Initialize Cassandra with the custom overridden Cassandra configuration *

    * Be aware, that Docker effectively replaces all /etc/cassandra content with the content of config location, so if - * Cassandra.yaml in configLocation is absent or corrupted, then Cassandra just won't launch + * Cassandra.yaml in configLocation is absent or corrupted, then Cassandra just won't launch. * - * @param configLocation relative classpath with the directory that contains cassandra.yaml and other configuration files + * @param configLocation relative classpath with the directory that contains cassandra.yaml and other configuration + * files + * @return The updated {@link CassandraContainer}. */ public CassandraContainer withConfigurationOverride(String configLocation) { this.configLocation = configLocation; @@ -122,6 +138,7 @@ public CassandraContainer withConfigurationOverride(String configLocation) { *

    * * @param initScriptPath relative classpath resource + * @return The updated {@link CassandraContainer}. */ public CassandraContainer withInitScript(String initScriptPath) { this.initScriptPath = initScriptPath; @@ -129,8 +146,30 @@ public CassandraContainer withInitScript(String initScriptPath) { } /** - * Get username + * Configure secured connection (TLS) when required by the Cassandra configuration + * (i.e. cassandra.yaml file contains the property {@code client_encryption_options.optional} with value + * {@code false}). * + * @param clientCertFile The client certificate required to execute CQL scripts. + * @param clientKeyFile The client key required to execute CQL scripts. + * @return The updated {@link CassandraContainer}. + */ + public CassandraContainer withSsl(String clientCertFile, String clientKeyFile) { + this.clientCertFile = clientCertFile; + this.clientKeyFile = clientKeyFile; + return self(); + } + + /** + * @return Whether a secure connection is required between the client and the Cassandra server. + */ + boolean isSslRequired() { + return StringUtils.isNoneBlank(this.clientCertFile, this.clientKeyFile); + } + + /** + * Get username + *

    * By default, Cassandra has authenticator: AllowAllAuthenticator in cassandra.yaml * If username and password need to be used, then authenticator should be set as PasswordAuthenticator * (through custom Cassandra configuration) and through CQL with default cassandra-cassandra credentials @@ -142,7 +181,7 @@ public String getUsername() { /** * Get password - * + *

    * By default, Cassandra has authenticator: AllowAllAuthenticator in cassandra.yaml * If username and password need to be used, then authenticator should be set as PasswordAuthenticator * (through custom Cassandra configuration) and through CQL with default cassandra-cassandra credentials diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java index 6965b3a1df8..4867b8423e9 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraDatabaseDelegate.java @@ -28,13 +28,13 @@ protected Void createNewConnection() { return null; } - @Override public void execute( String statement, String scriptPath, int lineNumber, boolean continueOnError, - boolean ignoreFailedDrops + boolean ignoreFailedDrops, + boolean silentErrorLogs ) { try { // Use cqlsh command directly inside the container to execute statements @@ -45,6 +45,9 @@ public void execute( CassandraContainer cassandraContainer = (CassandraContainer) this.container; String username = cassandraContainer.getUsername(); String password = cassandraContainer.getPassword(); + if (cassandraContainer.isSslRequired()) { + cqlshCommand = ArrayUtils.add(cqlshCommand, "--ssl"); + } cqlshCommand = ArrayUtils.addAll(cqlshCommand, "-u", username, "-p", password); } @@ -67,7 +70,9 @@ public void execute( log.info("CQL statement {} was applied", statement); } } else { - log.error("CQL script execution failed with error: \n{}", result.getStderr()); + if (!silentErrorLogs) { + log.error("CQL script execution failed with error: \n{}", result.getStderr()); + } throw new ScriptStatementFailedException(statement, lineNumber, scriptPath); } } catch (IOException | InterruptedException e) { @@ -75,6 +80,17 @@ public void execute( } } + @Override + public void execute( + String statement, + String scriptPath, + int lineNumber, + boolean continueOnError, + boolean ignoreFailedDrops + ) { + this.execute(statement, scriptPath, lineNumber, continueOnError, ignoreFailedDrops, false); + } + @Override protected void closeConnectionQuietly(Void session) { // Nothing to do here, because we run scripts using cqlsh command directly in the container. diff --git a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java index d42f9f7c324..19fdcd7f9e1 100644 --- a/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java +++ b/modules/cassandra/src/main/java/org/testcontainers/cassandra/CassandraQueryWaitStrategy.java @@ -1,5 +1,7 @@ package org.testcontainers.cassandra; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.rnorth.ducttape.TimeoutException; import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.containers.wait.strategy.AbstractWaitStrategy; @@ -12,6 +14,7 @@ /** * Waits until Cassandra returns its version */ +@Slf4j public class CassandraQueryWaitStrategy extends AbstractWaitStrategy { private static final String SELECT_VERSION_QUERY = "SELECT release_version FROM system.local"; @@ -29,7 +32,15 @@ protected void waitUntilReady() { getRateLimiter() .doWhenReady(() -> { try (DatabaseDelegate databaseDelegate = getDatabaseDelegate()) { - databaseDelegate.execute(SELECT_VERSION_QUERY, "", 1, false, false); + log.info("Checking connection is ready..."); + ((CassandraDatabaseDelegate) databaseDelegate).execute( + SELECT_VERSION_QUERY, + StringUtils.EMPTY, + 1, + false, + false, + true + ); } }); return true; diff --git a/modules/cassandra/src/main/resources/cqlshrc b/modules/cassandra/src/main/resources/cqlshrc new file mode 100644 index 00000000000..02e001098af --- /dev/null +++ b/modules/cassandra/src/main/resources/cqlshrc @@ -0,0 +1,7 @@ +[ssl] +certfile = ssl/user_cert.pem +usercert = ssl/user_cert.pem +userkey = ssl/user_key.pem + +[connection] +factory = cqlshlib.ssl.ssl_transport_factory \ No newline at end of file diff --git a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java index c4368dc8065..49243317a40 100644 --- a/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java +++ b/modules/cassandra/src/test/java/org/testcontainers/cassandra/CassandraContainerTest.java @@ -1,18 +1,30 @@ package org.testcontainers.cassandra; import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.core.CqlSessionBuilder; +import com.datastax.oss.driver.api.core.config.DefaultDriverOption; +import com.datastax.oss.driver.api.core.config.DriverConfigLoader; +import com.datastax.oss.driver.api.core.config.ProgrammaticDriverConfigLoaderBuilder; +import com.datastax.oss.driver.api.core.context.DriverContext; import com.datastax.oss.driver.api.core.cql.ResultSet; import com.datastax.oss.driver.api.core.cql.Row; +import com.datastax.oss.driver.api.core.session.ProgrammaticArguments; +import com.datastax.oss.driver.internal.core.context.DefaultDriverContext; +import com.datastax.oss.driver.internal.core.ssl.DefaultSslEngineFactory; import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; import org.testcontainers.containers.ContainerLaunchException; import org.testcontainers.utility.DockerImageName; +import java.net.URL; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.fail; class CassandraContainerTest { - private static final String CASSANDRA_IMAGE = "cassandra:3.11.2"; + private static final String CASSANDRA_IMAGE = "cassandra:3.11.15"; private static final String TEST_CLUSTER_NAME_IN_CONF = "Test Cluster Integration Test"; @@ -21,7 +33,7 @@ class CassandraContainerTest { @Test void testSimple() { try ( // container-definition { - CassandraContainer cassandraContainer = new CassandraContainer("cassandra:3.11.2") + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) // } ) { cassandraContainer.start(); @@ -61,6 +73,69 @@ void testConfigurationOverride() { } } + @Test + public void testWithSslClientConfig() { + /* + Commands executed to generate certificates in 'cassandra-ssl-configuration' directory: + keytool -genkey -keyalg RSA -validity 36500 -alias localhost -keystore keystore.p12 -storepass cassandra \ + -keypass cassandra -dname "CN=localhost, OU=Testcontainers, O=Testcontainers, L=None, C=None" + keytool -export -alias localhost -file cassandra.cer -keystore keystore.p12 + keytool -import -v -trustcacerts -alias localhost -file cassandra.cer -keystore truststore.p12 + + Commands executed to generate the client certificate and key in 'client-ssl' directory: + keytool -importkeystore -srckeystore keystore.p12 -destkeystore test_node.p12 -deststoretype PKCS12 \ + -srcstorepass cassandra -deststorepass cassandra + openssl pkcs12 -in test_node.p12 -nokeys -out cassandra.cer.pem -passin pass:cassandra + openssl pkcs12 -in test_node.p12 -nodes -nocerts -out cassandra.key.pem -passin pass:cassandra + + Reference: + https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/configuration/secureSSLCertificates.html + https://docs.datastax.com/en/cassandra-oss/3.x/cassandra/configuration/secureCqlshSSL.html + */ + try ( + // with-ssl-config { + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withConfigurationOverride("cassandra-ssl-configuration") + .withSsl("client-ssl/cassandra.cer.pem", "client-ssl/cassandra.key.pem") + // } + ) { + cassandraContainer.start(); + try { + ResultSet resultSet = performQueryWithSslClientConfig( + cassandraContainer, + "SELECT cluster_name FROM system.local" + ); + assertThat(resultSet.wasApplied()).as("Query was applied").isTrue(); + assertThat(resultSet.one().getString(0)) + .as("Cassandra configuration is configured with secured connection") + .isEqualTo(TEST_CLUSTER_NAME_IN_CONF); + } catch (Exception e) { + fail(e); + } + } + } + + @Test + public void testSimpleSslCqlsh() { + try ( + CassandraContainer cassandraContainer = new CassandraContainer(CASSANDRA_IMAGE) + .withConfigurationOverride("cassandra-ssl-configuration") + .withSsl("client-ssl/cassandra.cer.pem", "client-ssl/cassandra.key.pem") + ) { + cassandraContainer.start(); + + Container.ExecResult execResult = cassandraContainer.execInContainer( + "cqlsh", + "--ssl", + "-e", + "SELECT * FROM system_schema.keyspaces;" + ); + assertThat(execResult.getStdout()).contains("keyspace_name"); + } catch (Exception e) { + fail(e); + } + } + @Test void testEmptyConfigurationOverride() { try ( @@ -164,6 +239,31 @@ private ResultSet performQueryWithAuth(CassandraContainer cassandraContainer, St return performQuery(cqlSession, cql); } + private ResultSet performQueryWithSslClientConfig(CassandraContainer cassandraContainer, String cql) { + final ProgrammaticDriverConfigLoaderBuilder driverConfigLoaderBuilder = DriverConfigLoader.programmaticBuilder(); + driverConfigLoaderBuilder.withBoolean(DefaultDriverOption.SSL_HOSTNAME_VALIDATION, false); + final URL trustStoreUrl = + this.getClass().getClassLoader().getResource("cassandra-ssl-configuration/truststore.p12"); + driverConfigLoaderBuilder.withString(DefaultDriverOption.SSL_TRUSTSTORE_PATH, trustStoreUrl.getFile()); + driverConfigLoaderBuilder.withString(DefaultDriverOption.SSL_TRUSTSTORE_PASSWORD, "cassandra"); + final URL keyStoreUrl = + this.getClass().getClassLoader().getResource("cassandra-ssl-configuration/keystore.p12"); + driverConfigLoaderBuilder.withString(DefaultDriverOption.SSL_KEYSTORE_PATH, keyStoreUrl.getFile()); + driverConfigLoaderBuilder.withString(DefaultDriverOption.SSL_KEYSTORE_PASSWORD, "cassandra"); + final DriverContext driverContext = new DefaultDriverContext( + driverConfigLoaderBuilder.build(), + ProgrammaticArguments.builder().build() + ); + + final CqlSessionBuilder sessionBuilder = CqlSession.builder(); + final CqlSession cqlSession = sessionBuilder + .addContactPoint(cassandraContainer.getContactPoint()) + .withLocalDatacenter(cassandraContainer.getLocalDatacenter()) + .withSslEngineFactory(new DefaultSslEngineFactory(driverContext)) + .build(); + return performQuery(cqlSession, cql); + } + private ResultSet performQuery(CqlSession session, String cql) { final ResultSet rs = session.execute(cql); session.close(); diff --git a/modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.cer b/modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.cer new file mode 100644 index 0000000000000000000000000000000000000000..7a6aee6dec4a01edb55ca6fb70237635a438d91a GIT binary patch literal 882 zcmXqLV$L&YVhUTp%*4pV#L2K=s*+ZoyzhSlUN%mxHjlRNyo`+8tPBPzhP(#cY|No7 zY{D#l`FW`@E<2PfZXgPhTQ zWaJl@7$}JI8krax7+M;dm>3yYL`m=)85)@wSQ?o^1?c3CCPpRX0AOTgU~XdMXE11D zN{rf)CX=_rOx#7Ih)?X{PWB$ z1#1`jPtu(KM1kd&m!ssNyuUo3mb;%!3kYA9$*dZ6Y^m6d^D}!NXk9mpm{G&9)!ioF z*EZM6qIr^kifs6sXT_rV*SAetx7NW)w=N>p-rQN_`Ie=<(^+fRY&~KXD3YQ*?cIs* z-EAeWHIAQ-aP87qbIBon`LD3ItS*t~ywbGKYppVRwQ^bB#^PU2A)$JU8Td@(-!47f z?O<*meleFguHCP$M@bGs{ttlK7E z&`)zg4n$xo0tO-@!;awJZgx+C?&ZI}Huo0OTISD3*_u~z$#c!Sw|)DujSl`N}T z6RlbJod1)7g0}6^j2GYM-xE|mc)oz|iH714+e)$AgxHIf#5+3_RY z>`nE?ck$H;HT#CF()yPGvmw+%OoDV6`OXf?OgJ+{%qs*yAD+{ zJLaA|v}$8z&zIRLAx1JE1$sAsGts_dp={=+y-etHX6Q5PW{v%(AMY5)aUWn_bl+bp zZS(D}r!MA`qBTF}acwRwY(I8q;)QLdlb_i==bCc+(BBKT8h2+$8AzV`5naacck|NS c3F}W?-1xU_$DfG-e@;60b(zih^q{y3005Xxi~s-t literal 0 HcmV?d00001 diff --git a/modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.yaml b/modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.yaml new file mode 100644 index 00000000000..116ba3429cf --- /dev/null +++ b/modules/cassandra/src/test/resources/cassandra-ssl-configuration/cassandra.yaml @@ -0,0 +1,1233 @@ +# Cassandra storage config YAML + +# NOTE: +# See http://wiki.apache.org/cassandra/StorageConfiguration for +# full explanations of configuration directives +# /NOTE + +# The name of the cluster. This is mainly used to prevent machines in +# one logical cluster from joining another. +cluster_name: 'Test Cluster Integration Test' + +# This defines the number of tokens randomly assigned to this node on the ring +# The more tokens, relative to other nodes, the larger the proportion of data +# that this node will store. You probably want all nodes to have the same number +# of tokens assuming they have equal hardware capability. +# +# If you leave this unspecified, Cassandra will use the default of 1 token for legacy compatibility, +# and will use the initial_token as described below. +# +# Specifying initial_token will override this setting on the node's initial start, +# on subsequent starts, this setting will apply even if initial token is set. +# +# If you already have a cluster with 1 token per node, and wish to migrate to +# multiple tokens per node, see http://wiki.apache.org/cassandra/Operations +num_tokens: 256 + +# Triggers automatic allocation of num_tokens tokens for this node. The allocation +# algorithm attempts to choose tokens in a way that optimizes replicated load over +# the nodes in the datacenter for the replication strategy used by the specified +# keyspace. +# +# The load assigned to each node will be close to proportional to its number of +# vnodes. +# +# Only supported with the Murmur3Partitioner. +# allocate_tokens_for_keyspace: KEYSPACE + +# initial_token allows you to specify tokens manually. While you can use it with +# vnodes (num_tokens > 1, above) -- in which case you should provide a +# comma-separated list -- it's primarily used when adding nodes to legacy clusters +# that do not have vnodes enabled. +# initial_token: + +# See http://wiki.apache.org/cassandra/HintedHandoff +# May either be "true" or "false" to enable globally +hinted_handoff_enabled: true + +# When hinted_handoff_enabled is true, a black list of data centers that will not +# perform hinted handoff +# hinted_handoff_disabled_datacenters: +# - DC1 +# - DC2 + +# this defines the maximum amount of time a dead host will have hints +# generated. After it has been dead this long, new hints for it will not be +# created until it has been seen alive and gone down again. +max_hint_window_in_ms: 10800000 # 3 hours + +# Maximum throttle in KBs per second, per delivery thread. This will be +# reduced proportionally to the number of nodes in the cluster. (If there +# are two nodes in the cluster, each delivery thread will use the maximum +# rate; if there are three, each will throttle to half of the maximum, +# since we expect two nodes to be delivering hints simultaneously.) +hinted_handoff_throttle_in_kb: 1024 + +# Number of threads with which to deliver hints; +# Consider increasing this number when you have multi-dc deployments, since +# cross-dc handoff tends to be slower +max_hints_delivery_threads: 2 + +# Directory where Cassandra should store hints. +# If not set, the default directory is $CASSANDRA_HOME/data/hints. +# hints_directory: /var/lib/cassandra/hints + +# How often hints should be flushed from the internal buffers to disk. +# Will *not* trigger fsync. +hints_flush_period_in_ms: 10000 + +# Maximum size for a single hints file, in megabytes. +max_hints_file_size_in_mb: 128 + +# Compression to apply to the hint files. If omitted, hints files +# will be written uncompressed. LZ4, Snappy, and Deflate compressors +# are supported. +#hints_compression: +# - class_name: LZ4Compressor +# parameters: +# - + +# Maximum throttle in KBs per second, total. This will be +# reduced proportionally to the number of nodes in the cluster. +batchlog_replay_throttle_in_kb: 1024 + +# Authentication backend, implementing IAuthenticator; used to identify users +# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthenticator, +# PasswordAuthenticator}. +# +# - AllowAllAuthenticator performs no checks - set it to disable authentication. +# - PasswordAuthenticator relies on username/password pairs to authenticate +# users. It keeps usernames and hashed passwords in system_auth.roles table. +# Please increase system_auth keyspace replication factor if you use this authenticator. +# If using PasswordAuthenticator, CassandraRoleManager must also be used (see below) +authenticator: AllowAllAuthenticator + +# Authorization backend, implementing IAuthorizer; used to limit access/provide permissions +# Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthorizer, +# CassandraAuthorizer}. +# +# - AllowAllAuthorizer allows any action to any user - set it to disable authorization. +# - CassandraAuthorizer stores permissions in system_auth.role_permissions table. Please +# increase system_auth keyspace replication factor if you use this authorizer. +authorizer: AllowAllAuthorizer + +# Part of the Authentication & Authorization backend, implementing IRoleManager; used +# to maintain grants and memberships between roles. +# Out of the box, Cassandra provides org.apache.cassandra.auth.CassandraRoleManager, +# which stores role information in the system_auth keyspace. Most functions of the +# IRoleManager require an authenticated login, so unless the configured IAuthenticator +# actually implements authentication, most of this functionality will be unavailable. +# +# - CassandraRoleManager stores role data in the system_auth keyspace. Please +# increase system_auth keyspace replication factor if you use this role manager. +role_manager: CassandraRoleManager + +# Validity period for roles cache (fetching granted roles can be an expensive +# operation depending on the role manager, CassandraRoleManager is one example) +# Granted roles are cached for authenticated sessions in AuthenticatedUser and +# after the period specified here, become eligible for (async) reload. +# Defaults to 2000, set to 0 to disable caching entirely. +# Will be disabled automatically for AllowAllAuthenticator. +roles_validity_in_ms: 2000 + +# Refresh interval for roles cache (if enabled). +# After this interval, cache entries become eligible for refresh. Upon next +# access, an async reload is scheduled and the old value returned until it +# completes. If roles_validity_in_ms is non-zero, then this must be +# also. +# Defaults to the same value as roles_validity_in_ms. +# roles_update_interval_in_ms: 2000 + +# Validity period for permissions cache (fetching permissions can be an +# expensive operation depending on the authorizer, CassandraAuthorizer is +# one example). Defaults to 2000, set to 0 to disable. +# Will be disabled automatically for AllowAllAuthorizer. +permissions_validity_in_ms: 2000 + +# Refresh interval for permissions cache (if enabled). +# After this interval, cache entries become eligible for refresh. Upon next +# access, an async reload is scheduled and the old value returned until it +# completes. If permissions_validity_in_ms is non-zero, then this must be +# also. +# Defaults to the same value as permissions_validity_in_ms. +# permissions_update_interval_in_ms: 2000 + +# Validity period for credentials cache. This cache is tightly coupled to +# the provided PasswordAuthenticator implementation of IAuthenticator. If +# another IAuthenticator implementation is configured, this cache will not +# be automatically used and so the following settings will have no effect. +# Please note, credentials are cached in their encrypted form, so while +# activating this cache may reduce the number of queries made to the +# underlying table, it may not bring a significant reduction in the +# latency of individual authentication attempts. +# Defaults to 2000, set to 0 to disable credentials caching. +credentials_validity_in_ms: 2000 + +# Refresh interval for credentials cache (if enabled). +# After this interval, cache entries become eligible for refresh. Upon next +# access, an async reload is scheduled and the old value returned until it +# completes. If credentials_validity_in_ms is non-zero, then this must be +# also. +# Defaults to the same value as credentials_validity_in_ms. +# credentials_update_interval_in_ms: 2000 + +# The partitioner is responsible for distributing groups of rows (by +# partition key) across nodes in the cluster. You should leave this +# alone for new clusters. The partitioner can NOT be changed without +# reloading all data, so when upgrading you should set this to the +# same partitioner you were already using. +# +# Besides Murmur3Partitioner, partitioners included for backwards +# compatibility include RandomPartitioner, ByteOrderedPartitioner, and +# OrderPreservingPartitioner. +# +partitioner: org.apache.cassandra.dht.Murmur3Partitioner + +# Directories where Cassandra should store data on disk. Cassandra +# will spread data evenly across them, subject to the granularity of +# the configured compaction strategy. +# If not set, the default directory is $CASSANDRA_HOME/data/data. +data_file_directories: + - /var/lib/cassandra/data + +# commit log. when running on magnetic HDD, this should be a +# separate spindle than the data directories. +# If not set, the default directory is $CASSANDRA_HOME/data/commitlog. +commitlog_directory: /var/lib/cassandra/commitlog + +# Enable / disable CDC functionality on a per-node basis. This modifies the logic used +# for write path allocation rejection (standard: never reject. cdc: reject Mutation +# containing a CDC-enabled table if at space limit in cdc_raw_directory). +cdc_enabled: false + +# CommitLogSegments are moved to this directory on flush if cdc_enabled: true and the +# segment contains mutations for a CDC-enabled table. This should be placed on a +# separate spindle than the data directories. If not set, the default directory is +# $CASSANDRA_HOME/data/cdc_raw. +# cdc_raw_directory: /var/lib/cassandra/cdc_raw + +# Policy for data disk failures: +# +# die +# shut down gossip and client transports and kill the JVM for any fs errors or +# single-sstable errors, so the node can be replaced. +# +# stop_paranoid +# shut down gossip and client transports even for single-sstable errors, +# kill the JVM for errors during startup. +# +# stop +# shut down gossip and client transports, leaving the node effectively dead, but +# can still be inspected via JMX, kill the JVM for errors during startup. +# +# best_effort +# stop using the failed disk and respond to requests based on +# remaining available sstables. This means you WILL see obsolete +# data at CL.ONE! +# +# ignore +# ignore fatal errors and let requests fail, as in pre-1.2 Cassandra +disk_failure_policy: stop + +# Policy for commit disk failures: +# +# die +# shut down gossip and Thrift and kill the JVM, so the node can be replaced. +# +# stop +# shut down gossip and Thrift, leaving the node effectively dead, but +# can still be inspected via JMX. +# +# stop_commit +# shutdown the commit log, letting writes collect but +# continuing to service reads, as in pre-2.0.5 Cassandra +# +# ignore +# ignore fatal errors and let the batches fail +commit_failure_policy: stop + +# Maximum size of the native protocol prepared statement cache +# +# Valid values are either "auto" (omitting the value) or a value greater 0. +# +# Note that specifying a too large value will result in long running GCs and possbily +# out-of-memory errors. Keep the value at a small fraction of the heap. +# +# If you constantly see "prepared statements discarded in the last minute because +# cache limit reached" messages, the first step is to investigate the root cause +# of these messages and check whether prepared statements are used correctly - +# i.e. use bind markers for variable parts. +# +# Do only change the default value, if you really have more prepared statements than +# fit in the cache. In most cases it is not neccessary to change this value. +# Constantly re-preparing statements is a performance penalty. +# +# Default value ("auto") is 1/256th of the heap or 10MB, whichever is greater +prepared_statements_cache_size_mb: + +# Maximum size of the Thrift prepared statement cache +# +# If you do not use Thrift at all, it is safe to leave this value at "auto". +# +# See description of 'prepared_statements_cache_size_mb' above for more information. +# +# Default value ("auto") is 1/256th of the heap or 10MB, whichever is greater +thrift_prepared_statements_cache_size_mb: + +# Maximum size of the key cache in memory. +# +# Each key cache hit saves 1 seek and each row cache hit saves 2 seeks at the +# minimum, sometimes more. The key cache is fairly tiny for the amount of +# time it saves, so it's worthwhile to use it at large numbers. +# The row cache saves even more time, but must contain the entire row, +# so it is extremely space-intensive. It's best to only use the +# row cache if you have hot rows or static rows. +# +# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup. +# +# Default value is empty to make it "auto" (min(5% of Heap (in MB), 100MB)). Set to 0 to disable key cache. +key_cache_size_in_mb: + +# Duration in seconds after which Cassandra should +# save the key cache. Caches are saved to saved_caches_directory as +# specified in this configuration file. +# +# Saved caches greatly improve cold-start speeds, and is relatively cheap in +# terms of I/O for the key cache. Row cache saving is much more expensive and +# has limited use. +# +# Default is 14400 or 4 hours. +key_cache_save_period: 14400 + +# Number of keys from the key cache to save +# Disabled by default, meaning all keys are going to be saved +# key_cache_keys_to_save: 100 + +# Row cache implementation class name. Available implementations: +# +# org.apache.cassandra.cache.OHCProvider +# Fully off-heap row cache implementation (default). +# +# org.apache.cassandra.cache.SerializingCacheProvider +# This is the row cache implementation availabile +# in previous releases of Cassandra. +# row_cache_class_name: org.apache.cassandra.cache.OHCProvider + +# Maximum size of the row cache in memory. +# Please note that OHC cache implementation requires some additional off-heap memory to manage +# the map structures and some in-flight memory during operations before/after cache entries can be +# accounted against the cache capacity. This overhead is usually small compared to the whole capacity. +# Do not specify more memory that the system can afford in the worst usual situation and leave some +# headroom for OS block level cache. Do never allow your system to swap. +# +# Default value is 0, to disable row caching. +row_cache_size_in_mb: 0 + +# Duration in seconds after which Cassandra should save the row cache. +# Caches are saved to saved_caches_directory as specified in this configuration file. +# +# Saved caches greatly improve cold-start speeds, and is relatively cheap in +# terms of I/O for the key cache. Row cache saving is much more expensive and +# has limited use. +# +# Default is 0 to disable saving the row cache. +row_cache_save_period: 0 + +# Number of keys from the row cache to save. +# Specify 0 (which is the default), meaning all keys are going to be saved +# row_cache_keys_to_save: 100 + +# Maximum size of the counter cache in memory. +# +# Counter cache helps to reduce counter locks' contention for hot counter cells. +# In case of RF = 1 a counter cache hit will cause Cassandra to skip the read before +# write entirely. With RF > 1 a counter cache hit will still help to reduce the duration +# of the lock hold, helping with hot counter cell updates, but will not allow skipping +# the read entirely. Only the local (clock, count) tuple of a counter cell is kept +# in memory, not the whole counter, so it's relatively cheap. +# +# NOTE: if you reduce the size, you may not get you hottest keys loaded on startup. +# +# Default value is empty to make it "auto" (min(2.5% of Heap (in MB), 50MB)). Set to 0 to disable counter cache. +# NOTE: if you perform counter deletes and rely on low gcgs, you should disable the counter cache. +counter_cache_size_in_mb: + +# Duration in seconds after which Cassandra should +# save the counter cache (keys only). Caches are saved to saved_caches_directory as +# specified in this configuration file. +# +# Default is 7200 or 2 hours. +counter_cache_save_period: 7200 + +# Number of keys from the counter cache to save +# Disabled by default, meaning all keys are going to be saved +# counter_cache_keys_to_save: 100 + +# saved caches +# If not set, the default directory is $CASSANDRA_HOME/data/saved_caches. +saved_caches_directory: /var/lib/cassandra/saved_caches + +# commitlog_sync may be either "periodic" or "batch." +# +# When in batch mode, Cassandra won't ack writes until the commit log +# has been fsynced to disk. It will wait +# commitlog_sync_batch_window_in_ms milliseconds between fsyncs. +# This window should be kept short because the writer threads will +# be unable to do extra work while waiting. (You may need to increase +# concurrent_writes for the same reason.) +# +# commitlog_sync: batch +# commitlog_sync_batch_window_in_ms: 2 +# +# the other option is "periodic" where writes may be acked immediately +# and the CommitLog is simply synced every commitlog_sync_period_in_ms +# milliseconds. +commitlog_sync: periodic +commitlog_sync_period_in_ms: 10000 + +# The size of the individual commitlog file segments. A commitlog +# segment may be archived, deleted, or recycled once all the data +# in it (potentially from each columnfamily in the system) has been +# flushed to sstables. +# +# The default size is 32, which is almost always fine, but if you are +# archiving commitlog segments (see commitlog_archiving.properties), +# then you probably want a finer granularity of archiving; 8 or 16 MB +# is reasonable. +# Max mutation size is also configurable via max_mutation_size_in_kb setting in +# cassandra.yaml. The default is half the size commitlog_segment_size_in_mb * 1024. +# This should be positive and less than 2048. +# +# NOTE: If max_mutation_size_in_kb is set explicitly then commitlog_segment_size_in_mb must +# be set to at least twice the size of max_mutation_size_in_kb / 1024 +# +commitlog_segment_size_in_mb: 32 + +# Compression to apply to the commit log. If omitted, the commit log +# will be written uncompressed. LZ4, Snappy, and Deflate compressors +# are supported. +# commitlog_compression: +# - class_name: LZ4Compressor +# parameters: +# - + +# any class that implements the SeedProvider interface and has a +# constructor that takes a Map of parameters will do. +seed_provider: + # Addresses of hosts that are deemed contact points. + # Cassandra nodes use this list of hosts to find each other and learn + # the topology of the ring. You must change this if you are running + # multiple nodes! + - class_name: org.apache.cassandra.locator.SimpleSeedProvider + parameters: + # seeds is actually a comma-delimited list of addresses. + # Ex: ",," + - seeds: "172.17.0.2" + +# For workloads with more data than can fit in memory, Cassandra's +# bottleneck will be reads that need to fetch data from +# disk. "concurrent_reads" should be set to (16 * number_of_drives) in +# order to allow the operations to enqueue low enough in the stack +# that the OS and drives can reorder them. Same applies to +# "concurrent_counter_writes", since counter writes read the current +# values before incrementing and writing them back. +# +# On the other hand, since writes are almost never IO bound, the ideal +# number of "concurrent_writes" is dependent on the number of cores in +# your system; (8 * number_of_cores) is a good rule of thumb. +concurrent_reads: 32 +concurrent_writes: 32 +concurrent_counter_writes: 32 + +# For materialized view writes, as there is a read involved, so this should +# be limited by the less of concurrent reads or concurrent writes. +concurrent_materialized_view_writes: 32 + +# Maximum memory to use for sstable chunk cache and buffer pooling. +# 32MB of this are reserved for pooling buffers, the rest is used as an +# cache that holds uncompressed sstable chunks. +# Defaults to the smaller of 1/4 of heap or 512MB. This pool is allocated off-heap, +# so is in addition to the memory allocated for heap. The cache also has on-heap +# overhead which is roughly 128 bytes per chunk (i.e. 0.2% of the reserved size +# if the default 64k chunk size is used). +# Memory is only allocated when needed. +# file_cache_size_in_mb: 512 + +# Flag indicating whether to allocate on or off heap when the sstable buffer +# pool is exhausted, that is when it has exceeded the maximum memory +# file_cache_size_in_mb, beyond which it will not cache buffers but allocate on request. + +# buffer_pool_use_heap_if_exhausted: true + +# The strategy for optimizing disk read +# Possible values are: +# ssd (for solid state disks, the default) +# spinning (for spinning disks) +# disk_optimization_strategy: ssd + +# Total permitted memory to use for memtables. Cassandra will stop +# accepting writes when the limit is exceeded until a flush completes, +# and will trigger a flush based on memtable_cleanup_threshold +# If omitted, Cassandra will set both to 1/4 the size of the heap. +# memtable_heap_space_in_mb: 2048 +# memtable_offheap_space_in_mb: 2048 + +# memtable_cleanup_threshold is deprecated. The default calculation +# is the only reasonable choice. See the comments on memtable_flush_writers +# for more information. +# +# Ratio of occupied non-flushing memtable size to total permitted size +# that will trigger a flush of the largest memtable. Larger mct will +# mean larger flushes and hence less compaction, but also less concurrent +# flush activity which can make it difficult to keep your disks fed +# under heavy write load. +# +# memtable_cleanup_threshold defaults to 1 / (memtable_flush_writers + 1) +# memtable_cleanup_threshold: 0.11 + +# Specify the way Cassandra allocates and manages memtable memory. +# Options are: +# +# heap_buffers +# on heap nio buffers +# +# offheap_buffers +# off heap (direct) nio buffers +# +# offheap_objects +# off heap objects +memtable_allocation_type: heap_buffers + +# Total space to use for commit logs on disk. +# +# If space gets above this value, Cassandra will flush every dirty CF +# in the oldest segment and remove it. So a small total commitlog space +# will tend to cause more flush activity on less-active columnfamilies. +# +# The default value is the smaller of 8192, and 1/4 of the total space +# of the commitlog volume. +# +# commitlog_total_space_in_mb: 8192 + +# This sets the number of memtable flush writer threads per disk +# as well as the total number of memtables that can be flushed concurrently. +# These are generally a combination of compute and IO bound. +# +# Memtable flushing is more CPU efficient than memtable ingest and a single thread +# can keep up with the ingest rate of a whole server on a single fast disk +# until it temporarily becomes IO bound under contention typically with compaction. +# At that point you need multiple flush threads. At some point in the future +# it may become CPU bound all the time. +# +# You can tell if flushing is falling behind using the MemtablePool.BlockedOnAllocation +# metric which should be 0, but will be non-zero if threads are blocked waiting on flushing +# to free memory. +# +# memtable_flush_writers defaults to two for a single data directory. +# This means that two memtables can be flushed concurrently to the single data directory. +# If you have multiple data directories the default is one memtable flushing at a time +# but the flush will use a thread per data directory so you will get two or more writers. +# +# Two is generally enough to flush on a fast disk [array] mounted as a single data directory. +# Adding more flush writers will result in smaller more frequent flushes that introduce more +# compaction overhead. +# +# There is a direct tradeoff between number of memtables that can be flushed concurrently +# and flush size and frequency. More is not better you just need enough flush writers +# to never stall waiting for flushing to free memory. +# +#memtable_flush_writers: 2 + +# Total space to use for change-data-capture logs on disk. +# +# If space gets above this value, Cassandra will throw WriteTimeoutException +# on Mutations including tables with CDC enabled. A CDCCompactor is responsible +# for parsing the raw CDC logs and deleting them when parsing is completed. +# +# The default value is the min of 4096 mb and 1/8th of the total space +# of the drive where cdc_raw_directory resides. +# cdc_total_space_in_mb: 4096 + +# When we hit our cdc_raw limit and the CDCCompactor is either running behind +# or experiencing backpressure, we check at the following interval to see if any +# new space for cdc-tracked tables has been made available. Default to 250ms +# cdc_free_space_check_interval_ms: 250 + +# A fixed memory pool size in MB for for SSTable index summaries. If left +# empty, this will default to 5% of the heap size. If the memory usage of +# all index summaries exceeds this limit, SSTables with low read rates will +# shrink their index summaries in order to meet this limit. However, this +# is a best-effort process. In extreme conditions Cassandra may need to use +# more than this amount of memory. +index_summary_capacity_in_mb: + +# How frequently index summaries should be resampled. This is done +# periodically to redistribute memory from the fixed-size pool to sstables +# proportional their recent read rates. Setting to -1 will disable this +# process, leaving existing index summaries at their current sampling level. +index_summary_resize_interval_in_minutes: 60 + +# Whether to, when doing sequential writing, fsync() at intervals in +# order to force the operating system to flush the dirty +# buffers. Enable this to avoid sudden dirty buffer flushing from +# impacting read latencies. Almost always a good idea on SSDs; not +# necessarily on platters. +trickle_fsync: false +trickle_fsync_interval_in_kb: 10240 + +# TCP port, for commands and data +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +storage_port: 7000 + +# SSL port, for encrypted communication. Unused unless enabled in +# encryption_options +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +ssl_storage_port: 7001 + +# Address or interface to bind to and tell other Cassandra nodes to connect to. +# You _must_ change this if you want multiple nodes to be able to communicate! +# +# Set listen_address OR listen_interface, not both. +# +# Leaving it blank leaves it up to InetAddress.getLocalHost(). This +# will always do the Right Thing _if_ the node is properly configured +# (hostname, name resolution, etc), and the Right Thing is to use the +# address associated with the hostname (it might not be). +# +# Setting listen_address to 0.0.0.0 is always wrong. +# +listen_address: 172.17.0.2 + +# Set listen_address OR listen_interface, not both. Interfaces must correspond +# to a single address, IP aliasing is not supported. +# listen_interface: eth0 + +# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address +# you can specify which should be chosen using listen_interface_prefer_ipv6. If false the first ipv4 +# address will be used. If true the first ipv6 address will be used. Defaults to false preferring +# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6. +# listen_interface_prefer_ipv6: false + +# Address to broadcast to other Cassandra nodes +# Leaving this blank will set it to the same value as listen_address +broadcast_address: 172.17.0.2 + +# When using multiple physical network interfaces, set this +# to true to listen on broadcast_address in addition to +# the listen_address, allowing nodes to communicate in both +# interfaces. +# Ignore this property if the network configuration automatically +# routes between the public and private networks such as EC2. +# listen_on_broadcast_address: false + +# Internode authentication backend, implementing IInternodeAuthenticator; +# used to allow/disallow connections from peer nodes. +# internode_authenticator: org.apache.cassandra.auth.AllowAllInternodeAuthenticator + +# Whether to start the native transport server. +# Please note that the address on which the native transport is bound is the +# same as the rpc_address. The port however is different and specified below. +start_native_transport: true +# port for the CQL native transport to listen for clients on +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +native_transport_port: 9042 +# Enabling native transport encryption in client_encryption_options allows you to either use +# encryption for the standard port or to use a dedicated, additional port along with the unencrypted +# standard native_transport_port. +# Enabling client encryption and keeping native_transport_port_ssl disabled will use encryption +# for native_transport_port. Setting native_transport_port_ssl to a different value +# from native_transport_port will use encryption for native_transport_port_ssl while +# keeping native_transport_port unencrypted. +# native_transport_port_ssl: 9142 +# The maximum threads for handling requests when the native transport is used. +# This is similar to rpc_max_threads though the default differs slightly (and +# there is no native_transport_min_threads, idle threads will always be stopped +# after 30 seconds). +# native_transport_max_threads: 128 +# +# The maximum size of allowed frame. Frame (requests) larger than this will +# be rejected as invalid. The default is 256MB. If you're changing this parameter, +# you may want to adjust max_value_size_in_mb accordingly. This should be positive and less than 2048. +# native_transport_max_frame_size_in_mb: 256 + +# The maximum number of concurrent client connections. +# The default is -1, which means unlimited. +# native_transport_max_concurrent_connections: -1 + +# The maximum number of concurrent client connections per source ip. +# The default is -1, which means unlimited. +# native_transport_max_concurrent_connections_per_ip: -1 + +# Whether to start the thrift rpc server. +start_rpc: false + +# The address or interface to bind the Thrift RPC service and native transport +# server to. +# +# Set rpc_address OR rpc_interface, not both. +# +# Leaving rpc_address blank has the same effect as on listen_address +# (i.e. it will be based on the configured hostname of the node). +# +# Note that unlike listen_address, you can specify 0.0.0.0, but you must also +# set broadcast_rpc_address to a value other than 0.0.0.0. +# +# For security reasons, you should not expose this port to the internet. Firewall it if needed. +rpc_address: 0.0.0.0 + +# Set rpc_address OR rpc_interface, not both. Interfaces must correspond +# to a single address, IP aliasing is not supported. +# rpc_interface: eth1 + +# If you choose to specify the interface by name and the interface has an ipv4 and an ipv6 address +# you can specify which should be chosen using rpc_interface_prefer_ipv6. If false the first ipv4 +# address will be used. If true the first ipv6 address will be used. Defaults to false preferring +# ipv4. If there is only one address it will be selected regardless of ipv4/ipv6. +# rpc_interface_prefer_ipv6: false + +# port for Thrift to listen for clients on +rpc_port: 9160 + +# RPC address to broadcast to drivers and other Cassandra nodes. This cannot +# be set to 0.0.0.0. If left blank, this will be set to the value of +# rpc_address. If rpc_address is set to 0.0.0.0, broadcast_rpc_address must +# be set. +broadcast_rpc_address: 172.17.0.2 + +# enable or disable keepalive on rpc/native connections +rpc_keepalive: true + +# Cassandra provides two out-of-the-box options for the RPC Server: +# +# sync +# One thread per thrift connection. For a very large number of clients, memory +# will be your limiting factor. On a 64 bit JVM, 180KB is the minimum stack size +# per thread, and that will correspond to your use of virtual memory (but physical memory +# may be limited depending on use of stack space). +# +# hsha +# Stands for "half synchronous, half asynchronous." All thrift clients are handled +# asynchronously using a small number of threads that does not vary with the amount +# of thrift clients (and thus scales well to many clients). The rpc requests are still +# synchronous (one thread per active request). If hsha is selected then it is essential +# that rpc_max_threads is changed from the default value of unlimited. +# +# The default is sync because on Windows hsha is about 30% slower. On Linux, +# sync/hsha performance is about the same, with hsha of course using less memory. +# +# Alternatively, can provide your own RPC server by providing the fully-qualified class name +# of an o.a.c.t.TServerFactory that can create an instance of it. +rpc_server_type: sync + +# Uncomment rpc_min|max_thread to set request pool size limits. +# +# Regardless of your choice of RPC server (see above), the number of maximum requests in the +# RPC thread pool dictates how many concurrent requests are possible (but if you are using the sync +# RPC server, it also dictates the number of clients that can be connected at all). +# +# The default is unlimited and thus provides no protection against clients overwhelming the server. You are +# encouraged to set a maximum that makes sense for you in production, but do keep in mind that +# rpc_max_threads represents the maximum number of client requests this server may execute concurrently. +# +# rpc_min_threads: 16 +# rpc_max_threads: 2048 + +# uncomment to set socket buffer sizes on rpc connections +# rpc_send_buff_size_in_bytes: +# rpc_recv_buff_size_in_bytes: + +# Uncomment to set socket buffer size for internode communication +# Note that when setting this, the buffer size is limited by net.core.wmem_max +# and when not setting it it is defined by net.ipv4.tcp_wmem +# See also: +# /proc/sys/net/core/wmem_max +# /proc/sys/net/core/rmem_max +# /proc/sys/net/ipv4/tcp_wmem +# /proc/sys/net/ipv4/tcp_wmem +# and 'man tcp' +# internode_send_buff_size_in_bytes: + +# Uncomment to set socket buffer size for internode communication +# Note that when setting this, the buffer size is limited by net.core.wmem_max +# and when not setting it it is defined by net.ipv4.tcp_wmem +# internode_recv_buff_size_in_bytes: + +# Frame size for thrift (maximum message length). +thrift_framed_transport_size_in_mb: 15 + +# Set to true to have Cassandra create a hard link to each sstable +# flushed or streamed locally in a backups/ subdirectory of the +# keyspace data. Removing these links is the operator's +# responsibility. +incremental_backups: false + +# Whether or not to take a snapshot before each compaction. Be +# careful using this option, since Cassandra won't clean up the +# snapshots for you. Mostly useful if you're paranoid when there +# is a data format change. +snapshot_before_compaction: false + +# Whether or not a snapshot is taken of the data before keyspace truncation +# or dropping of column families. The STRONGLY advised default of true +# should be used to provide data safety. If you set this flag to false, you will +# lose data on truncation or drop. +auto_snapshot: true + +# Granularity of the collation index of rows within a partition. +# Increase if your rows are large, or if you have a very large +# number of rows per partition. The competing goals are these: +# +# - a smaller granularity means more index entries are generated +# and looking up rows withing the partition by collation column +# is faster +# - but, Cassandra will keep the collation index in memory for hot +# rows (as part of the key cache), so a larger granularity means +# you can cache more hot rows +column_index_size_in_kb: 64 + +# Per sstable indexed key cache entries (the collation index in memory +# mentioned above) exceeding this size will not be held on heap. +# This means that only partition information is held on heap and the +# index entries are read from disk. +# +# Note that this size refers to the size of the +# serialized index information and not the size of the partition. +column_index_cache_size_in_kb: 2 + +# Number of simultaneous compactions to allow, NOT including +# validation "compactions" for anti-entropy repair. Simultaneous +# compactions can help preserve read performance in a mixed read/write +# workload, by mitigating the tendency of small sstables to accumulate +# during a single long running compactions. The default is usually +# fine and if you experience problems with compaction running too +# slowly or too fast, you should look at +# compaction_throughput_mb_per_sec first. +# +# concurrent_compactors defaults to the smaller of (number of disks, +# number of cores), with a minimum of 2 and a maximum of 8. +# +# If your data directories are backed by SSD, you should increase this +# to the number of cores. +#concurrent_compactors: 1 + +# Throttles compaction to the given total throughput across the entire +# system. The faster you insert data, the faster you need to compact in +# order to keep the sstable count down, but in general, setting this to +# 16 to 32 times the rate you are inserting data is more than sufficient. +# Setting this to 0 disables throttling. Note that this account for all types +# of compaction, including validation compaction. +compaction_throughput_mb_per_sec: 16 + +# When compacting, the replacement sstable(s) can be opened before they +# are completely written, and used in place of the prior sstables for +# any range that has been written. This helps to smoothly transfer reads +# between the sstables, reducing page cache churn and keeping hot rows hot +sstable_preemptive_open_interval_in_mb: 50 + +# Throttles all outbound streaming file transfers on this node to the +# given total throughput in Mbps. This is necessary because Cassandra does +# mostly sequential IO when streaming data during bootstrap or repair, which +# can lead to saturating the network connection and degrading rpc performance. +# When unset, the default is 200 Mbps or 25 MB/s. +# stream_throughput_outbound_megabits_per_sec: 200 + +# Throttles all streaming file transfer between the datacenters, +# this setting allows users to throttle inter dc stream throughput in addition +# to throttling all network stream traffic as configured with +# stream_throughput_outbound_megabits_per_sec +# When unset, the default is 200 Mbps or 25 MB/s +# inter_dc_stream_throughput_outbound_megabits_per_sec: 200 + +# How long the coordinator should wait for read operations to complete +read_request_timeout_in_ms: 5000 +# How long the coordinator should wait for seq or index scans to complete +range_request_timeout_in_ms: 10000 +# How long the coordinator should wait for writes to complete +write_request_timeout_in_ms: 2000 +# How long the coordinator should wait for counter writes to complete +counter_write_request_timeout_in_ms: 5000 +# How long a coordinator should continue to retry a CAS operation +# that contends with other proposals for the same row +cas_contention_timeout_in_ms: 1000 +# How long the coordinator should wait for truncates to complete +# (This can be much longer, because unless auto_snapshot is disabled +# we need to flush first so we can snapshot before removing the data.) +truncate_request_timeout_in_ms: 60000 +# The default timeout for other, miscellaneous operations +request_timeout_in_ms: 10000 + +# How long before a node logs slow queries. Select queries that take longer than +# this timeout to execute, will generate an aggregated log message, so that slow queries +# can be identified. Set this value to zero to disable slow query logging. +slow_query_log_timeout_in_ms: 500 + +# Enable operation timeout information exchange between nodes to accurately +# measure request timeouts. If disabled, replicas will assume that requests +# were forwarded to them instantly by the coordinator, which means that +# under overload conditions we will waste that much extra time processing +# already-timed-out requests. +# +# Warning: before enabling this property make sure to ntp is installed +# and the times are synchronized between the nodes. +cross_node_timeout: false + +# Set keep-alive period for streaming +# This node will send a keep-alive message periodically with this period. +# If the node does not receive a keep-alive message from the peer for +# 2 keep-alive cycles the stream session times out and fail +# Default value is 300s (5 minutes), which means stalled stream +# times out in 10 minutes by default +# streaming_keep_alive_period_in_secs: 300 + +# phi value that must be reached for a host to be marked down. +# most users should never need to adjust this. +# phi_convict_threshold: 8 + +# endpoint_snitch -- Set this to a class that implements +# IEndpointSnitch. The snitch has two functions: +# +# - it teaches Cassandra enough about your network topology to route +# requests efficiently +# - it allows Cassandra to spread replicas around your cluster to avoid +# correlated failures. It does this by grouping machines into +# "datacenters" and "racks." Cassandra will do its best not to have +# more than one replica on the same "rack" (which may not actually +# be a physical location) +# +# CASSANDRA WILL NOT ALLOW YOU TO SWITCH TO AN INCOMPATIBLE SNITCH +# ONCE DATA IS INSERTED INTO THE CLUSTER. This would cause data loss. +# This means that if you start with the default SimpleSnitch, which +# locates every node on "rack1" in "datacenter1", your only options +# if you need to add another datacenter are GossipingPropertyFileSnitch +# (and the older PFS). From there, if you want to migrate to an +# incompatible snitch like Ec2Snitch you can do it by adding new nodes +# under Ec2Snitch (which will locate them in a new "datacenter") and +# decommissioning the old ones. +# +# Out of the box, Cassandra provides: +# +# SimpleSnitch: +# Treats Strategy order as proximity. This can improve cache +# locality when disabling read repair. Only appropriate for +# single-datacenter deployments. +# +# GossipingPropertyFileSnitch +# This should be your go-to snitch for production use. The rack +# and datacenter for the local node are defined in +# cassandra-rackdc.properties and propagated to other nodes via +# gossip. If cassandra-topology.properties exists, it is used as a +# fallback, allowing migration from the PropertyFileSnitch. +# +# PropertyFileSnitch: +# Proximity is determined by rack and data center, which are +# explicitly configured in cassandra-topology.properties. +# +# Ec2Snitch: +# Appropriate for EC2 deployments in a single Region. Loads Region +# and Availability Zone information from the EC2 API. The Region is +# treated as the datacenter, and the Availability Zone as the rack. +# Only private IPs are used, so this will not work across multiple +# Regions. +# +# Ec2MultiRegionSnitch: +# Uses public IPs as broadcast_address to allow cross-region +# connectivity. (Thus, you should set seed addresses to the public +# IP as well.) You will need to open the storage_port or +# ssl_storage_port on the public IP firewall. (For intra-Region +# traffic, Cassandra will switch to the private IP after +# establishing a connection.) +# +# RackInferringSnitch: +# Proximity is determined by rack and data center, which are +# assumed to correspond to the 3rd and 2nd octet of each node's IP +# address, respectively. Unless this happens to match your +# deployment conventions, this is best used as an example of +# writing a custom Snitch class and is provided in that spirit. +# +# You can use a custom Snitch by setting this to the full class name +# of the snitch, which will be assumed to be on your classpath. +endpoint_snitch: SimpleSnitch + +# controls how often to perform the more expensive part of host score +# calculation +dynamic_snitch_update_interval_in_ms: 100 +# controls how often to reset all host scores, allowing a bad host to +# possibly recover +dynamic_snitch_reset_interval_in_ms: 600000 +# if set greater than zero and read_repair_chance is < 1.0, this will allow +# 'pinning' of replicas to hosts in order to increase cache capacity. +# The badness threshold will control how much worse the pinned host has to be +# before the dynamic snitch will prefer other replicas over it. This is +# expressed as a double which represents a percentage. Thus, a value of +# 0.2 means Cassandra would continue to prefer the static snitch values +# until the pinned host was 20% worse than the fastest. +dynamic_snitch_badness_threshold: 0.1 + +# request_scheduler -- Set this to a class that implements +# RequestScheduler, which will schedule incoming client requests +# according to the specific policy. This is useful for multi-tenancy +# with a single Cassandra cluster. +# NOTE: This is specifically for requests from the client and does +# not affect inter node communication. +# org.apache.cassandra.scheduler.NoScheduler - No scheduling takes place +# org.apache.cassandra.scheduler.RoundRobinScheduler - Round robin of +# client requests to a node with a separate queue for each +# request_scheduler_id. The scheduler is further customized by +# request_scheduler_options as described below. +request_scheduler: org.apache.cassandra.scheduler.NoScheduler + +# Scheduler Options vary based on the type of scheduler +# +# NoScheduler +# Has no options +# +# RoundRobin +# throttle_limit +# The throttle_limit is the number of in-flight +# requests per client. Requests beyond +# that limit are queued up until +# running requests can complete. +# The value of 80 here is twice the number of +# concurrent_reads + concurrent_writes. +# default_weight +# default_weight is optional and allows for +# overriding the default which is 1. +# weights +# Weights are optional and will default to 1 or the +# overridden default_weight. The weight translates into how +# many requests are handled during each turn of the +# RoundRobin, based on the scheduler id. +# +# request_scheduler_options: +# throttle_limit: 80 +# default_weight: 5 +# weights: +# Keyspace1: 1 +# Keyspace2: 5 + +# request_scheduler_id -- An identifier based on which to perform +# the request scheduling. Currently the only valid option is keyspace. +# request_scheduler_id: keyspace + +# Enable or disable inter-node encryption +# JVM defaults for supported SSL socket protocols and cipher suites can +# be replaced using custom encryption options. This is not recommended +# unless you have policies in place that dictate certain settings, or +# need to disable vulnerable ciphers or protocols in case the JVM cannot +# be updated. +# FIPS compliant settings can be configured at JVM level and should not +# involve changing encryption settings here: +# https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/FIPS.html +# *NOTE* No custom encryption options are enabled at the moment +# The available internode options are : all, none, dc, rack +# +# If set to dc cassandra will encrypt the traffic between the DCs +# If set to rack cassandra will encrypt the traffic between the racks +# +# The passwords used in these options must match the passwords used when generating +# the keystore and truststore. For instructions on generating these files, see: +# http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore +# +server_encryption_options: + internode_encryption: none + keystore: conf/keystore + keystore_password: cassandra + truststore: conf/.truststore + truststore_password: cassandra + # More advanced defaults below: + # protocol: TLS + # algorithm: SunX509 + # store_type: JKS + # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA] + # require_client_auth: false + # require_endpoint_verification: false + +# enable or disable client/server encryption. +client_encryption_options: + enabled: true + # If enabled and optional is set to true encrypted and unencrypted connections are handled. + optional: false + keystore: /etc/cassandra/keystore.p12 + keystore_password: "cassandra" + require_client_auth: true + truststore: /etc/cassandra/truststore.p12 + truststore_password: "cassandra" + store_type: PKCS12 + # More advanced defaults below: + # protocol: TLS + # algorithm: SunX509 + # store_type: JKS + # cipher_suites: [TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA] + +# internode_compression controls whether traffic between nodes is +# compressed. +# Can be: +# +# all +# all traffic is compressed +# +# dc +# traffic between different datacenters is compressed +# +# none +# nothing is compressed. +internode_compression: dc + +# Enable or disable tcp_nodelay for inter-dc communication. +# Disabling it will result in larger (but fewer) network packets being sent, +# reducing overhead from the TCP protocol itself, at the cost of increasing +# latency if you block for cross-datacenter responses. +inter_dc_tcp_nodelay: false + +# TTL for different trace types used during logging of the repair process. +tracetype_query_ttl: 86400 +tracetype_repair_ttl: 604800 + +# By default, Cassandra logs GC Pauses greater than 200 ms at INFO level +# This threshold can be adjusted to minimize logging if necessary +# gc_log_threshold_in_ms: 200 + +# If unset, all GC Pauses greater than gc_log_threshold_in_ms will log at +# INFO level +# UDFs (user defined functions) are disabled by default. +# As of Cassandra 3.0 there is a sandbox in place that should prevent execution of evil code. +enable_user_defined_functions: false + +# Enables scripted UDFs (JavaScript UDFs). +# Java UDFs are always enabled, if enable_user_defined_functions is true. +# Enable this option to be able to use UDFs with "language javascript" or any custom JSR-223 provider. +# This option has no effect, if enable_user_defined_functions is false. +enable_scripted_user_defined_functions: false + +# The default Windows kernel timer and scheduling resolution is 15.6ms for power conservation. +# Lowering this value on Windows can provide much tighter latency and better throughput, however +# some virtualized environments may see a negative performance impact from changing this setting +# below their system default. The sysinternals 'clockres' tool can confirm your system's default +# setting. +windows_timer_interval: 1 + + +# Enables encrypting data at-rest (on disk). Different key providers can be plugged in, but the default reads from +# a JCE-style keystore. A single keystore can hold multiple keys, but the one referenced by +# the "key_alias" is the only key that will be used for encrypt opertaions; previously used keys +# can still (and should!) be in the keystore and will be used on decrypt operations +# (to handle the case of key rotation). +# +# It is strongly recommended to download and install Java Cryptography Extension (JCE) +# Unlimited Strength Jurisdiction Policy Files for your version of the JDK. +# (current link: http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html) +# +# Currently, only the following file types are supported for transparent data encryption, although +# more are coming in future cassandra releases: commitlog, hints +transparent_data_encryption_options: + enabled: false + chunk_length_kb: 64 + cipher: AES/CBC/PKCS5Padding + key_alias: testing:1 + # CBC IV length for AES needs to be 16 bytes (which is also the default size) + # iv_length: 16 + key_provider: + - class_name: org.apache.cassandra.security.JKSKeyProvider + parameters: + - keystore: conf/keystore + keystore_password: cassandra + store_type: JCEKS + key_password: cassandra + + +##################### +# SAFETY THRESHOLDS # +##################### + +# When executing a scan, within or across a partition, we need to keep the +# tombstones seen in memory so we can return them to the coordinator, which +# will use them to make sure other replicas also know about the deleted rows. +# With workloads that generate a lot of tombstones, this can cause performance +# problems and even exaust the server heap. +# (http://www.datastax.com/dev/blog/cassandra-anti-patterns-queues-and-queue-like-datasets) +# Adjust the thresholds here if you understand the dangers and want to +# scan more tombstones anyway. These thresholds may also be adjusted at runtime +# using the StorageService mbean. +tombstone_warn_threshold: 1000 +tombstone_failure_threshold: 100000 + +# Log WARN on any multiple-partition batch size exceeding this value. 5kb per batch by default. +# Caution should be taken on increasing the size of this threshold as it can lead to node instability. +batch_size_warn_threshold_in_kb: 5 + +# Fail any multiple-partition batch exceeding this value. 50kb (10x warn threshold) by default. +batch_size_fail_threshold_in_kb: 50 + +# Log WARN on any batches not of type LOGGED than span across more partitions than this limit +unlogged_batch_across_partitions_warn_threshold: 10 + +# Log a warning when compacting partitions larger than this value +compaction_large_partition_warning_threshold_mb: 100 + +# GC Pauses greater than gc_warn_threshold_in_ms will be logged at WARN level +# Adjust the threshold based on your application throughput requirement +# By default, Cassandra logs GC Pauses greater than 200 ms at INFO level +gc_warn_threshold_in_ms: 1000 + +# Maximum size of any value in SSTables. Safety measure to detect SSTable corruption +# early. Any value size larger than this threshold will result into marking an SSTable +# as corrupted. This should be positive and less than 2048. +# max_value_size_in_mb: 256 + +# Back-pressure settings # +# If enabled, the coordinator will apply the back-pressure strategy specified below to each mutation +# sent to replicas, with the aim of reducing pressure on overloaded replicas. +back_pressure_enabled: false +# The back-pressure strategy applied. +# The default implementation, RateBasedBackPressure, takes three arguments: +# high ratio, factor, and flow type, and uses the ratio between incoming mutation responses and outgoing mutation requests. +# If below high ratio, outgoing mutations are rate limited according to the incoming rate decreased by the given factor; +# if above high ratio, the rate limiting is increased by the given factor; +# such factor is usually best configured between 1 and 10, use larger values for a faster recovery +# at the expense of potentially more dropped mutations; +# the rate limiting is applied according to the flow type: if FAST, it's rate limited at the speed of the fastest replica, +# if SLOW at the speed of the slowest one. +# New strategies can be added. Implementors need to implement org.apache.cassandra.net.BackpressureStrategy and +# provide a public constructor accepting a Map. +back_pressure_strategy: + - class_name: org.apache.cassandra.net.RateBasedBackPressure + parameters: + - high_ratio: 0.90 + factor: 5 + flow: FAST + +# Coalescing Strategies # +# Coalescing multiples messages turns out to significantly boost message processing throughput (think doubling or more). +# On bare metal, the floor for packet processing throughput is high enough that many applications won't notice, but in +# virtualized environments, the point at which an application can be bound by network packet processing can be +# surprisingly low compared to the throughput of task processing that is possible inside a VM. It's not that bare metal +# doesn't benefit from coalescing messages, it's that the number of packets a bare metal network interface can process +# is sufficient for many applications such that no load starvation is experienced even without coalescing. +# There are other benefits to coalescing network messages that are harder to isolate with a simple metric like messages +# per second. By coalescing multiple tasks together, a network thread can process multiple messages for the cost of one +# trip to read from a socket, and all the task submission work can be done at the same time reducing context switching +# and increasing cache friendliness of network message processing. +# See CASSANDRA-8692 for details. + +# Strategy to use for coalescing messages in OutboundTcpConnection. +# Can be fixed, movingaverage, timehorizon, disabled (default). +# You can also specify a subclass of CoalescingStrategies.CoalescingStrategy by name. +# otc_coalescing_strategy: DISABLED + +# How many microseconds to wait for coalescing. For fixed strategy this is the amount of time after the first +# message is received before it will be sent with any accompanying messages. For moving average this is the +# maximum amount of time that will be waited as well as the interval at which messages must arrive on average +# for coalescing to be enabled. +# otc_coalescing_window_us: 200 + +# Do not try to coalesce messages if we already got that many messages. This should be more than 2 and less than 128. +# otc_coalescing_enough_coalesced_messages: 8 + +# How many milliseconds to wait between two expiration runs on the backlog (queue) of the OutboundTcpConnection. +# Expiration is done if messages are piling up in the backlog. Droppable messages are expired to free the memory +# taken by expired messages. The interval should be between 0 and 1000, and in most installations the default value +# will be appropriate. A smaller value could potentially expire messages slightly sooner at the expense of more CPU +# time and queue contention while iterating the backlog of messages. +# An interval of 0 disables any wait time, which is the behavior of former Cassandra versions. +# +# otc_backlog_expiration_interval_ms: 200 diff --git a/modules/cassandra/src/test/resources/cassandra-ssl-configuration/keystore.p12 b/modules/cassandra/src/test/resources/cassandra-ssl-configuration/keystore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..501e25cf967a409af23fb518a4902a8e4527d02c GIT binary patch literal 2734 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 N@Lu}LF8mWY{{U@M@&o_? literal 0 HcmV?d00001 diff --git a/modules/cassandra/src/test/resources/cassandra-ssl-configuration/truststore.p12 b/modules/cassandra/src/test/resources/cassandra-ssl-configuration/truststore.p12 new file mode 100644 index 0000000000000000000000000000000000000000..57107fc3813d7ca7eec580ae7d7d3b5256e430ad GIT binary patch literal 1270 zcmV&LNQU+thDZTr0|Wso1Q3B0CfnSbhq8cAT_7`AI7fhj1Mqf>@x-Y&HK}-W#-VS1SPlc;;bJWFas@9rXBPpSD57GgVNhqi5V6wi=|`b6IGub8 zQCpn7N5s%8Vd8{EIous59YA%lOQQ9%VSPcQ2Wk1sx16;A$oNp4*4xiQwwKdy7})~o z&D*o@k)dR)xZN_q5}Y@SASuyu7$3~90hQbk{(L9brmN{02hwaUz213*}4R0zqo%AAl9w65u44j6a$?E&rff)dQy%$#^=L+Crd z$p@RMbDoSKe3)R&E8) z&?x^Xl5Lz>T*hlGvtIjkBfvNAGI?W<=s`FHW51`E3C*X##%Pubm+NU_oM9>IkFYKW z4qTsz?df@0jlq#DN?;F}VB9X8nf#BmI*m69V)>z-S3{ekHN(C8)_rUwq$c7S)U*$8 zy!fG_XAk4zLDel&%l`1zeA1;~ZVWRv-8u{WY^=Wnj$I7pBMRqLhjQDT_lc-2sqYIO z>HlTTfX>Fb+Z;GY0s7R$wIHRouzohUW<>L}D|yi0Z6kJHcih`)-q(sKM5ji8aNE)6~c zoM7hRUo92-wZK?K*lWI&mQ`^YTTl9Hm_PJGS0~GD!qwSDQ2Dx9k0k{wMe;30{7pmf zo~WdF)AE4kK?(;~uw2_!5j>0VsR9m5)p(JMpcqIP8gkTka_-p1dXP#4NqCsNnd=M& zVKQ*f8Yj}gRPY|o>(-~g89nx;3c?GA)&m^(uGRS>5^K-pQb8y5z{5Qk{@k}4n1NC9O71OfpC00bZ;XExUh-TPc(ybhH$x*neYf|;Hv;JI9{{iwVZ ghZN-m6wM1fMvUpU)iFjIf|;%EZ7C2DMgjsS5NM%NaR2}S literal 0 HcmV?d00001 diff --git a/modules/cassandra/src/test/resources/client-ssl/cassandra.cer.pem b/modules/cassandra/src/test/resources/client-ssl/cassandra.cer.pem new file mode 100644 index 00000000000..bafaa00317b --- /dev/null +++ b/modules/cassandra/src/test/resources/client-ssl/cassandra.cer.pem @@ -0,0 +1,26 @@ +Bag Attributes + friendlyName: localhost + localKeyID: 54 69 6D 65 20 31 37 32 39 33 34 38 39 36 38 31 31 39 +subject=C = None, L = None, O = Testcontainers, OU = Testcontainers, CN = localhost +issuer=C = None, L = None, O = Testcontainers, OU = Testcontainers, CN = localhost +-----BEGIN CERTIFICATE----- +MIIDbjCCAlagAwIBAgIJAKCVIipuH03/MA0GCSqGSIb3DQEBCwUAMGQxDTALBgNV +BAYTBE5vbmUxDTALBgNVBAcTBE5vbmUxFzAVBgNVBAoTDlRlc3Rjb250YWluZXJz +MRcwFQYDVQQLEw5UZXN0Y29udGFpbmVyczESMBAGA1UEAxMJbG9jYWxob3N0MCAX +DTI0MTAxOTE0NDIwOFoYDzIxMjQwOTI1MTQ0MjA4WjBkMQ0wCwYDVQQGEwROb25l +MQ0wCwYDVQQHEwROb25lMRcwFQYDVQQKEw5UZXN0Y29udGFpbmVyczEXMBUGA1UE +CxMOVGVzdGNvbnRhaW5lcnMxEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBALocrhrM1gYB/pF/qlDY+eFQZ9L8SMgCmn+I +mgx/UbKqJwLp5wYuoW/PA4RwraFPkimf5CAE2kpBGcJu/Qzyp0fJZlBXpmkDJVrG +pRbYz5mN4CrXNliYfAC1RzxvTT1tOjiDkk9kHVfs5nMVb9e2kq6tQEItflhlPzdD +FOe0pY2XBX2stcQ6URRkK5buyPeLhnTrKMfLWEWKKKzSQGen+lbtBURZzkpmK88q +qjLqqaZusXP6QlRVLqMADjQf7aXLi0A/fIhVrq1amqqiApJbijT0LP48DvS8DQQL +jNKkQ17vMClMmXusU5IgJMlXfGEzeTNUI56wHGYUdE69FTGFvZECAwEAAaMhMB8w +HQYDVR0OBBYEFNsvIE+IgkE0aTc+1MI7hpPQL2ZEMA0GCSqGSIb3DQEBCwUAA4IB +AQC4U/tGPuRS3m/r1p3aAq0D88UGg6oKHwqe3re3xrFAv9y+Y3M+FXyh5w/yMCAr +PcVo6Pef3hEjwc9wDuQoIcQ9eRZtYI1RnhkkuC8TZRk1KGKg9Lj4Zzbse7FfK92Z +DUYgIVyhC/YkeEDwTiZI8WxhbglozNg5Ygw+qLK4rYmk+X/NgdfdQHocuJ3Jwqqx +eYz0m2RUMhzxEI2z9jQr3DgjNkYrphLzaVXmO4MovzXx3DNeC8ADot9PGmaz24rl +RDeSWynxbgqzdXGHxtyR0LY1k+Y+5wqU28L90D0o3ZtaMBnK+Ft2AP2zpbtgr8rR +sf12uPyRUPzJQ46KNpjy4HN6 +-----END CERTIFICATE----- diff --git a/modules/cassandra/src/test/resources/client-ssl/cassandra.key.pem b/modules/cassandra/src/test/resources/client-ssl/cassandra.key.pem new file mode 100644 index 00000000000..4d291cf8852 --- /dev/null +++ b/modules/cassandra/src/test/resources/client-ssl/cassandra.key.pem @@ -0,0 +1,32 @@ +Bag Attributes + friendlyName: localhost + localKeyID: 54 69 6D 65 20 31 37 32 39 33 34 38 39 36 38 31 31 39 +Key Attributes: +-----BEGIN PRIVATE KEY----- +MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC6HK4azNYGAf6R +f6pQ2PnhUGfS/EjIApp/iJoMf1GyqicC6ecGLqFvzwOEcK2hT5Ipn+QgBNpKQRnC +bv0M8qdHyWZQV6ZpAyVaxqUW2M+ZjeAq1zZYmHwAtUc8b009bTo4g5JPZB1X7OZz +FW/XtpKurUBCLX5YZT83QxTntKWNlwV9rLXEOlEUZCuW7sj3i4Z06yjHy1hFiiis +0kBnp/pW7QVEWc5KZivPKqoy6qmmbrFz+kJUVS6jAA40H+2ly4tAP3yIVa6tWpqq +ogKSW4o09Cz+PA70vA0EC4zSpENe7zApTJl7rFOSICTJV3xhM3kzVCOesBxmFHRO +vRUxhb2RAgMBAAECggEACqD5e7C+Rr8oz+jS/z8FAxsmcsqgFXW6NEjG4EPWx89a +RWfthVFDov3XNsizzp/OulXWH2xnhkOyU7cm+Ia7JI+Z9w8Qz+dM5AkVA8Y23o9X +TnSjNx57DODnEP21eZAzxpp50DlPFU02pzsbYhE2AbsFp0HirB9MI70CN24xR9hP +i1zPgO7FVnLvn4INqVKgcV4vXlxvgDEvO4Myc1WoJXkyPCCObvEflBBWr2QwQfKT +T2qjCJWv/P2PJGFaZbOrEvOHZjprSid4/n9gbQrodGoChhjiZT//l19Ay+7eJkUc +yiiSK4u3fF4YPH9+CVpRQ94PHFe+0kQVvf+VGX/iqQKBgQDp5umTcZoho/KQzOd/ +pA8fgnzbipEl5ep2MHB98cqEQ93eFv4l/bBehDQ1WvmFJY8SIzU4EQotpnCZd4Vb +KH9PE8tsTRvw2cYbBuD751boLVaBn8wxtlTkFrN/CyAtV7w7AG0dXnDKushJx1NN +8AgvSr0X4hf0AKIWGtVteoX7qwKBgQDLse7Ze5dNbG48CpBGqQS4wFkTSEs5QKI5 +68JXEQoCmJb06O7rxj4f5CALv3pReP3nrl5+kLmT8O+yU5C5dXf06k/z4GDJ6Esm +8XTEfB2Ca+kI2RLyMRRXPA2nEunbSsyk1AVo2GeRJxG4TaDbu2zTkUBAEyCuwarW +OMsuYodPswKBgQCZc/kB1qH8OAdHoGawgv24+m7Xycz4RCLSb20d86edprjEn+kV +G56+I5Xs+0aAZ+e5Sof7xJIc6Pkudg9zgtojEyV+ZAhUt0sVKCoqmdeWc0gxupjI +dIq1KX+RdccieFDxlJIBlpgBKRGF9dNdaoC0JiBwrtBwMIomXmxvatbECQKBgQCS +X1xZn/xLwJ0+PAENJauk72OS/aJAk/d/U7ElS7M7xlbDyxbVCnHeDNoSVxgYr68U +6zIwFOOmMb6tEGuxOX5n2nB1uUkUDf7jDyNvhhjWfaDJoOOCck5BmX/eDTNLR+bi +kxEIFGnn3oFXRUFQZNCA/6GB6bzUl4qhwdIPlPHTDQKBgQCgztlUF5IOJFKMjVlY +yoA/7+b5zwrh8Y2+SLzF/HLah85AuHxsgdTuQh+HLKSwJejKCT95BSRJO/kV0XCR +KZGStqETpEH/2AJkxpjt0FZxtIQdnyTargbiipe4JzI3iCTLtfN5C9Pn3ZJ9giap +B5uQm4762aH2jw1kKFegHlIgJg== +-----END PRIVATE KEY----- From 77738d8fd2f34617a8d1aee0f60fe544c6454c7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 14 Oct 2025 10:49:41 -0600 Subject: [PATCH 0933/1224] Remove org.testcontainers.neo4j.Neo4jContainer#withEnterpriseEdition (#11106) --- .../testcontainers/neo4j/Neo4jContainer.java | 32 ++----------------- .../neo4j/Neo4jContainerTest.java | 16 ++-------- 2 files changed, 5 insertions(+), 43 deletions(-) diff --git a/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java b/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java index e96204ac418..0349e0c2395 100644 --- a/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java +++ b/modules/neo4j/src/main/java/org/testcontainers/neo4j/Neo4jContainer.java @@ -7,7 +7,6 @@ import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.testcontainers.utility.ComparableVersion; import org.testcontainers.utility.DockerImageName; -import org.testcontainers.utility.LicenseAcceptance; import org.testcontainers.utility.MountableFile; import java.net.HttpURLConnection; @@ -39,13 +38,6 @@ public class Neo4jContainer extends GenericContainer { */ private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("neo4j"); - /** - * The default tag (version) to use. - */ - private static final String DEFAULT_TAG = "4.4"; - - private static final String ENTERPRISE_TAG = DEFAULT_TAG + "-enterprise"; - /** * Default port for the binary Bolt protocol. */ @@ -68,8 +60,6 @@ public class Neo4jContainer extends GenericContainer { private static final String AUTH_FORMAT = "neo4j/%s"; - private final boolean standardImage; - private String adminPassword = DEFAULT_ADMIN_PASSWORD; private final Set labsPlugins = new HashSet<>(); @@ -100,8 +90,6 @@ public Neo4jContainer(String dockerImageName) { */ public Neo4jContainer(final DockerImageName dockerImageName) { super(dockerImageName); - this.standardImage = dockerImageName.getUnversionedPart().equals(DEFAULT_IMAGE_NAME.getUnversionedPart()); - dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); waitingFor( @@ -197,26 +185,12 @@ public String getHttpsUrl() { } /** - * Configures the container to use the enterprise edition of the default docker image. - *

    - * Please have a look at the Neo4j Licensing page. While the Neo4j - * Community Edition can be used for free in your projects under the GPL v3 license, Neo4j Enterprise edition - * needs either a commercial, education or evaluation license. + * Accepts the license agreement of the container. * - * @return This container. + * @return this */ - public Neo4jContainer withEnterpriseEdition() { - if (!standardImage) { - throw new IllegalStateException( - String.format("Cannot use enterprise version with alternative image %s.", getDockerImageName()) - ); - } - - setDockerImageName(DEFAULT_IMAGE_NAME.withTag(ENTERPRISE_TAG).asCanonicalNameString()); - LicenseAcceptance.assertLicenseAccepted(getDockerImageName()); - + public Neo4jContainer acceptLicense() { addEnv("NEO4J_ACCEPT_LICENSE_AGREEMENT", "yes"); - return self(); } diff --git a/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java index 82e8bc16e08..7676450e75a 100644 --- a/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java +++ b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java @@ -21,7 +21,6 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatNoException; import static org.assertj.core.api.Assumptions.assumeThat; @@ -132,25 +131,14 @@ private static void assertThatCustomPluginWasCopied(Session session) { assertThat(singleRecord.get("greeting").asString()).isEqualTo("Hello, Testcontainers"); } - @Test - void shouldCheckEnterpriseLicense() { - assumeThat(Neo4jContainerTest.class.getResource(ACCEPTANCE_FILE_LOCATION)).isNull(); - - String expectedImageName = "neo4j:4.4-enterprise"; - - assertThatExceptionOfType(IllegalStateException.class) - .isThrownBy(() -> new Neo4jContainer("neo4j:4.4").withEnterpriseEdition()) - .withMessageContaining("The image " + expectedImageName + " requires you to accept a license agreement."); - } - @Test void shouldRunEnterprise() { assumeThat(Neo4jContainerTest.class.getResource(ACCEPTANCE_FILE_LOCATION)).isNotNull(); try ( // enterpriseEdition { - Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") - .withEnterpriseEdition() + Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4-enterprise") + .acceptLicense() // } .withAdminPassword("Picard123") ) { From 5b8743dcdb7c4394cae4e0be2fd4017fe006e931 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 14 Oct 2025 11:40:54 -0600 Subject: [PATCH 0934/1224] org.testcontainers.mariadb.MariaDBContainer do not copy default config (#11108) --- .../main/java/org/testcontainers/mariadb/MariaDBContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java index 957754c946b..8487f4576f7 100644 --- a/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java +++ b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBContainer.java @@ -58,7 +58,7 @@ protected void configure() { optionallyMapResourceParameterAsVolume( MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", - "mariadb-default-conf", + null, Transferable.DEFAULT_DIR_MODE ); From a3783a33ce06aece653cda0e116de0150975501a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 14 Oct 2025 11:55:57 -0600 Subject: [PATCH 0935/1224] org.testcontainers.mysql.MySQLContainer do not copy default config (#11107) --- .../src/main/java/org/testcontainers/mysql/MySQLContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java b/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java index e46bef6180d..25f876c9911 100644 --- a/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java +++ b/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLContainer.java @@ -64,7 +64,7 @@ protected void configure() { optionallyMapResourceParameterAsVolume( MY_CNF_CONFIG_OVERRIDE_PARAM_NAME, "/etc/mysql/conf.d", - "mysql-default-conf", + null, Transferable.DEFAULT_DIR_MODE ); From a62518b4f61f7ce59bf2c1f55830cbb7b958a402 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 14 Oct 2025 12:51:41 -0600 Subject: [PATCH 0936/1224] Add support for ComposeContainer with Spock (#11109) --- .../TestcontainersMethodInterceptor.groovy | 39 +++++++++++++++++-- .../spock/ComposeContainerIT.groovy | 12 +++--- .../spock/DockerComposeContainerIT.groovy | 37 ++++++++++++++++++ .../spock/SharedComposeContainerIT.groovy | 12 +++--- .../SharedDockerComposeContainerIT.groovy | 39 +++++++++++++++++++ 5 files changed, 124 insertions(+), 15 deletions(-) create mode 100644 modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy create mode 100644 modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy diff --git a/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy b/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy index 2399a0a6e32..cbef0a87bb2 100644 --- a/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy +++ b/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy @@ -4,6 +4,7 @@ import org.spockframework.runtime.extension.AbstractMethodInterceptor import org.spockframework.runtime.extension.IMethodInvocation import org.spockframework.runtime.model.FieldInfo import org.spockframework.runtime.model.SpecInfo +import org.testcontainers.containers.ComposeContainer import org.testcontainers.containers.DockerComposeContainer import org.testcontainers.containers.GenericContainer import org.testcontainers.lifecycle.TestLifecycleAware @@ -24,6 +25,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { def containers = findAllContainers(true) startContainers(containers, invocation) + def dockerCompose = findAllDockerComposeContainers(true) + startDockerComposeContainers(dockerCompose, invocation) + def compose = findAllComposeContainers(true) startComposeContainers(compose, invocation) @@ -35,6 +39,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { def containers = findAllContainers(true) stopContainers(containers, invocation) + def dockerCompose = findAllDockerComposeContainers(true) + stopDockerComposeContainers(dockerCompose, invocation) + def compose = findAllComposeContainers(true) stopComposeContainers(compose, invocation) @@ -46,6 +53,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { def containers = findAllContainers(false) startContainers(containers, invocation) + def dockerCompose = findAllDockerComposeContainers(false) + startDockerComposeContainers(dockerCompose, invocation) + def compose = findAllComposeContainers(false) startComposeContainers(compose, invocation) @@ -58,6 +68,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { def containers = findAllContainers(false) stopContainers(containers, invocation) + def dockerCompose = findAllDockerComposeContainers(false) + stopDockerComposeContainers(dockerCompose, invocation) + def compose = findAllComposeContainers(false) stopComposeContainers(compose, invocation) @@ -70,12 +83,18 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { } } - private List findAllComposeContainers(boolean shared) { + private List findAllDockerComposeContainers(boolean shared) { spec.allFields.findAll { FieldInfo f -> DockerComposeContainer.isAssignableFrom(f.type) && f.shared == shared } } + private List findAllComposeContainers(boolean shared) { + spec.allFields.findAll { FieldInfo f -> + ComposeContainer.isAssignableFrom(f.type) && f.shared == shared + } + } + private static void startContainers(List containers, IMethodInvocation invocation) { containers.each { FieldInfo f -> GenericContainer container = readContainerFromField(f, invocation) @@ -105,20 +124,34 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { } } - private static void startComposeContainers(List compose, IMethodInvocation invocation) { + private static void startDockerComposeContainers(List compose, IMethodInvocation invocation) { compose.each { FieldInfo f -> DockerComposeContainer c = f.readValue(invocation.instance) as DockerComposeContainer c.start() } } - private static void stopComposeContainers(List compose, IMethodInvocation invocation) { + private static void startComposeContainers(List compose, IMethodInvocation invocation) { + compose.each { FieldInfo f -> + ComposeContainer c = f.readValue(invocation.instance) as ComposeContainer + c.start() + } + } + + private static void stopDockerComposeContainers(List compose, IMethodInvocation invocation) { compose.each { FieldInfo f -> DockerComposeContainer c = f.readValue(invocation.instance) as DockerComposeContainer c.stop() } } + private static void stopComposeContainers(List compose, IMethodInvocation invocation) { + compose.each { FieldInfo f -> + ComposeContainer c = f.readValue(invocation.instance) as ComposeContainer + c.stop() + } + } + private static GenericContainer readContainerFromField(FieldInfo f, IMethodInvocation invocation) { f.readValue(invocation.instance) as GenericContainer diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy index ff473aea1de..a190f1ea3b6 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy @@ -2,7 +2,7 @@ package org.testcontainers.spock import org.apache.http.client.methods.HttpGet import org.apache.http.impl.client.HttpClientBuilder -import org.testcontainers.containers.DockerComposeContainer +import org.testcontainers.containers.ComposeContainer import org.testcontainers.containers.wait.strategy.Wait import org.testcontainers.utility.DockerImageName import spock.lang.Specification @@ -10,18 +10,18 @@ import spock.lang.Specification @Testcontainers class ComposeContainerIT extends Specification { - DockerComposeContainer composeContainer = new DockerComposeContainer( - DockerImageName.parse("docker/compose:debian-1.29.2"), + ComposeContainer composeContainer = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/docker-compose.yml")) - .withExposedService("whoami_1", 80, Wait.forHttp("/")) + .withExposedService("whoami-1", 80, Wait.forHttp("/")) String host int port def setup() { - host = composeContainer.getServiceHost("whoami_1", 80) - port = composeContainer.getServicePort("whoami_1", 80) + host = composeContainer.getServiceHost("whoami-1", 80) + port = composeContainer.getServicePort("whoami-1", 80) } def "running compose defined container is accessible on configured port"() { diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy new file mode 100644 index 00000000000..bd27c18f7ab --- /dev/null +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy @@ -0,0 +1,37 @@ +package org.testcontainers.spock + +import org.apache.http.client.methods.HttpGet +import org.apache.http.impl.client.HttpClientBuilder +import org.testcontainers.containers.DockerComposeContainer +import org.testcontainers.containers.wait.strategy.Wait +import org.testcontainers.utility.DockerImageName +import spock.lang.Specification + +@Testcontainers +class DockerComposeContainerIT extends Specification { + + DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse("docker/compose:debian-1.29.2"), + new File("src/test/resources/docker-compose.yml")) + .withExposedService("whoami_1", 80, Wait.forHttp("/")) + + String host + + int port + + def setup() { + host = composeContainer.getServiceHost("whoami_1", 80) + port = composeContainer.getServicePort("whoami_1", 80) + } + + def "running compose defined container is accessible on configured port"() { + given: "a http client" + def client = HttpClientBuilder.create().build() + + when: "accessing web server" + def response = client.execute(new HttpGet("http://$host:$port")) + + then: "docker container is running and returns http status code 200" + response.statusLine.statusCode == 200 + } +} diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy index 953d476b160..020005f923f 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy @@ -2,7 +2,7 @@ package org.testcontainers.spock import org.apache.http.client.methods.HttpGet import org.apache.http.impl.client.HttpClientBuilder -import org.testcontainers.containers.DockerComposeContainer +import org.testcontainers.containers.ComposeContainer import org.testcontainers.containers.wait.strategy.Wait import org.testcontainers.utility.DockerImageName import spock.lang.Shared @@ -12,18 +12,18 @@ import spock.lang.Specification class SharedComposeContainerIT extends Specification { @Shared - DockerComposeContainer composeContainer = new DockerComposeContainer( - DockerImageName.parse("docker/compose:debian-1.29.2"), + ComposeContainer composeContainer = new ComposeContainer( + DockerImageName.parse("docker:24.0.2"), new File("src/test/resources/docker-compose.yml")) - .withExposedService("whoami_1", 80, Wait.forHttp("/")) + .withExposedService("whoami-1", 80, Wait.forHttp("/")) String host int port def setup() { - host = composeContainer.getServiceHost("whoami_1", 80) - port = composeContainer.getServicePort("whoami_1", 80) + host = composeContainer.getServiceHost("whoami-1", 80) + port = composeContainer.getServicePort("whoami-1", 80) } def "running compose defined container is accessible on configured port"() { diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy new file mode 100644 index 00000000000..600be07f9f1 --- /dev/null +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy @@ -0,0 +1,39 @@ +package org.testcontainers.spock + +import org.apache.http.client.methods.HttpGet +import org.apache.http.impl.client.HttpClientBuilder +import org.testcontainers.containers.DockerComposeContainer +import org.testcontainers.containers.wait.strategy.Wait +import org.testcontainers.utility.DockerImageName +import spock.lang.Shared +import spock.lang.Specification + +@Testcontainers +class SharedDockerComposeContainerIT extends Specification { + + @Shared + DockerComposeContainer composeContainer = new DockerComposeContainer( + DockerImageName.parse("docker/compose:debian-1.29.2"), + new File("src/test/resources/docker-compose.yml")) + .withExposedService("whoami_1", 80, Wait.forHttp("/")) + + String host + + int port + + def setup() { + host = composeContainer.getServiceHost("whoami_1", 80) + port = composeContainer.getServicePort("whoami_1", 80) + } + + def "running compose defined container is accessible on configured port"() { + given: "a http client" + def client = HttpClientBuilder.create().build() + + when: "accessing web server" + def response = client.execute(new HttpGet("http://$host:$port")) + + then: "docker container is running and returns http status code 200" + response.statusLine.statusCode == 200 + } +} From c3bb3be235b6c09d82950b2419f2c1e515473408 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 14 Oct 2025 16:13:46 -0600 Subject: [PATCH 0937/1224] Update new artifactIds documentation --- docs/modules/activemq.md | 4 ++-- docs/modules/azure.md | 4 ++-- docs/modules/chromadb.md | 4 ++-- docs/modules/consul.md | 4 ++-- docs/modules/databases/cassandra.md | 4 ++-- docs/modules/databases/clickhouse.md | 4 ++-- docs/modules/databases/cockroachdb.md | 4 ++-- docs/modules/databases/couchbase.md | 4 ++-- docs/modules/databases/cratedb.md | 4 ++-- docs/modules/databases/databend.md | 4 ++-- docs/modules/databases/db2.md | 4 ++-- docs/modules/databases/dynalite.md | 4 ++-- docs/modules/databases/influxdb.md | 4 ++-- docs/modules/databases/mariadb.md | 4 ++-- docs/modules/databases/mongodb.md | 4 ++-- docs/modules/databases/mssqlserver.md | 4 ++-- docs/modules/databases/mysql.md | 4 ++-- docs/modules/databases/neo4j.md | 4 ++-- docs/modules/databases/oceanbase.md | 4 ++-- docs/modules/databases/oraclefree.md | 4 ++-- docs/modules/databases/oraclexe.md | 4 ++-- docs/modules/databases/orientdb.md | 4 ++-- docs/modules/databases/postgres.md | 4 ++-- docs/modules/databases/presto.md | 4 ++-- docs/modules/databases/questdb.md | 4 ++-- docs/modules/databases/r2dbc.md | 2 +- docs/modules/databases/scylladb.md | 4 ++-- docs/modules/databases/tidb.md | 4 ++-- docs/modules/databases/timeplus.md | 4 ++-- docs/modules/databases/trino.md | 4 ++-- docs/modules/databases/yugabytedb.md | 4 ++-- docs/modules/elasticsearch.md | 4 ++-- docs/modules/gcloud.md | 4 ++-- docs/modules/grafana.md | 4 ++-- docs/modules/hivemq.md | 6 +++--- docs/modules/k3s.md | 4 ++-- docs/modules/k6.md | 4 ++-- docs/modules/kafka.md | 4 ++-- docs/modules/ldap.md | 4 ++-- docs/modules/localstack.md | 4 ++-- docs/modules/milvus.md | 4 ++-- docs/modules/minio.md | 4 ++-- docs/modules/mockserver.md | 4 ++-- docs/modules/nginx.md | 4 ++-- docs/modules/ollama.md | 4 ++-- docs/modules/openfga.md | 4 ++-- docs/modules/pinecone.md | 4 ++-- docs/modules/pulsar.md | 4 ++-- docs/modules/qdrant.md | 4 ++-- docs/modules/rabbitmq.md | 4 ++-- docs/modules/redpanda.md | 4 ++-- docs/modules/solace.md | 4 ++-- docs/modules/solr.md | 4 ++-- docs/modules/toxiproxy.md | 4 ++-- docs/modules/typesense.md | 4 ++-- docs/modules/vault.md | 4 ++-- docs/modules/weaviate.md | 4 ++-- docs/modules/webdriver_containers.md | 4 ++-- 58 files changed, 116 insertions(+), 116 deletions(-) diff --git a/docs/modules/activemq.md b/docs/modules/activemq.md index 6f1ef2e9252..07cc6e75381 100644 --- a/docs/modules/activemq.md +++ b/docs/modules/activemq.md @@ -43,14 +43,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:activemq:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-activemq:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - activemq + testcontainers-activemq {{latest_version}} test diff --git a/docs/modules/azure.md b/docs/modules/azure.md index e0e9419bf70..1b3242551c1 100644 --- a/docs/modules/azure.md +++ b/docs/modules/azure.md @@ -172,14 +172,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:azure:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-azure:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - azure + testcontainers-azure {{latest_version}} test diff --git a/docs/modules/chromadb.md b/docs/modules/chromadb.md index 9b14dfc2970..bb50dfe3c02 100644 --- a/docs/modules/chromadb.md +++ b/docs/modules/chromadb.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy -testImplementation "org.testcontainers:chromadb:{{latest_version}}" +testImplementation "org.testcontainers:testcontainers-chromadb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers -chromadb +testcontainers-chromadb {{latest_version}} test diff --git a/docs/modules/consul.md b/docs/modules/consul.md index f9f21bfb541..bcdf7146da3 100644 --- a/docs/modules/consul.md +++ b/docs/modules/consul.md @@ -21,14 +21,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:consul:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-consul:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - consul + testcontainers-consul {{latest_version}} test diff --git a/docs/modules/databases/cassandra.md b/docs/modules/databases/cassandra.md index 80dcb220454..9cc5e12499b 100644 --- a/docs/modules/databases/cassandra.md +++ b/docs/modules/databases/cassandra.md @@ -39,14 +39,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:cassandra:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-cassandra:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - cassandra + testcontainers-cassandra {{latest_version}} test diff --git a/docs/modules/databases/clickhouse.md b/docs/modules/databases/clickhouse.md index 1ba8a1ff0aa..4e49c69c276 100644 --- a/docs/modules/databases/clickhouse.md +++ b/docs/modules/databases/clickhouse.md @@ -22,14 +22,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:clickhouse:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-clickhouse:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - clickhouse + testcontainers-clickhouse {{latest_version}} test diff --git a/docs/modules/databases/cockroachdb.md b/docs/modules/databases/cockroachdb.md index 2a219aeb275..add1b9cd1aa 100644 --- a/docs/modules/databases/cockroachdb.md +++ b/docs/modules/databases/cockroachdb.md @@ -24,14 +24,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:cockroachdb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-cockroachdb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - cockroachdb + testcontainers-cockroachdb {{latest_version}} test diff --git a/docs/modules/databases/couchbase.md b/docs/modules/databases/couchbase.md index 5c1ff9f5580..997347611e2 100644 --- a/docs/modules/databases/couchbase.md +++ b/docs/modules/databases/couchbase.md @@ -29,13 +29,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:couchbase:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-couchbase:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - couchbase + testcontainers-couchbase {{latest_version}} test diff --git a/docs/modules/databases/cratedb.md b/docs/modules/databases/cratedb.md index 14c15608904..25fd1642a9d 100644 --- a/docs/modules/databases/cratedb.md +++ b/docs/modules/databases/cratedb.md @@ -24,13 +24,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:cratedb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-cratedb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - cratedb + testcontainers-cratedb {{latest_version}} test diff --git a/docs/modules/databases/databend.md b/docs/modules/databases/databend.md index 97b92729241..510dffb2f3e 100644 --- a/docs/modules/databases/databend.md +++ b/docs/modules/databases/databend.md @@ -22,14 +22,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:databend:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-databend:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - databend + testcontainers-databend {{latest_version}} test diff --git a/docs/modules/databases/db2.md b/docs/modules/databases/db2.md index 7a5ba79a86f..ce05f6ae308 100644 --- a/docs/modules/databases/db2.md +++ b/docs/modules/databases/db2.md @@ -27,13 +27,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:db2:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-db2:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - db2 + testcontainers-db2 {{latest_version}} test diff --git a/docs/modules/databases/dynalite.md b/docs/modules/databases/dynalite.md index 8807ad7f025..445395479dd 100644 --- a/docs/modules/databases/dynalite.md +++ b/docs/modules/databases/dynalite.md @@ -31,13 +31,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:dynalite:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-dynalite:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - dynalite + testcontainers-dynalite {{latest_version}} test diff --git a/docs/modules/databases/influxdb.md b/docs/modules/databases/influxdb.md index 8055f6aed57..9644a5eb92b 100644 --- a/docs/modules/databases/influxdb.md +++ b/docs/modules/databases/influxdb.md @@ -90,7 +90,7 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy -testImplementation "org.testcontainers:influxdb:{{latest_version}}" +testImplementation "org.testcontainers:testcontainers-influxdb:{{latest_version}}" ``` === "Maven" @@ -99,7 +99,7 @@ testImplementation "org.testcontainers:influxdb:{{latest_version}}" org.testcontainers - influxdb + testcontainers-influxdb {{latest_version}} test diff --git a/docs/modules/databases/mariadb.md b/docs/modules/databases/mariadb.md index 01d66139f1a..d90f9381cb5 100644 --- a/docs/modules/databases/mariadb.md +++ b/docs/modules/databases/mariadb.md @@ -30,13 +30,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:mariadb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-mariadb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - mariadb + testcontainers-mariadb {{latest_version}} test diff --git a/docs/modules/databases/mongodb.md b/docs/modules/databases/mongodb.md index cbd82aabc33..b861d83bb2c 100644 --- a/docs/modules/databases/mongodb.md +++ b/docs/modules/databases/mongodb.md @@ -77,13 +77,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:mongodb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-mongodb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - mongodb + testcontainers-mongodb {{latest_version}} test diff --git a/docs/modules/databases/mssqlserver.md b/docs/modules/databases/mssqlserver.md index bde933b1e72..5c9d7b0a9fb 100644 --- a/docs/modules/databases/mssqlserver.md +++ b/docs/modules/databases/mssqlserver.md @@ -29,13 +29,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:mssqlserver:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-mssqlserver:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - mssqlserver + testcontainers-mssqlserver {{latest_version}} test diff --git a/docs/modules/databases/mysql.md b/docs/modules/databases/mysql.md index 46bf8b586de..1747989766f 100644 --- a/docs/modules/databases/mysql.md +++ b/docs/modules/databases/mysql.md @@ -40,13 +40,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:mysql:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-mysql:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - mysql + testcontainers-mysql {{latest_version}} test diff --git a/docs/modules/databases/neo4j.md b/docs/modules/databases/neo4j.md index a8570fe7270..9bfb7fbfca7 100644 --- a/docs/modules/databases/neo4j.md +++ b/docs/modules/databases/neo4j.md @@ -120,13 +120,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:neo4j:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-neo4j:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - neo4j + testcontainers-neo4j {{latest_version}} test diff --git a/docs/modules/databases/oceanbase.md b/docs/modules/databases/oceanbase.md index c5c82a091fd..c315a871058 100644 --- a/docs/modules/databases/oceanbase.md +++ b/docs/modules/databases/oceanbase.md @@ -24,14 +24,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:oceanbase:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-oceanbase:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - oceanbase + testcontainers-oceanbase {{latest_version}} test diff --git a/docs/modules/databases/oraclefree.md b/docs/modules/databases/oraclefree.md index b9ade460a20..75f3d677ffc 100644 --- a/docs/modules/databases/oraclefree.md +++ b/docs/modules/databases/oraclefree.md @@ -24,13 +24,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:oracle-free:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-oracle-free:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - oracle-free + testcontainers-oracle-free {{latest_version}} test diff --git a/docs/modules/databases/oraclexe.md b/docs/modules/databases/oraclexe.md index 0f018a045fb..8d060ed65be 100644 --- a/docs/modules/databases/oraclexe.md +++ b/docs/modules/databases/oraclexe.md @@ -24,13 +24,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:oracle-xe:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-oracle-xe:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - oracle-xe + testcontainers-oracle-xe {{latest_version}} test diff --git a/docs/modules/databases/orientdb.md b/docs/modules/databases/orientdb.md index a1f57098d99..f3be7e2bbdb 100644 --- a/docs/modules/databases/orientdb.md +++ b/docs/modules/databases/orientdb.md @@ -16,13 +16,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:orientdb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-orientdb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - orientdb + testcontainers-orientdb {{latest_version}} test diff --git a/docs/modules/databases/postgres.md b/docs/modules/databases/postgres.md index bb2414fa2cc..f27752b8354 100644 --- a/docs/modules/databases/postgres.md +++ b/docs/modules/databases/postgres.md @@ -49,13 +49,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:postgresql:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-postgresql:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - postgresql + testcontainers-postgresql {{latest_version}} test diff --git a/docs/modules/databases/presto.md b/docs/modules/databases/presto.md index d0a47fc1d7a..4e9a6e7c95d 100644 --- a/docs/modules/databases/presto.md +++ b/docs/modules/databases/presto.md @@ -69,13 +69,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:presto:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-presto:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - presto + testcontainers-presto {{latest_version}} test diff --git a/docs/modules/databases/questdb.md b/docs/modules/databases/questdb.md index 6c99e32df2e..eb5c466f371 100644 --- a/docs/modules/databases/questdb.md +++ b/docs/modules/databases/questdb.md @@ -26,7 +26,7 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy -testImplementation "org.testcontainers:questdb:{{latest_version}}" +testImplementation "org.testcontainers:testcontainers-questdb:{{latest_version}}" ``` === "Maven" @@ -35,7 +35,7 @@ testImplementation "org.testcontainers:questdb:{{latest_version}}" org.testcontainers - questdb + testcontainers-questdb {{latest_version}} test diff --git a/docs/modules/databases/r2dbc.md b/docs/modules/databases/r2dbc.md index 5aded5431ca..91580811887 100644 --- a/docs/modules/databases/r2dbc.md +++ b/docs/modules/databases/r2dbc.md @@ -12,7 +12,7 @@ As long as you have Testcontainers and the appropriate R2DBC driver on your clas The started container will be terminated when the `ConnectionFactory` is closed. !!! warning - Both the database module (e.g. `org.testcontainers:mysql`) **and** `org.testcontainers:r2dbc` need to be on your application's classpath at runtime. + Both the database module (e.g. `org.testcontainers:testcontainers-mysql`) **and** `org.testcontainers:testcontainers-r2dbc` need to be on your application's classpath at runtime. **Original URL**: `r2dbc:mysql://localhost:3306/databasename` diff --git a/docs/modules/databases/scylladb.md b/docs/modules/databases/scylladb.md index 186f5097d39..bde40e3b599 100644 --- a/docs/modules/databases/scylladb.md +++ b/docs/modules/databases/scylladb.md @@ -44,14 +44,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:scylladb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-scylladb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - scylladb + testcontainers-scylladb {{latest_version}} test diff --git a/docs/modules/databases/tidb.md b/docs/modules/databases/tidb.md index 3dfdc743bbe..17cb66b21c3 100644 --- a/docs/modules/databases/tidb.md +++ b/docs/modules/databases/tidb.md @@ -24,14 +24,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:tidb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-tidb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - tidb + testcontainers-tidb {{latest_version}} test diff --git a/docs/modules/databases/timeplus.md b/docs/modules/databases/timeplus.md index 3364f97d509..ee5e5767223 100644 --- a/docs/modules/databases/timeplus.md +++ b/docs/modules/databases/timeplus.md @@ -22,14 +22,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:timeplus:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-timeplus:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - timeplus + testcontainers-timeplus {{latest_version}} test diff --git a/docs/modules/databases/trino.md b/docs/modules/databases/trino.md index 9cb6be8bb5b..81fb4ea5b98 100644 --- a/docs/modules/databases/trino.md +++ b/docs/modules/databases/trino.md @@ -24,14 +24,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:trino:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-trino:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - trino + testcontainers-trino {{latest_version}} test diff --git a/docs/modules/databases/yugabytedb.md b/docs/modules/databases/yugabytedb.md index 0824227c937..4409712241b 100644 --- a/docs/modules/databases/yugabytedb.md +++ b/docs/modules/databases/yugabytedb.md @@ -36,13 +36,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:yugabytedb:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-yugabytedb:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - yugabytedb + testcontainers-yugabytedb {{latest_version}} test diff --git a/docs/modules/elasticsearch.md b/docs/modules/elasticsearch.md index 3834081f2c6..c1fb4a3f6a8 100644 --- a/docs/modules/elasticsearch.md +++ b/docs/modules/elasticsearch.md @@ -36,14 +36,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:elasticsearch:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-elasticsearch:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - elasticsearch + testcontainers-elasticsearch {{latest_version}} test diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index dc86e7f4892..9660461d5a0 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -156,13 +156,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:gcloud:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-gcloud:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - gcloud + testcontainers-gcloud {{latest_version}} test diff --git a/docs/modules/grafana.md b/docs/modules/grafana.md index f31984ea7ce..397ade89ee3 100644 --- a/docs/modules/grafana.md +++ b/docs/modules/grafana.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:grafana:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-grafana:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - grafana + testcontainers-grafana {{latest_version}} test diff --git a/docs/modules/hivemq.md b/docs/modules/hivemq.md index c898d58fea8..0029204a06c 100644 --- a/docs/modules/hivemq.md +++ b/docs/modules/hivemq.md @@ -212,13 +212,13 @@ can be customized as desired. Add to `build.gradle`: ````groovy -testImplementation 'org.testcontainers:hivemq:{{latest_version}}' +testImplementation 'org.testcontainers:testcontainers-hivemq:{{latest_version}}' ```` Add to `build.gradle.kts`: ````kotlin -testImplementation("org.testcontainers:hivemq:{{latest_version}}") +testImplementation("org.testcontainers:testcontainers-hivemq:{{latest_version}}") ```` ### Maven @@ -228,7 +228,7 @@ Add to `pom.xml`: ```xml org.testcontainers - hivemq + testcontainers-hivemq {{latest_version}} test diff --git a/docs/modules/k3s.md b/docs/modules/k3s.md index 2df695b1c1e..a9de1b3fd4f 100644 --- a/docs/modules/k3s.md +++ b/docs/modules/k3s.md @@ -44,13 +44,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:k3s:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-k3s:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - k3s + testcontainers-k3s {{latest_version}} test diff --git a/docs/modules/k6.md b/docs/modules/k6.md index 7d14701aaa3..4783ca1e5ad 100644 --- a/docs/modules/k6.md +++ b/docs/modules/k6.md @@ -26,13 +26,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:k6:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-k6:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - k6 + testcontainers-k6 {{latest_version}} test diff --git a/docs/modules/kafka.md b/docs/modules/kafka.md index 4311be61b5a..cb2906265d0 100644 --- a/docs/modules/kafka.md +++ b/docs/modules/kafka.md @@ -86,13 +86,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:kafka:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-kafka:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - kafka + testcontainers-kafka {{latest_version}} test diff --git a/docs/modules/ldap.md b/docs/modules/ldap.md index 771975d6346..c84469f22ae 100644 --- a/docs/modules/ldap.md +++ b/docs/modules/ldap.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:ldap:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-ldap:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - ldap + testcontainers-ldap {{latest_version}} test diff --git a/docs/modules/localstack.md b/docs/modules/localstack.md index 0afbea358c6..72d4fc843a7 100644 --- a/docs/modules/localstack.md +++ b/docs/modules/localstack.md @@ -25,13 +25,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:localstack:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-localstack:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - localstack + testcontainers-localstack {{latest_version}} test diff --git a/docs/modules/milvus.md b/docs/modules/milvus.md index 2808f9d2199..96772560f80 100644 --- a/docs/modules/milvus.md +++ b/docs/modules/milvus.md @@ -22,14 +22,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:milvus:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-milvus:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - milvus + testcontainers-milvus {{latest_version}} test diff --git a/docs/modules/minio.md b/docs/modules/minio.md index 2b872682ebe..165f760425c 100644 --- a/docs/modules/minio.md +++ b/docs/modules/minio.md @@ -25,14 +25,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:minio:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-minio:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - minio + testcontainers-minio {{latest_version}} test diff --git a/docs/modules/mockserver.md b/docs/modules/mockserver.md index fc4402ae9e8..e6a0ee91ece 100644 --- a/docs/modules/mockserver.md +++ b/docs/modules/mockserver.md @@ -22,13 +22,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:mockserver:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-mockserver:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - mockserver + testcontainers-mockserver {{latest_version}} test diff --git a/docs/modules/nginx.md b/docs/modules/nginx.md index d0661330bb1..6fcdbdaf13f 100644 --- a/docs/modules/nginx.md +++ b/docs/modules/nginx.md @@ -28,13 +28,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:nginx:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-nginx:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - nginx + testcontainers-nginx {{latest_version}} test diff --git a/docs/modules/ollama.md b/docs/modules/ollama.md index e54ee824938..56c1574d4db 100644 --- a/docs/modules/ollama.md +++ b/docs/modules/ollama.md @@ -38,14 +38,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:ollama:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-ollama:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - ollama + testcontainers-ollama {{latest_version}} test diff --git a/docs/modules/openfga.md b/docs/modules/openfga.md index 3df822468f4..4d916ce6aa6 100644 --- a/docs/modules/openfga.md +++ b/docs/modules/openfga.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:openfga:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-openfga:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - openfga + testcontainers-openfga {{latest_version}} test diff --git a/docs/modules/pinecone.md b/docs/modules/pinecone.md index b4eac925c51..6bcea81ab39 100644 --- a/docs/modules/pinecone.md +++ b/docs/modules/pinecone.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy -testImplementation "org.testcontainers:pinecone:{{latest_version}}" +testImplementation "org.testcontainers:testcontainers-pinecone:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - pinecone + testcontainers-pinecone {{latest_version}} test diff --git a/docs/modules/pulsar.md b/docs/modules/pulsar.md index 5c0c2497f4e..5bd33b0bc4c 100644 --- a/docs/modules/pulsar.md +++ b/docs/modules/pulsar.md @@ -52,13 +52,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:pulsar:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-pulsar:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - pulsar + testcontainers-pulsar {{latest_version}} test diff --git a/docs/modules/qdrant.md b/docs/modules/qdrant.md index 25aef090c97..9431a340a9c 100644 --- a/docs/modules/qdrant.md +++ b/docs/modules/qdrant.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:qdrant:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-qdrant:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - qdrant + testcontainers-qdrant {{latest_version}} test diff --git a/docs/modules/rabbitmq.md b/docs/modules/rabbitmq.md index 4055bb59f06..5381e3cd910 100644 --- a/docs/modules/rabbitmq.md +++ b/docs/modules/rabbitmq.md @@ -6,13 +6,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:rabbitmq:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-rabbitmq:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - rabbitmq + testcontainers-rabbitmq {{latest_version}} test diff --git a/docs/modules/redpanda.md b/docs/modules/redpanda.md index 9c7b7b3fb86..429ae5a9768 100644 --- a/docs/modules/redpanda.md +++ b/docs/modules/redpanda.md @@ -89,13 +89,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy -testImplementation "org.testcontainers:redpanda:{{latest_version}}" +testImplementation "org.testcontainers:testcontainers-redpanda:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - redpanda + testcontainers-redpanda {{latest_version}} test diff --git a/docs/modules/solace.md b/docs/modules/solace.md index 93fc0e9875f..91956533906 100644 --- a/docs/modules/solace.md +++ b/docs/modules/solace.md @@ -26,13 +26,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:solace:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-solace:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - solace + testcontainers-solace {{latest_version}} test diff --git a/docs/modules/solr.md b/docs/modules/solr.md index 73546dcbd6d..957615fcbf1 100644 --- a/docs/modules/solr.md +++ b/docs/modules/solr.md @@ -18,13 +18,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:solr:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-solr:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - solr + testcontainers-solr {{latest_version}} test diff --git a/docs/modules/toxiproxy.md b/docs/modules/toxiproxy.md index 99178935b9a..40f792911bb 100644 --- a/docs/modules/toxiproxy.md +++ b/docs/modules/toxiproxy.md @@ -71,13 +71,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:toxiproxy:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-toxiproxy:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - toxiproxy + testcontainers-toxiproxy {{latest_version}} test diff --git a/docs/modules/typesense.md b/docs/modules/typesense.md index e7c332884c7..c73a640d881 100644 --- a/docs/modules/typesense.md +++ b/docs/modules/typesense.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:typesense:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-typesense:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - typesense + testcontainers-typesense {{latest_version}} test diff --git a/docs/modules/vault.md b/docs/modules/vault.md index e32abfd1c60..45d34844b7f 100644 --- a/docs/modules/vault.md +++ b/docs/modules/vault.md @@ -43,13 +43,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:vault:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-vault:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - vault + testcontainers-vault {{latest_version}} test diff --git a/docs/modules/weaviate.md b/docs/modules/weaviate.md index da028cf3ce1..76146ab5ee9 100644 --- a/docs/modules/weaviate.md +++ b/docs/modules/weaviate.md @@ -16,14 +16,14 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy -testImplementation "org.testcontainers:weaviate:{{latest_version}}" +testImplementation "org.testcontainers:testcontainers-weaviate:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers -weaviate +testcontainers-weaviate {{latest_version}} test diff --git a/docs/modules/webdriver_containers.md b/docs/modules/webdriver_containers.md index a42f261d79c..8101f489e3a 100644 --- a/docs/modules/webdriver_containers.md +++ b/docs/modules/webdriver_containers.md @@ -90,13 +90,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:selenium:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-selenium:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - selenium + testcontainers-selenium {{latest_version}} test From c8cc7fdf76aac18c759473c3f6ee9a93e663b409 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:14:55 -0600 Subject: [PATCH 0938/1224] [create-pull-request] automated change (#11111) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d83ed4b9998..e5a11dd3ac9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=1.21.3 +testcontainers.version=2.0.0 From 93af7320045a62097f372ea632715bac65e786f7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 14 Oct 2025 16:15:12 -0600 Subject: [PATCH 0939/1224] [create-pull-request] automated change (#11110) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 3e39a67f959..2ae8842ffbc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -141,4 +141,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 1.21.3 + latest_version: 2.0.0 From 376642b0be4863437f6ea11b2d04f25692447314 Mon Sep 17 00:00:00 2001 From: Raimund Klein <770876+Chessray@users.noreply.github.com> Date: Wed, 15 Oct 2025 15:44:57 +0100 Subject: [PATCH 0940/1224] Fix doc about Testcontainers JUnit Jupiter coordinates (#11113) Fixes #11112 --- docs/test_framework_integration/junit_5.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/test_framework_integration/junit_5.md b/docs/test_framework_integration/junit_5.md index 8f3c21372dd..883adc90af9 100644 --- a/docs/test_framework_integration/junit_5.md +++ b/docs/test_framework_integration/junit_5.md @@ -70,13 +70,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:junit-jupiter:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-junit-jupiter:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - junit-jupiter + testcontainers-junit-jupiter {{latest_version}} test From 546fa4a13687743fad02b3501f20914e66af84f8 Mon Sep 17 00:00:00 2001 From: Filipe Roque Date: Wed, 15 Oct 2025 18:51:46 +0100 Subject: [PATCH 0941/1224] Fix exclusion of testcontainers-jdbc-test from publication (#11115) --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 52d6f33f25c..f405ea2b92c 100644 --- a/build.gradle +++ b/build.gradle @@ -78,7 +78,7 @@ subprojects { } // specific modules should be excluded from publication - if ( ! ["test-support", "jdbc-test"].contains(it.name) && !it.path.startsWith(":docs:") && it != project(":docs") ) { + if ( ! ["test-support", "testcontainers-jdbc-test"].contains(it.name) && !it.path.startsWith(":docs:") && it != project(":docs") ) { apply from: "$rootDir/gradle/publishing.gradle" if (it.name != "bom") { From a8b0f5c437e9bc80ff6aab9c156983cc9109c6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 15 Oct 2025 14:22:25 -0600 Subject: [PATCH 0942/1224] Add PostgreSQLR2DBCDatabaseContainer compatible with org.testcontainers.postgresql.PostgreSQLContainer (#11120) --- .../PostgreSQLR2DBCDatabaseContainer.java | 58 +++++++++++++++++++ .../PostgreSQLR2DBCDatabaseContainerTest.java | 30 ++++++++++ 2 files changed, 88 insertions(+) create mode 100644 modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java create mode 100644 modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java diff --git a/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java new file mode 100644 index 00000000000..d99d638b100 --- /dev/null +++ b/modules/postgresql/src/main/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainer.java @@ -0,0 +1,58 @@ +package org.testcontainers.postgresql; + +import io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider; +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.lifecycle.Startable; +import org.testcontainers.r2dbc.R2DBCDatabaseContainer; + +import java.util.Set; + +public final class PostgreSQLR2DBCDatabaseContainer implements R2DBCDatabaseContainer { + + private final PostgreSQLContainer container; + + public PostgreSQLR2DBCDatabaseContainer(PostgreSQLContainer container) { + this.container = container; + } + + public static ConnectionFactoryOptions getOptions(PostgreSQLContainer container) { + ConnectionFactoryOptions options = ConnectionFactoryOptions + .builder() + .option(ConnectionFactoryOptions.DRIVER, PostgresqlConnectionFactoryProvider.POSTGRESQL_DRIVER) + .build(); + + return new PostgreSQLR2DBCDatabaseContainer(container).configure(options); + } + + @Override + public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { + return options + .mutate() + .option(ConnectionFactoryOptions.HOST, container.getHost()) + .option(ConnectionFactoryOptions.PORT, container.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT)) + .option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName()) + .option(ConnectionFactoryOptions.USER, container.getUsername()) + .option(ConnectionFactoryOptions.PASSWORD, container.getPassword()) + .build(); + } + + @Override + public Set getDependencies() { + return this.container.getDependencies(); + } + + @Override + public void start() { + this.container.start(); + } + + @Override + public void stop() { + this.container.stop(); + } + + @Override + public void close() { + this.container.close(); + } +} diff --git a/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java new file mode 100644 index 00000000000..4f5386d9f58 --- /dev/null +++ b/modules/postgresql/src/test/java/org/testcontainers/postgresql/PostgreSQLR2DBCDatabaseContainerTest.java @@ -0,0 +1,30 @@ +package org.testcontainers.postgresql; + +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.PostgreSQLTestImages; +import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; + +public class PostgreSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { + + @Override + protected PostgreSQLContainer createContainer() { + return new PostgreSQLContainer(PostgreSQLTestImages.POSTGRES_TEST_IMAGE); + } + + @Override + protected ConnectionFactoryOptions getOptions(PostgreSQLContainer container) { + // spotless:off + // get_options { + ConnectionFactoryOptions options = PostgreSQLR2DBCDatabaseContainer.getOptions( + container + ); + // } + // spotless:on + + return options; + } + + protected String createR2DBCUrl() { + return "r2dbc:tc:postgresql:///db?TC_IMAGE_TAG=10-alpine"; + } +} From c32d81197201de7faec797ab2f5db9cb3f253450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 15 Oct 2025 14:22:46 -0600 Subject: [PATCH 0943/1224] Add MSSQLR2DBCDatabaseContainer compatible with org.testcontainers.mssqlserver.MSSQLServerContainer (#11118) --- .../MSSQLR2DBCDatabaseContainer.java | 59 +++++++++++++++++++ .../MSSQLR2DBCDatabaseContainerTest.java | 23 ++++++++ 2 files changed, 82 insertions(+) create mode 100644 modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainer.java create mode 100644 modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainerTest.java diff --git a/modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainer.java b/modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainer.java new file mode 100644 index 00000000000..d8d7740e01d --- /dev/null +++ b/modules/mssqlserver/src/main/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainer.java @@ -0,0 +1,59 @@ +package org.testcontainers.mssqlserver; + +import io.r2dbc.mssql.MssqlConnectionFactoryProvider; +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.lifecycle.Startable; +import org.testcontainers.r2dbc.R2DBCDatabaseContainer; + +import java.util.Set; + +public class MSSQLR2DBCDatabaseContainer implements R2DBCDatabaseContainer { + + private final MSSQLServerContainer container; + + public MSSQLR2DBCDatabaseContainer(MSSQLServerContainer container) { + this.container = container; + } + + public static ConnectionFactoryOptions getOptions(MSSQLServerContainer container) { + ConnectionFactoryOptions options = ConnectionFactoryOptions + .builder() + .option(ConnectionFactoryOptions.DRIVER, MssqlConnectionFactoryProvider.MSSQL_DRIVER) + .build(); + + return new MSSQLR2DBCDatabaseContainer(container).configure(options); + } + + @Override + public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { + return options + .mutate() + .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()) + .option(ConnectionFactoryOptions.USER, container.getUsername()) + .option(ConnectionFactoryOptions.PASSWORD, container.getPassword()) + .build(); + } + + @Override + public Set getDependencies() { + return this.container.getDependencies(); + } + + @Override + public void start() { + this.container.start(); + } + + @Override + public void stop() { + this.container.stop(); + } + + @Override + public void close() { + this.container.close(); + } +} diff --git a/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainerTest.java b/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainerTest.java new file mode 100644 index 00000000000..7b51e8f1f93 --- /dev/null +++ b/modules/mssqlserver/src/test/java/org/testcontainers/mssqlserver/MSSQLR2DBCDatabaseContainerTest.java @@ -0,0 +1,23 @@ +package org.testcontainers.mssqlserver; + +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.MSSQLServerTestImages; +import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; + +class MSSQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { + + @Override + protected ConnectionFactoryOptions getOptions(MSSQLServerContainer container) { + return MSSQLR2DBCDatabaseContainer.getOptions(container); + } + + @Override + protected String createR2DBCUrl() { + return "r2dbc:tc:sqlserver:///?TC_IMAGE_TAG=2022-CU14-ubuntu-22.04"; + } + + @Override + protected MSSQLServerContainer createContainer() { + return new MSSQLServerContainer(MSSQLServerTestImages.MSSQL_SERVER_IMAGE); + } +} From 09aefb2ec9c8c20b29857b05c15c7bffb1668eb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 15 Oct 2025 14:22:55 -0600 Subject: [PATCH 0944/1224] Add MariaDBR2DBCDatabaseContainer compatible with org.testcontainers.mariadb.MariaDBContainer (#11117) --- .../MariaDBR2DBCDatabaseContainer.java | 58 +++++++++++++++++++ .../MariaDBR2DBCDatabaseContainerTest.java | 23 ++++++++ 2 files changed, 81 insertions(+) create mode 100644 modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainer.java create mode 100644 modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainerTest.java diff --git a/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainer.java b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainer.java new file mode 100644 index 00000000000..4c9e6350d23 --- /dev/null +++ b/modules/mariadb/src/main/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainer.java @@ -0,0 +1,58 @@ +package org.testcontainers.mariadb; + +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.mariadb.r2dbc.MariadbConnectionFactoryProvider; +import org.testcontainers.lifecycle.Startable; +import org.testcontainers.r2dbc.R2DBCDatabaseContainer; + +import java.util.Set; + +public class MariaDBR2DBCDatabaseContainer implements R2DBCDatabaseContainer { + + private final MariaDBContainer container; + + public MariaDBR2DBCDatabaseContainer(MariaDBContainer container) { + this.container = container; + } + + public static ConnectionFactoryOptions getOptions(MariaDBContainer container) { + ConnectionFactoryOptions options = ConnectionFactoryOptions + .builder() + .option(ConnectionFactoryOptions.DRIVER, MariadbConnectionFactoryProvider.MARIADB_DRIVER) + .build(); + + return new MariaDBR2DBCDatabaseContainer(container).configure(options); + } + + @Override + public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { + return options + .mutate() + .option(ConnectionFactoryOptions.HOST, container.getHost()) + .option(ConnectionFactoryOptions.PORT, container.getMappedPort(MariaDBContainer.MARIADB_PORT)) + .option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName()) + .option(ConnectionFactoryOptions.USER, container.getUsername()) + .option(ConnectionFactoryOptions.PASSWORD, container.getPassword()) + .build(); + } + + @Override + public Set getDependencies() { + return this.container.getDependencies(); + } + + @Override + public void start() { + this.container.start(); + } + + @Override + public void stop() { + this.container.stop(); + } + + @Override + public void close() { + this.container.close(); + } +} diff --git a/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainerTest.java b/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainerTest.java new file mode 100644 index 00000000000..8260a6937df --- /dev/null +++ b/modules/mariadb/src/test/java/org/testcontainers/mariadb/MariaDBR2DBCDatabaseContainerTest.java @@ -0,0 +1,23 @@ +package org.testcontainers.mariadb; + +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; +import org.testcontainers.utility.DockerImageName; + +public class MariaDBR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { + + @Override + protected ConnectionFactoryOptions getOptions(MariaDBContainer container) { + return MariaDBR2DBCDatabaseContainer.getOptions(container); + } + + @Override + protected String createR2DBCUrl() { + return "r2dbc:tc:mariadb:///db?TC_IMAGE_TAG=10.3.39"; + } + + @Override + protected MariaDBContainer createContainer() { + return new MariaDBContainer(DockerImageName.parse("mariadb:10.3.39")); + } +} From 1f3b9becce644eda2ee143619d69f6d16982d894 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 15 Oct 2025 14:23:04 -0600 Subject: [PATCH 0945/1224] Remove lombok from OracleR2DBCDatabaseContainer (#11116) --- .../oracle/OracleR2DBCDatabaseContainer.java | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainer.java b/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainer.java index f9c12955653..ae480027f25 100644 --- a/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainer.java +++ b/modules/oracle-free/src/main/java/org/testcontainers/oracle/OracleR2DBCDatabaseContainer.java @@ -1,17 +1,19 @@ package org.testcontainers.oracle; import io.r2dbc.spi.ConnectionFactoryOptions; -import lombok.RequiredArgsConstructor; -import lombok.experimental.Delegate; import org.testcontainers.lifecycle.Startable; import org.testcontainers.r2dbc.R2DBCDatabaseContainer; -@RequiredArgsConstructor +import java.util.Set; + public class OracleR2DBCDatabaseContainer implements R2DBCDatabaseContainer { - @Delegate(types = Startable.class) private final OracleContainer container; + public OracleR2DBCDatabaseContainer(OracleContainer container) { + this.container = container; + } + public static ConnectionFactoryOptions getOptions(OracleContainer container) { ConnectionFactoryOptions options = ConnectionFactoryOptions .builder() @@ -32,4 +34,24 @@ public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { .option(ConnectionFactoryOptions.PASSWORD, container.getPassword()) .build(); } + + @Override + public Set getDependencies() { + return this.container.getDependencies(); + } + + @Override + public void start() { + this.container.start(); + } + + @Override + public void stop() { + this.container.stop(); + } + + @Override + public void close() { + this.container.close(); + } } From ca450d00c267882935e0e02852cdac994a117bce Mon Sep 17 00:00:00 2001 From: SAGAR PRASAD <19862200+ox-sag@users.noreply.github.com> Date: Thu, 16 Oct 2025 01:55:07 +0530 Subject: [PATCH 0946/1224] Fix artifact coordinates listed in docs (#11121) --- docs/index.md | 4 ++-- docs/quickstart/junit_5_quickstart.md | 4 ++-- docs/quickstart/spock_quickstart.md | 4 ++-- docs/test_framework_integration/spock.md | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/index.md b/docs/index.md index a3b499dfa0c..40304dd22ed 100644 --- a/docs/index.md +++ b/docs/index.md @@ -82,7 +82,7 @@ and then use dependencies without specifying a version: ```xml org.testcontainers - mysql + testcontainers-mysql test ``` @@ -92,7 +92,7 @@ Using Gradle 5.0 or higher, you can add the following to the `dependencies` sect === "Gradle" ```groovy implementation platform('org.testcontainers:testcontainers-bom:{{latest_version}}') //import bom - testImplementation('org.testcontainers:mysql') //no version specified + testImplementation('org.testcontainers:testcontainers-mysql') //no version specified ``` diff --git a/docs/quickstart/junit_5_quickstart.md b/docs/quickstart/junit_5_quickstart.md index 3c126196845..effd17dd2d9 100644 --- a/docs/quickstart/junit_5_quickstart.md +++ b/docs/quickstart/junit_5_quickstart.md @@ -25,7 +25,7 @@ First, add Testcontainers as a dependency as follows: ```groovy testImplementation "org.junit.jupiter:junit-jupiter:5.8.1" testImplementation "org.testcontainers:testcontainers:{{latest_version}}" - testImplementation "org.testcontainers:junit-jupiter:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-junit-jupiter:{{latest_version}}" ``` === "Maven" ```xml @@ -43,7 +43,7 @@ First, add Testcontainers as a dependency as follows: org.testcontainers - junit-jupiter + testcontainers-junit-jupiter {{latest_version}} test diff --git a/docs/quickstart/spock_quickstart.md b/docs/quickstart/spock_quickstart.md index 267954e99ee..c9c78bea5ea 100644 --- a/docs/quickstart/spock_quickstart.md +++ b/docs/quickstart/spock_quickstart.md @@ -23,13 +23,13 @@ First, add Testcontainers as a dependency as follows: === "Gradle" ```groovy - testImplementation "org.testcontainers:spock:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-spock:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - spock + testcontainers-spock {{latest_version}} test diff --git a/docs/test_framework_integration/spock.md b/docs/test_framework_integration/spock.md index b8c1d5b7eae..3d50e0399d2 100644 --- a/docs/test_framework_integration/spock.md +++ b/docs/test_framework_integration/spock.md @@ -19,13 +19,13 @@ Add the following dependency to your `pom.xml`/`build.gradle` file: === "Gradle" ```groovy - testImplementation "org.testcontainers:spock:{{latest_version}}" + testImplementation "org.testcontainers:testcontainers-spock:{{latest_version}}" ``` === "Maven" ```xml org.testcontainers - spock + testcontainers-spock {{latest_version}} test From a0df99d727c775b766b45950ed8b122fa5847863 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 15 Oct 2025 14:30:28 -0600 Subject: [PATCH 0947/1224] Add MySQLR2DBCDatabaseContainer compatible with org.testcontainers.mysql.MySQLContainer (#11119) --- .../mysql/MySQLR2DBCDatabaseContainer.java | 58 +++++++++++++++++++ .../MySQLR2DBCDatabaseContainerTest.java | 23 ++++++++ 2 files changed, 81 insertions(+) create mode 100644 modules/mysql/src/main/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainer.java create mode 100644 modules/mysql/src/test/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainerTest.java diff --git a/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainer.java b/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainer.java new file mode 100644 index 00000000000..d2a272559d9 --- /dev/null +++ b/modules/mysql/src/main/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainer.java @@ -0,0 +1,58 @@ +package org.testcontainers.mysql; + +import io.asyncer.r2dbc.mysql.MySqlConnectionFactoryProvider; +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.lifecycle.Startable; +import org.testcontainers.r2dbc.R2DBCDatabaseContainer; + +import java.util.Set; + +public class MySQLR2DBCDatabaseContainer implements R2DBCDatabaseContainer { + + private final MySQLContainer container; + + public MySQLR2DBCDatabaseContainer(MySQLContainer container) { + this.container = container; + } + + public static ConnectionFactoryOptions getOptions(MySQLContainer container) { + ConnectionFactoryOptions options = ConnectionFactoryOptions + .builder() + .option(ConnectionFactoryOptions.DRIVER, MySqlConnectionFactoryProvider.MYSQL_DRIVER) + .build(); + + return new MySQLR2DBCDatabaseContainer(container).configure(options); + } + + @Override + public ConnectionFactoryOptions configure(ConnectionFactoryOptions options) { + return options + .mutate() + .option(ConnectionFactoryOptions.HOST, container.getHost()) + .option(ConnectionFactoryOptions.PORT, container.getMappedPort(MySQLContainer.MYSQL_PORT)) + .option(ConnectionFactoryOptions.DATABASE, container.getDatabaseName()) + .option(ConnectionFactoryOptions.USER, container.getUsername()) + .option(ConnectionFactoryOptions.PASSWORD, container.getPassword()) + .build(); + } + + @Override + public Set getDependencies() { + return this.container.getDependencies(); + } + + @Override + public void start() { + this.container.start(); + } + + @Override + public void stop() { + this.container.stop(); + } + + @Override + public void close() { + this.container.close(); + } +} diff --git a/modules/mysql/src/test/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainerTest.java b/modules/mysql/src/test/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainerTest.java new file mode 100644 index 00000000000..5e86a92347b --- /dev/null +++ b/modules/mysql/src/test/java/org/testcontainers/mysql/MySQLR2DBCDatabaseContainerTest.java @@ -0,0 +1,23 @@ +package org.testcontainers.mysql; + +import io.r2dbc.spi.ConnectionFactoryOptions; +import org.testcontainers.MySQLTestImages; +import org.testcontainers.r2dbc.AbstractR2DBCDatabaseContainerTest; + +public class MySQLR2DBCDatabaseContainerTest extends AbstractR2DBCDatabaseContainerTest { + + @Override + protected ConnectionFactoryOptions getOptions(MySQLContainer container) { + return MySQLR2DBCDatabaseContainer.getOptions(container); + } + + @Override + protected String createR2DBCUrl() { + return "r2dbc:tc:mysql:///db?TC_IMAGE_TAG=" + MySQLTestImages.MYSQL_80_IMAGE.getVersionPart(); + } + + @Override + protected MySQLContainer createContainer() { + return new MySQLContainer(MySQLTestImages.MYSQL_80_IMAGE); + } +} From 527a969da8e94b87ab1245cf7fab0ea22bea1366 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 15 Oct 2025 14:59:45 -0600 Subject: [PATCH 0948/1224] Fix Pinecone's description --- modules/pinecone/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/pinecone/build.gradle b/modules/pinecone/build.gradle index 3ad5b97d98f..ad46d3ce9d9 100644 --- a/modules/pinecone/build.gradle +++ b/modules/pinecone/build.gradle @@ -1,4 +1,4 @@ -description = "Testcontainers :: ActiveMQ" +description = "Testcontainers :: Pinecone" dependencies { api project(':testcontainers') From da525245459ea00cfd2f22f87e29ab24f7f04d9e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 16 Oct 2025 08:14:35 -0600 Subject: [PATCH 0949/1224] Remove dynalite documentation --- docs/modules/databases/dynalite.md | 47 ------------------------------ mkdocs.yml | 1 - 2 files changed, 48 deletions(-) delete mode 100644 docs/modules/databases/dynalite.md diff --git a/docs/modules/databases/dynalite.md b/docs/modules/databases/dynalite.md deleted file mode 100644 index 445395479dd..00000000000 --- a/docs/modules/databases/dynalite.md +++ /dev/null @@ -1,47 +0,0 @@ -# Dynalite Module - -Testcontainers module for [Dynalite](https://github.com/mhart/dynalite). Dynalite is a clone of DynamoDB, enabling local testing. - -## Usage example - -Running Dynalite as a stand-in for DynamoDB in a test: - -```java -public class SomeTest { - - @Rule - public DynaliteContainer dynamoDB = new DynaliteContainer(); - - @Test - public void someTestMethod() { - // getClient() returns a preconfigured DynamoDB client that is connected to the - // dynalite container - final AmazonDynamoDB client = dynamoDB.getClient(); - - ... interact with client as if using DynamoDB normally -``` - -## Why Dynalite for DynamoDB testing? - -In part, because it's light and quick to run. Also, please see the [reasons given](https://github.com/mhart/dynalite#why-not-amazons-dynamodb-local) by the author of Dynalite and the [problems with Amazon's DynamoDB Local](https://github.com/mhart/dynalite#problems-with-amazons-dynamodb-local-updated-2016-04-19). - -## Adding this module to your project dependencies - -Add the following dependency to your `pom.xml`/`build.gradle` file: - -=== "Gradle" - ```groovy - testImplementation "org.testcontainers:testcontainers-dynalite:{{latest_version}}" - ``` -=== "Maven" - ```xml - - org.testcontainers - testcontainers-dynalite - {{latest_version}} - test - - ``` - -!!! hint - Adding this Testcontainers library JAR will not automatically add an AWS SDK JAR to your project. You should ensure that your project also has a suitable AWS SDK JAR as a dependency. diff --git a/mkdocs.yml b/mkdocs.yml index 2ae8842ffbc..cf8f9dee24e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -58,7 +58,6 @@ nav: - modules/databases/cratedb.md - modules/databases/databend.md - modules/databases/db2.md - - modules/databases/dynalite.md - modules/databases/influxdb.md - modules/databases/mariadb.md - modules/databases/mongodb.md From 55224ce03ced75bf74352e8c469f1260e973ed92 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 13:37:33 -0600 Subject: [PATCH 0950/1224] [create-pull-request] automated change (#11126) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index cf8f9dee24e..60e224f9dfa 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -140,4 +140,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 2.0.0 + latest_version: 2.0.1 From 10cc854f95fdd6281799bed8f8462afe102d5a36 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 16 Oct 2025 13:37:47 -0600 Subject: [PATCH 0951/1224] [create-pull-request] automated change (#11125) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e5a11dd3ac9..ce0f80d957e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=2.0.0 +testcontainers.version=2.0.1 From 6cc35065a5835eb739ae537c6598e2c4e3e1894a Mon Sep 17 00:00:00 2001 From: Hyunwoo Jung <59077490+noojung@users.noreply.github.com> Date: Fri, 31 Oct 2025 07:08:22 +0900 Subject: [PATCH 0952/1224] Update kotest-extensions-testcontainers link (#11138) kotest-extensions-testcontainers project moved to the main kotest repository --- docs/test_framework_integration/external.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/test_framework_integration/external.md b/docs/test_framework_integration/external.md index 3f97b9f64cb..3396ff15d52 100644 --- a/docs/test_framework_integration/external.md +++ b/docs/test_framework_integration/external.md @@ -5,6 +5,6 @@ The following Open Source frameworks add direct integration to Testcontainers | Framework | Source Code | Documentation | | --- | --- | --- | | jqwik | [jqwik-testcontainers](https://github.com/jqwik-team/jqwik-testcontainers) | [README](https://github.com/jqwik-team/jqwik-testcontainers) | -| Kotest | [Kotest Extensions Testcontainers](https://github.com/kotest/kotest-extensions-testcontainers) | [kotest.io](https://kotest.io/docs/extensions/test_containers.html) | +| Kotest | [Kotest Extensions Testcontainers](https://github.com/kotest/kotest/tree/master/kotest-extensions/kotest-extensions-testcontainers) | [kotest.io](https://kotest.io/docs/extensions/test_containers.html) | | Synthesized | [Synthesized TDK-Testcontainers integration](https://github.com/synthesized-io/tdk-tc) | [synthesized.io](https://docs.synthesized.io/tdk/latest/user_guide/integrations/testcontainers) | | TCI | [Testcontainers Infrastructure (TCI) Framework](https://github.com/xdev-software/tci-base) | [README](https://github.com/xdev-software/tci-base) | From c504647f533710ee45bd31fea3bfde7c2c3bcc9d Mon Sep 17 00:00:00 2001 From: Guillaume Husta Date: Thu, 30 Oct 2025 23:44:03 +0100 Subject: [PATCH 0953/1224] Add getBaseUrl() to NginxContainer using NGINX_DEFAULT_PORT (#11137) --- .../main/java/org/testcontainers/nginx/NginxContainer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java b/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java index 61ac3678bed..f6eb70814ac 100644 --- a/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java +++ b/modules/nginx/src/main/java/org/testcontainers/nginx/NginxContainer.java @@ -27,4 +27,8 @@ public NginxContainer(final DockerImageName dockerImageName) { public URL getBaseUrl(String scheme, int port) throws MalformedURLException { return new URL(scheme + "://" + getHost() + ":" + getMappedPort(port)); } + + public URL getBaseUrl(String scheme) throws MalformedURLException { + return getBaseUrl(scheme, NGINX_DEFAULT_PORT); + } } From 57e03d0a2ed7c5fa2d639ce0ad883ffc4a1939c2 Mon Sep 17 00:00:00 2001 From: hspragg-godaddy <133794355+hspragg-godaddy@users.noreply.github.com> Date: Thu, 30 Oct 2025 15:54:17 -0700 Subject: [PATCH 0954/1224] Optimize ScriptSplitter from O(n*m) to O(1) when initializing database (#11130) --- .../src/main/java/org/testcontainers/ext/ScriptSplitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/database-commons/src/main/java/org/testcontainers/ext/ScriptSplitter.java b/modules/database-commons/src/main/java/org/testcontainers/ext/ScriptSplitter.java index ba05b71e7bd..d71f6f3ac3d 100644 --- a/modules/database-commons/src/main/java/org/testcontainers/ext/ScriptSplitter.java +++ b/modules/database-commons/src/main/java/org/testcontainers/ext/ScriptSplitter.java @@ -36,7 +36,7 @@ void split() { //skip break; case WHITESPACE: - if (!sb.toString().endsWith(" ")) { + if (sb.length() == 0 || sb.charAt(sb.length() - 1) != ' ') { sb.append(' '); } break; From dc3ceda03217f034d86ed52d07e91cc35da5b4d3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:00:46 +0000 Subject: [PATCH 0955/1224] Bump com.mysql:mysql-connector-j in /modules/jdbc-test Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 9.5.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...9.5.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 a6759030313..25f59574c8c 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -10,6 +10,6 @@ dependencies { api 'org.apache.tomcat:tomcat-jdbc:11.0.11' api 'org.vibur:vibur-dbcp:26.0' - api 'com.mysql:mysql-connector-j:8.2.0' + api 'com.mysql:mysql-connector-j:9.5.0' api 'org.junit.jupiter:junit-jupiter:5.13.4' } From 2e567000615feb51ea3e927b55e0d21dc0d75aca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:09:24 +0000 Subject: [PATCH 0956/1224] Bump io.trino:trino-jdbc from 477 to 478 in /modules/trino Bumps io.trino:trino-jdbc from 477 to 478. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-version: '478' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 6839d4791aa..004bd38a8b9 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:477' + testRuntimeOnly 'io.trino:trino-jdbc:478' compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 9938949ea23e380b2a6b09f0770acbfcfa4c0d43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 1 Nov 2025 22:21:43 +0000 Subject: [PATCH 0957/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-free Bumps com.oracle.database.jdbc:ojdbc11 from 23.9.0.25.07 to 23.26.0.0.0. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.26.0.0.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index 769572aaef1..e7cc9669632 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' From 73726f436fb469469986866ab55f67057d0beba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 3 Nov 2025 11:17:39 -0600 Subject: [PATCH 0958/1224] Cleanup japicmp excludes --- core/build.gradle | 31 ++---------------------------- modules/cockroachdb/build.gradle | 6 ------ modules/couchbase/build.gradle | 6 ------ modules/db2/build.gradle | 6 ------ modules/elasticsearch/build.gradle | 6 ------ modules/influxdb/build.gradle | 6 ------ modules/localstack/build.gradle | 6 ------ modules/mariadb/build.gradle | 6 ------ modules/mockserver/build.gradle | 6 ------ modules/mongodb/build.gradle | 6 ------ modules/mssqlserver/build.gradle | 6 ------ modules/mysql/build.gradle | 6 ------ modules/neo4j/build.gradle | 7 ------- modules/nginx/build.gradle | 6 ------ modules/oracle-xe/build.gradle | 6 ------ modules/orientdb/build.gradle | 6 ------ modules/postgresql/build.gradle | 6 ------ modules/pulsar/build.gradle | 6 ------ modules/rabbitmq/build.gradle | 6 ------ modules/solr/build.gradle | 6 ------ modules/toxiproxy/build.gradle | 6 ------ 21 files changed, 2 insertions(+), 150 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index c967de76bfd..a31a828d8e6 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -47,36 +47,9 @@ tasks.japicmp { "org.testcontainers.shaded.*", ] - classExcludes = [ - "org.testcontainers.utility.RyukResourceReaper", - "org.testcontainers.containers.FailureDetectingExternalResource", - "org.testcontainers.containers.ComposeContainer", - "org.testcontainers.containers.DockerComposeContainer", - "org.testcontainers.containers.GenericContainer" - ] + classExcludes = [] - methodExcludes = [ - "org.testcontainers.containers.Container#getDockerClient()", - "org.testcontainers.containers.ContainerState#getDockerClient()", - "org.testcontainers.containers.ContainerState#execInContainer(org.testcontainers.containers.ExecConfig)", - "org.testcontainers.containers.ContainerState#execInContainer(java.nio.charset.Charset,org.testcontainers.containers.ExecConfig)", - "org.testcontainers.containers.ComposeContainer#apply(org.junit.runners.model.Statement, org.junit.runner.Description)", - "org.testcontainers.containers.ComposeContainer#failed(java.lang.Throwable, org.junit.runner.Description)", - "org.testcontainers.containers.ComposeContainer#finished(org.junit.runner.Description)", - "org.testcontainers.containers.ComposeContainer#starting(org.junit.runner.Description)", - "org.testcontainers.containers.ComposeContainer#succeeded(org.junit.runner.Description)", - "org.testcontainers.containers.DockerComposeContainer#apply(org.junit.runners.model.Statement, org.junit.runner.Description)", - "org.testcontainers.containers.DockerComposeContainer#failed(java.lang.Throwable, org.junit.runner.Description)", - "org.testcontainers.containers.DockerComposeContainer#finished(org.junit.runner.Description)", - "org.testcontainers.containers.DockerComposeContainer#starting(org.junit.runner.Description)", - "org.testcontainers.containers.DockerComposeContainer#succeeded(org.junit.runner.Description)", - "org.testcontainers.containers.GenericContainer#apply(org.junit.runners.model.Statement, org.junit.runner.Description)", - "org.testcontainers.containers.GenericContainer#failed(java.lang.Throwable, org.junit.runner.Description)", - "org.testcontainers.containers.GenericContainer#finished(org.junit.runner.Description)", - "org.testcontainers.containers.GenericContainer#starting(org.junit.runner.Description)", - "org.testcontainers.containers.GenericContainer#succeeded(org.junit.runner.Description)", - 'org.testcontainers.containers.Network$NetworkImpl#after()' - ] + methodExcludes = [] fieldExcludes = [] } diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 8b48153b4d7..6d7acda1515 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -7,9 +7,3 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.CockroachContainer" - ] -} diff --git a/modules/couchbase/build.gradle b/modules/couchbase/build.gradle index 4b34a540ac6..251aa918330 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -8,9 +8,3 @@ dependencies { testImplementation 'com.couchbase.client:java-client:3.9.1' testImplementation 'org.awaitility:awaitility:4.3.0' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.couchbase.CouchbaseContainer" - ] -} diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 2d938428d0c..a15081c9614 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -6,9 +6,3 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.Db2Container" - ] -} diff --git a/modules/elasticsearch/build.gradle b/modules/elasticsearch/build.gradle index 1bac3a94d8c..e1926d25028 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -6,9 +6,3 @@ dependencies { testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.4" testImplementation "org.elasticsearch.client:transport:7.17.29" } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.elasticsearch.ElasticsearchContainer" - ] -} diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index 958e1ceb101..53056f2f5bc 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -8,9 +8,3 @@ dependencies { testImplementation 'org.influxdb:influxdb-java:2.25' testImplementation "com.influxdb:influxdb-client-java:7.3.0" } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.InfluxDBContainer" - ] -} diff --git a/modules/localstack/build.gradle b/modules/localstack/build.gradle index 38ea6eabb68..5b76d4581ba 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -10,9 +10,3 @@ dependencies { testImplementation 'software.amazon.awssdk:lambda' testImplementation 'software.amazon.awssdk:kms' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.localstack.LocalStackContainer" - ] -} diff --git a/modules/mariadb/build.gradle b/modules/mariadb/build.gradle index 465b9555b4d..2cfef8d924c 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -12,9 +12,3 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.MariaDBContainer" - ] -} diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index bfd7a9261ac..aa06ec3af1e 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -6,9 +6,3 @@ dependencies { testImplementation 'org.mock-server:mockserver-client-java:5.15.0' testImplementation 'io.rest-assured:rest-assured:5.5.6' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.MockServerContainer" - ] -} diff --git a/modules/mongodb/build.gradle b/modules/mongodb/build.gradle index 729cf59aab1..8e9f1420ddf 100644 --- a/modules/mongodb/build.gradle +++ b/modules/mongodb/build.gradle @@ -5,9 +5,3 @@ dependencies { testImplementation("org.mongodb:mongodb-driver-sync:5.1.4") } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.MongoDBContainer" - ] -} diff --git a/modules/mssqlserver/build.gradle b/modules/mssqlserver/build.gradle index 992d64004e6..ca6fd1b66bb 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -15,9 +15,3 @@ dependencies { // MSSQL's wait strategy requires the JDBC driver testImplementation testFixtures(project(':testcontainers-r2dbc')) } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.MSSQLServerContainer" - ] -} diff --git a/modules/mysql/build.gradle b/modules/mysql/build.gradle index b387b05cb2f..1ec899c424e 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -14,9 +14,3 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2-1' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.MySQLContainer" - ] -} diff --git a/modules/neo4j/build.gradle b/modules/neo4j/build.gradle index 3a013391742..b8bc956b825 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -35,10 +35,3 @@ dependencies { testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.21' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.Neo4jContainer", - "org.testcontainers.containers.Neo4jLabsPlugin" - ] -} diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index 732cee22faf..13bd94d88d2 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -4,9 +4,3 @@ dependencies { api project(':testcontainers') compileOnly 'org.jetbrains:annotations:26.0.2-1' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.NginxContainer" - ] -} diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index f8a7b1f07db..0f2e76b29b1 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -14,9 +14,3 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.OracleContainer" - ] -} diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 2de0c86dee4..e815c9ff111 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -8,9 +8,3 @@ dependencies { testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.44" } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.OrientDBContainer" - ] -} diff --git a/modules/postgresql/build.gradle b/modules/postgresql/build.gradle index 3a04623e1ce..cf1c69a9a19 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -14,9 +14,3 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2-1' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.PostgreSQLContainer" - ] -} diff --git a/modules/pulsar/build.gradle b/modules/pulsar/build.gradle index 106b578dfef..eb8053cc71b 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -7,9 +7,3 @@ dependencies { testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.PulsarContainer" - ] -} diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index f1d273b75bb..f83ca738d0b 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -6,9 +6,3 @@ dependencies { testImplementation 'com.rabbitmq:amqp-client:5.26.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.RabbitMQContainer" - ] -} diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index c4966152fba..8340de66f2c 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -7,9 +7,3 @@ dependencies { testImplementation 'org.apache.solr:solr-solrj:8.11.4' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.SolrContainer" - ] -} diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 8de52580b78..d6480227889 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -6,9 +6,3 @@ dependencies { testImplementation 'redis.clients:jedis:6.2.0' } - -tasks.japicmp { - classExcludes = [ - "org.testcontainers.containers.ToxiproxyContainer" - ] -} From 6b060c7990a4bafeea85fac7bf1176a17a9ac3f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 3 Nov 2025 17:49:10 +0000 Subject: [PATCH 0959/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-xe Bumps com.oracle.database.jdbc:ojdbc11 from 23.9.0.25.07 to 23.26.0.0.0. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.26.0.0.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index 0f2e76b29b1..6faeeb9367e 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.9.0.25.07' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' From ab254863e363799c931d4f0fefbfae52801085b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 12 Nov 2025 14:32:21 -0600 Subject: [PATCH 0960/1224] Fix ollama example (#11217) --- .../example/ollamahf/OllamaHuggingFaceContainer.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/examples/ollama-hugging-face/src/test/java/com/example/ollamahf/OllamaHuggingFaceContainer.java b/examples/ollama-hugging-face/src/test/java/com/example/ollamahf/OllamaHuggingFaceContainer.java index 55fd110fa13..58267134a5f 100644 --- a/examples/ollama-hugging-face/src/test/java/com/example/ollamahf/OllamaHuggingFaceContainer.java +++ b/examples/ollama-hugging-face/src/test/java/com/example/ollamahf/OllamaHuggingFaceContainer.java @@ -28,14 +28,7 @@ protected void containerIsStarted(InspectContainerResponse containerInfo, boolea executeCommand("apt-get", "upgrade", "-y"); executeCommand("apt-get", "install", "-y", "python3-pip"); executeCommand("pip", "install", "huggingface-hub"); - executeCommand( - "huggingface-cli", - "download", - huggingFaceModel.repository, - huggingFaceModel.model, - "--local-dir", - "." - ); + executeCommand("hf", "download", huggingFaceModel.repository, huggingFaceModel.model, "--local-dir", "."); executeCommand("sh", "-c", String.format("echo '%s' > Modelfile", huggingFaceModel.modelfileContent)); executeCommand("ollama", "create", huggingFaceModel.model, "-f", "Modelfile"); executeCommand("rm", huggingFaceModel.model); @@ -48,7 +41,7 @@ private void executeCommand(String... command) throws ContainerLaunchException, ExecResult execResult = execInContainer(command); if (execResult.getExitCode() > 0) { throw new ContainerLaunchException( - "Failed to execute " + String.join(" ", command) + ": " + execResult.getStderr() + "Failed to execute " + String.join(" ", command) + ": " + execResult.getStdout() ); } } From 58119ed04d53efc1e5af84700320731eae574917 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 12 Nov 2025 14:55:17 -0600 Subject: [PATCH 0961/1224] Set default docker API version to 1.44 (#11216) Fixes #11212 --- .../dockerclient/DockerClientProviderStrategy.java | 2 +- .../testcontainers/junit/ComposeContainerWithBuildTest.java | 3 ++- .../junit/DockerComposeContainerWithBuildTest.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java index 33f59c78ddb..e16beeb6614 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java @@ -404,7 +404,7 @@ public static DockerClient getClientForConfig(TransportConfig transportConfig) { DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder(); if (configBuilder.build().getApiVersion() == RemoteApiVersion.UNKNOWN_VERSION) { - configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_32); + configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_44); } Map headers = new HashMap<>(); headers.put("x-tc-sid", DockerClientFactory.SESSION_ID); diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java index 03ced374f70..454dae985be 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java @@ -10,6 +10,7 @@ import org.testcontainers.utility.DockerImageName; import java.io.File; +import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; @@ -97,7 +98,7 @@ private boolean isImagePresent(final String imageName) { .instance() .client() .listImagesCmd() - .withImageNameFilter(imageName) + .withFilter("reference", Collections.singletonList(imageName)) .exec() .stream() .findFirst() diff --git a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java index 4c3c69e8d76..f0cbe11cbb9 100644 --- a/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/DockerComposeContainerWithBuildTest.java @@ -10,6 +10,7 @@ import org.testcontainers.utility.DockerImageName; import java.io.File; +import java.util.Collections; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; @@ -102,7 +103,7 @@ private boolean isImagePresent(final String imageName) { .instance() .client() .listImagesCmd() - .withImageNameFilter(imageName) + .withFilter("reference", Collections.singletonList(imageName)) .exec() .stream() .findFirst() From f3e4cd594f255ddbbc0668655dfe4bf318b1ae4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 12 Nov 2025 21:42:38 -0600 Subject: [PATCH 0962/1224] Update docker-java version to 3.7.0 (#11218) --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index a31a828d8e6..da9ec1f2a44 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -80,8 +80,8 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - api platform('com.github.docker-java:docker-java-bom:3.6.0') - shaded platform('com.github.docker-java:docker-java-bom:3.6.0') + api platform('com.github.docker-java:docker-java-bom:3.7.0') + shaded platform('com.github.docker-java:docker-java-bom:3.7.0') api "com.github.docker-java:docker-java-api" From a434e357a27238fc043b5891f07c49ae4a5cb588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 13 Nov 2025 09:17:42 -0600 Subject: [PATCH 0963/1224] Set version to moby-latest workflow --- .github/workflows/moby-latest.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index b6af77feb2a..c948de0c70c 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -14,9 +14,9 @@ jobs: strategy: matrix: include: - - { install-docker-type: "STABLE", channel: stable, rootless: false } - - { install-docker-type: "ROOTLESS", channel: stable, rootless: true } - - { install-docker-type: "ROOTFUL", channel: test, rootless: false } + - { install-docker-type: "STABLE", version: latest, channel: stable, rootless: false } + - { install-docker-type: "ROOTLESS", version: latest, channel: stable, rootless: true } + - { install-docker-type: "ROOTFUL", version: edge, channel: test, rootless: false } name: "Core tests using Docker ${{ matrix.install-docker-type }} (channel ${{ matrix.channel }})" runs-on: ubuntu-22.04 continue-on-error: true @@ -28,6 +28,7 @@ jobs: id: setup_docker uses: docker/setup-docker-action@v4 with: + version: ${{ matrix.version }} channel: ${{ matrix.channel }} rootless: ${{ matrix.rootless }} From 9dcf4f0910b868565637fae29ecff0026a2700a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 13 Nov 2025 10:36:50 -0600 Subject: [PATCH 0964/1224] Add docker version input in moby-latest workflow --- .github/workflows/moby-latest.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index c948de0c70c..aa6a8afa809 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -2,6 +2,12 @@ name: Tests against recent Docker engine releases on: workflow_dispatch: + inputs: + version: + description: 'Docker version' + required: false + default: 'latest' + type: string schedule: # nightly build, at 23:59 CEST - cron: '59 23 * * *' @@ -14,8 +20,8 @@ jobs: strategy: matrix: include: - - { install-docker-type: "STABLE", version: latest, channel: stable, rootless: false } - - { install-docker-type: "ROOTLESS", version: latest, channel: stable, rootless: true } + - { install-docker-type: "STABLE", version: "${{ inputs.version }}", channel: stable, rootless: false } + - { install-docker-type: "ROOTLESS", version: "${{ inputs.version }}", channel: stable, rootless: true } - { install-docker-type: "ROOTFUL", version: edge, channel: test, rootless: false } name: "Core tests using Docker ${{ matrix.install-docker-type }} (channel ${{ matrix.channel }})" runs-on: ubuntu-22.04 From 623ea96b36ba0eed442f41e1de58bcb37f7cd3e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 13 Nov 2025 11:44:41 -0600 Subject: [PATCH 0965/1224] Update docker image version to 25.0.5 (#11219) --- .../ComposeContainerWithServicesTest.java | 18 +++++++++--------- .../junit/ComposeContainerOverrideTest.java | 4 ++-- .../junit/ComposeContainerPortViaEnvTest.java | 2 +- .../junit/ComposeContainerScalingTest.java | 2 +- .../junit/ComposeContainerTest.java | 4 ++-- .../ComposeContainerVolumeRemovalTest.java | 2 +- .../junit/ComposeContainerWithBuildTest.java | 2 +- .../ComposeContainerWithCopyFilesTest.java | 8 ++++---- .../ComposeContainerWithWaitStrategies.java | 4 ++-- .../junit/ComposeErrorHandlingTest.java | 2 +- .../junit/ComposePassthroughTest.java | 2 +- .../junit/ComposeWaitStrategyTest.java | 2 +- .../junit/ComposeWithIdentifierTest.java | 2 +- .../junit/ComposeWithNetworkTest.java | 2 +- .../spock/ComposeContainerIT.groovy | 2 +- .../spock/SharedComposeContainerIT.groovy | 2 +- 16 files changed, 30 insertions(+), 30 deletions(-) diff --git a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java index 8b3b3fa8fa5..0e921316bf3 100644 --- a/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java +++ b/core/src/test/java/org/testcontainers/containers/ComposeContainerWithServicesTest.java @@ -31,7 +31,7 @@ class ComposeContainerWithServicesTest { @Test void testDesiredSubsetOfServicesAreStarted() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), SIMPLE_COMPOSE_FILE) .withServices("redis") ) { compose.start(); @@ -43,7 +43,7 @@ void testDesiredSubsetOfServicesAreStarted() { @Test void testDesiredSubsetOfScaledServicesAreStarted() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), SIMPLE_COMPOSE_FILE) .withScaledService("redis", 2) ) { compose.start(); @@ -55,7 +55,7 @@ void testDesiredSubsetOfScaledServicesAreStarted() { @Test void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), SIMPLE_COMPOSE_FILE) .withServices("redis") .withScaledService("redis", 2) ) { @@ -68,7 +68,7 @@ void testDesiredSubsetOfSpecifiedAndScaledServicesAreStarted() { @Test void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), SIMPLE_COMPOSE_FILE) .withServices("other") .withScaledService("redis", 2) ) { @@ -81,7 +81,7 @@ void testDesiredSubsetOfSpecifiedOrScaledServicesAreStarted() { @Test void testAllServicesAreStartedIfNotSpecified() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), SIMPLE_COMPOSE_FILE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), SIMPLE_COMPOSE_FILE) ) { compose.start(); @@ -93,7 +93,7 @@ void testAllServicesAreStartedIfNotSpecified() { void testScaleInComposeFileIsRespected() { try ( ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), COMPOSE_FILE_WITH_INLINE_SCALE ) ) { @@ -110,7 +110,7 @@ void testStartupTimeoutSetsTheHighestTimeout() { catchThrowable(() -> { try ( ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), SIMPLE_COMPOSE_FILE ) .withServices("redis") @@ -133,7 +133,7 @@ void testStartupTimeoutSetsTheHighestTimeout() { void testWaitingForHealthcheck() { try ( ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), COMPOSE_FILE_WITH_HEALTHCHECK ) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(2))) @@ -148,7 +148,7 @@ void testWaitingForHealthcheck() { void testWaitingForHealthcheckWithRestartDoesNotCrash() { try ( ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), COMPOSE_FILE_WITH_HEALTHCHECK ) .waitingFor("redis", Wait.forHealthcheck().withStartupTimeout(Duration.ofMinutes(1))) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java index 028d883b320..bf38af0f929 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java @@ -19,7 +19,7 @@ class ComposeContainerOverrideTest { @Test void readEnvironment() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), BASE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), BASE) .withExposedService("redis", 6379) ) { compose.start(); @@ -34,7 +34,7 @@ void readEnvironment() { @Test void resetEnvironment() { try ( - ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), BASE, OVERRIDE) + ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), BASE, OVERRIDE) .withExposedService("redis", 6379) ) { compose.start(); diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java index b45db1a4f8a..f0a8873f8f3 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerPortViaEnvTest.java @@ -10,7 +10,7 @@ class ComposeContainerPortViaEnvTest extends BaseComposeTest { @AutoClose public ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/v2-compose-test-port-via-env.yml") ) .withExposedService("redis-1", REDIS_PORT) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java index 50c6ef062ef..3ef559bcda3 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerScalingTest.java @@ -27,7 +27,7 @@ public static void checkVersion() { @AutoClose public ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/composev2/scaled-compose-test.yml") ) .withScaledService("redis", 3) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java index 9e68c7513df..9f3299ab441 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerTest.java @@ -18,7 +18,7 @@ class ComposeContainerTest extends BaseComposeTest { // composeContainerConstructor { public ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/composev2/compose-test.yml") ) .withExposedService("redis-1", REDIS_PORT) @@ -88,7 +88,7 @@ void shouldCreateContainerWhenFileNotPrefixedWithPath() throws IOException { Files.write(filePathNotStartWithDotSlash.toPath(), validYaml.getBytes(StandardCharsets.UTF_8)); final ComposeContainer dockerComposeContainer = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), filePathNotStartWithDotSlash ); assertThat(dockerComposeContainer).as("Container created using docker compose file").isNotNull(); diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java index cebfc2a9706..d194204078f 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerVolumeRemovalTest.java @@ -29,7 +29,7 @@ void performTest(boolean removeVolumes, boolean shouldVolumesBePresentAfterRunni final AtomicReference volumeName = new AtomicReference<>(""); try ( - ComposeContainer environment = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), composeFile) + ComposeContainer environment = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), composeFile) .withExposedService("redis", 6379) .withRemoveVolumes(removeVolumes) .withRemoveImages(ComposeContainer.RemoveImages.ALL) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java index 454dae985be..714767914a0 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithBuildTest.java @@ -39,7 +39,7 @@ void performTest( final AtomicReference builtImageName = new AtomicReference<>(""); final AtomicReference pulledImageName = new AtomicReference<>(""); try ( - ComposeContainer environment = new ComposeContainer(DockerImageName.parse("docker:24.0.2"), composeFile) + ComposeContainer environment = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), composeFile) .withExposedService("customredis", 6379) .withBuild(true) .withRemoveImages(removeMode) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java index cc9c2dad594..3568550ca38 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithCopyFilesTest.java @@ -18,7 +18,7 @@ class ComposeContainerWithCopyFilesTest { void testShouldCopyAllFilesByDefault() throws IOException { try ( ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/compose-file-copy-inclusions/compose.yml") ) .withExposedService("app", 8080) @@ -34,7 +34,7 @@ void testShouldCopyAllFilesByDefault() throws IOException { void testWithFileCopyInclusionUsingFilePath() throws IOException { try ( ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/compose-file-copy-inclusions/compose-root-only.yml") ) .withExposedService("app", 8080) @@ -54,7 +54,7 @@ void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { try ( // composeContainerWithCopyFiles { ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") ) .withExposedService("app", 8080) @@ -73,7 +73,7 @@ void testWithFileCopyInclusionUsingDirectoryPath() throws IOException { void testShouldNotBeAbleToStartIfNeededEnvFileIsNotCopied() { try ( ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/compose-file-copy-inclusions/compose-test-only.yml") ) .withExposedService("app", 8080) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java index 07ce8e41ef1..3330b302ed3 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java @@ -19,7 +19,7 @@ void testComposeContainerConstructor() { try ( // composeContainerWithCombinedWaitStrategies { ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/composev2/compose-test.yml") ) .withExposedService("redis-1", REDIS_PORT, Wait.forSuccessfulCommand("redis-cli ping")) @@ -36,7 +36,7 @@ void testComposeContainerWaitForPortWithTimeout() { try ( // composeContainerWaitForPortWithTimeout { ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/composev2/compose-test.yml") ) .withExposedService( diff --git a/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java b/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java index acabcaf9e87..df4338ec236 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeErrorHandlingTest.java @@ -16,7 +16,7 @@ void simpleTest() { assertThat( catchThrowable(() -> { ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/invalid-compose.yml") ) .withExposedService("something", 123); diff --git a/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java b/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java index 7bc47d79c9d..38d0139c1cc 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposePassthroughTest.java @@ -27,7 +27,7 @@ public static void checkVersion() { @AutoClose public ComposeContainer compose = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/v2-compose-test-passthrough.yml") ) .withEnv("foo", "bar") diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java index 2bec1aec819..371c70dafac 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWaitStrategyTest.java @@ -26,7 +26,7 @@ class ComposeWaitStrategyTest { public final void setUp() { environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/composev2/compose-test.yml") ); } diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java index c02b9874126..0a5c0b868c8 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWithIdentifierTest.java @@ -10,7 +10,7 @@ class ComposeWithIdentifierTest extends BaseComposeTest { @AutoClose public ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), "TEST", new File("src/test/resources/v2-compose-test.yml") ) diff --git a/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java b/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java index 1003c3d5404..9fdf55a83a1 100644 --- a/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java +++ b/core/src/test/java/org/testcontainers/junit/ComposeWithNetworkTest.java @@ -10,7 +10,7 @@ class ComposeWithNetworkTest extends BaseComposeTest { @AutoClose public ComposeContainer environment = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/v2-compose-test-with-network.yml") ) .withExposedService("redis-1", REDIS_PORT); diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy index a190f1ea3b6..89de5aed88d 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy @@ -11,7 +11,7 @@ import spock.lang.Specification class ComposeContainerIT extends Specification { ComposeContainer composeContainer = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/docker-compose.yml")) .withExposedService("whoami-1", 80, Wait.forHttp("/")) diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy index 020005f923f..dc71687011f 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy @@ -13,7 +13,7 @@ class SharedComposeContainerIT extends Specification { @Shared ComposeContainer composeContainer = new ComposeContainer( - DockerImageName.parse("docker:24.0.2"), + DockerImageName.parse("docker:25.0.5"), new File("src/test/resources/docker-compose.yml")) .withExposedService("whoami-1", 80, Wait.forHttp("/")) From c331fe6e2696d4d53a97ce044c176bfc03e3944b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:47:01 -0600 Subject: [PATCH 0966/1224] [create-pull-request] automated change (#11221) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 60e224f9dfa..04842f28fcd 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -140,4 +140,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 2.0.1 + latest_version: 2.0.2 From a3a44ddb0bf0d07a036c6fabb028fe3964f3599f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:47:21 -0600 Subject: [PATCH 0967/1224] [create-pull-request] automated change (#11220) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index ce0f80d957e..ec5fc8fddec 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=2.0.1 +testcontainers.version=2.0.2 From 01aad116fc25a96bcb10606cab1ded6c8fb0b286 Mon Sep 17 00:00:00 2001 From: Jack Green Date: Thu, 13 Nov 2025 22:48:16 +0000 Subject: [PATCH 0968/1224] Fix GitHub-Action Generate PR descriptions (#11129) When `update-docs-version` ran, it created this PR - https://github.com/testcontainers/testcontainers-java/pull/11110: > Update docs version to ${GITHUB_REF##*/} Update docs version to ${GITHUB_REF##*/} The branch name was not expanded in the PR description, it uses Bash syntax not applicable outside of a `run` block Fixed by replacing Bash expansion to derive the branch name with the _actual_ branch name. --- .github/workflows/update-docs-version.yml | 6 +++--- .github/workflows/update-testcontainers-version.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index 5bbf47c3484..6e9981b19ac 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -20,14 +20,14 @@ jobs: ref: main - name: Update latest_version property in mkdocs.yml run: | - sed -i "s/latest_version: .*/latest_version: ${GITHUB_REF##*/}/g" mkdocs.yml + sed -i "s/latest_version: .*/latest_version: ${GITHUB_REF_NAME}/g" mkdocs.yml git diff - name: Create Pull Request uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v3.10.1 with: - title: Update docs version to ${GITHUB_REF##*/} + title: Update docs version to ${{ github.ref_name }} body: | - Update docs version to ${GITHUB_REF##*/} + Update docs version to ${{ github.ref_name }} skip-checks: true branch: update-docs-version delete-branch: true diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index 90d249c7d3f..9cf679e8952 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -20,13 +20,13 @@ jobs: ref: main - name: Update testcontainers.version property in gradle.properties run: | - sed -i "s/^testcontainers\.version=.*/testcontainers\.version=${GITHUB_REF##*/}/g" gradle.properties + sed -i "s/^testcontainers\.version=.*/testcontainers\.version=${GITHUB_REF_NAME}/g" gradle.properties git diff - name: Create Pull Request uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v3.10.1 with: - title: Update testcontainers version to ${GITHUB_REF##*/} + title: Update testcontainers version to ${{ github.ref_name }} body: | - Update testcontainers version to ${GITHUB_REF##*/} + Update testcontainers version to ${{ github.ref_name }} branch: update-tc-version delete-branch: true From 2b53c476a249b58e7f7d827f20dcdb7e6fdf4d0e Mon Sep 17 00:00:00 2001 From: John William Vicente <58832150+JohnWill14@users.noreply.github.com> Date: Thu, 13 Nov 2025 19:49:32 -0300 Subject: [PATCH 0969/1224] Dead links in CircleCI reference documentation (#10789) --- .../continuous_integration/circle_ci.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/supported_docker_environment/continuous_integration/circle_ci.md b/docs/supported_docker_environment/continuous_integration/circle_ci.md index d6e85a62a79..936192cc799 100644 --- a/docs/supported_docker_environment/continuous_integration/circle_ci.md +++ b/docs/supported_docker_environment/continuous_integration/circle_ci.md @@ -1,7 +1,7 @@ # CircleCI (Cloud, Server v2.x, and Server v3.x) Your CircleCI configuration should use a dedicated VM for Testcontainers to work. You can achieve this by specifying the -executor type in your `.circleci/config.yml` to be `machine` instead of the default `docker` executor (see [Choosing an Executor Type](https://circleci.com/docs/2.0/executor-types/) for more info). +executor type in your `.circleci/config.yml` to be `machine` instead of the default `docker` executor (see [Choosing an Executor Type](https://circleci.com/docs/executor-intro) for more info). Here is a sample CircleCI configuration that does a checkout of a project and runs Maven: From bf039b0019bfdc35834ee931adced6e8ae580e91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 01:23:56 +0000 Subject: [PATCH 0970/1224] Bump com.clickhouse:clickhouse-jdbc in /modules/clickhouse Bumps [com.clickhouse:clickhouse-jdbc](https://github.com/ClickHouse/clickhouse-java) from 0.9.2 to 0.9.4. - [Release notes](https://github.com/ClickHouse/clickhouse-java/releases) - [Changelog](https://github.com/ClickHouse/clickhouse-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/ClickHouse/clickhouse-java/compare/v0.9.2...v0.9.4) --- updated-dependencies: - dependency-name: com.clickhouse:clickhouse-jdbc dependency-version: 0.9.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/clickhouse/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 1579ea834ce..91d80a687d7 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -5,12 +5,12 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.2', classifier: 'http') + compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.4', classifier: 'http') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.2', classifier: 'all') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.4', classifier: 'all') - testImplementation 'com.clickhouse:client-v2:0.9.2' + testImplementation 'com.clickhouse:client-v2:0.9.4' testImplementation testFixtures(project(':testcontainers-r2dbc')) - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.2', classifier: 'http') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.4', classifier: 'http') } From 3429129c4aabacd49bd9bb0fcd056df0aeb45319 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:02:12 +0000 Subject: [PATCH 0971/1224] Bump org.apache.commons:commons-lang3 in /modules/jdbc-test Bumps org.apache.commons:commons-lang3 from 3.19.0 to 3.20.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 a6759030313..907f0760540 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -2,7 +2,7 @@ dependencies { api project(':testcontainers-jdbc') api 'com.google.guava:guava:33.5.0-jre' - api 'org.apache.commons:commons-lang3:3.19.0' + api 'org.apache.commons:commons-lang3:3.20.0' api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' From bbd1bb0dbfcf1c2e3aae210ce47d13d566f76fca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:02:25 +0000 Subject: [PATCH 0972/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 11.0.11 to 11.0.14. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 958734d33e1..f34c99c0385 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2-1' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.11' + testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.14' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From b7602dbaeaa8a02ecc080e3c9680f486d1d6611b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:02:30 +0000 Subject: [PATCH 0973/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 11.0.11 to 11.0.14. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.14 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 a6759030313..a8940c591f9 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.6' - api 'org.apache.tomcat:tomcat-jdbc:11.0.11' + api 'org.apache.tomcat:tomcat-jdbc:11.0.14' api 'org.vibur:vibur-dbcp:26.0' api 'com.mysql:mysql-connector-j:8.2.0' api 'org.junit.jupiter:junit-jupiter:5.13.4' From 2cb913cf7047e08671ace70c0d4880e0aa4fb35b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 02:04:57 +0000 Subject: [PATCH 0974/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/azure Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.2.0.jre8 to 13.3.0.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.3.0.jre8-preview dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 517a981b707..e68cadf8b6e 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -13,5 +13,5 @@ dependencies { testImplementation 'com.azure:azure-data-tables' testImplementation 'com.azure:azure-messaging-eventhubs' testImplementation 'com.azure:azure-messaging-servicebus' - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.3.0.jre8-preview' } From 5f96a1b91532af039b118b496d27e6958d48c6f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 2 Dec 2025 22:05:53 +0100 Subject: [PATCH 0975/1224] Exclude JUnit 6 via dependabot --- .github/dependabot.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 72a6d9110b6..01674d35061 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -18,6 +18,10 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "com.fasterxml.jackson.datatype:jackson-datatype-jsr310" update-types: [ "version-update:semver-minor", "version-update:semver-patch" ] + - dependency-name: "org.junit.jupiter:junit-jupiter" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit.platform:junit-platform-launcher" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/" allow: @@ -30,6 +34,10 @@ updates: ignore: - dependency-name: "com.gradleup.shadow" update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit.jupiter:junit-jupiter" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit.platform:junit-platform-launcher" + update-types: [ "version-update:semver-major" ] # Explicit entry for each module - package-ecosystem: "gradle" @@ -347,6 +355,9 @@ updates: directory: "/modules/spock" schedule: interval: "monthly" + ignore: + - dependency-name: "org.junit:junit-bom" + update-types: [ "version-update:semver-major" ] open-pull-requests-limit: 10 - package-ecosystem: "gradle" directory: "/modules/tidb" @@ -412,6 +423,10 @@ updates: update-types: [ "version-update:semver-major", "version-update:semver-minor" ] - dependency-name: "com.hazelcast:hazelcast" update-types: [ "version-update:semver-minor" ] + - dependency-name: "org.junit.jupiter:junit-jupiter" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit.platform:junit-platform-launcher" + update-types: [ "version-update:semver-major" ] # Smoke test - package-ecosystem: "gradle" @@ -424,6 +439,10 @@ updates: update-types: [ "version-update:semver-minor" ] - dependency-name: "com.diffplug.spotless" update-types: [ "version-update:semver-major", "version-update:semver-minor" ] + - dependency-name: "org.junit.jupiter:junit-jupiter" + update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit.platform:junit-platform-launcher" + update-types: [ "version-update:semver-major" ] # GitHub Actions - package-ecosystem: "github-actions" From 3b788ccd2f2c36abc363e7f18888f03991efe32d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Dec 2025 21:10:54 +0000 Subject: [PATCH 0976/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.2.0.jre8 to 13.3.0.jre8-preview. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.3.0.jre8-preview dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 ca6fd1b66bb..6561dbbe486 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.2.0.jre8' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.3.0.jre8-preview' testImplementation project(':testcontainers-r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' From bb80763782060a48bf4b2c44b815c6763e267094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 2 Dec 2025 22:16:11 +0100 Subject: [PATCH 0977/1224] Revert "Skip databend module in CI (#10793)" This reverts commit 15f3c0da97deef1e08593fa40a906873faebd84a. --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aa2946ea657..8d7f5f65a27 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -98,7 +98,7 @@ jobs: # we should not push empty results to the cache READ_ONLY_REMOTE_GRADLE_CACHE: true run: | - TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'del(.[] | select(. == ":testcontainers-databend:check" or . == ":testcontainers:check" or startswith(":docs:")))' --compact-output) + TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'del(.[] | select(. == ":testcontainers:check" or startswith(":docs:")))' --compact-output) echo $TASKS echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT check: From e1e150ba255ab10cce776591c2d8e57589f85d4a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 2 Dec 2025 23:06:46 +0100 Subject: [PATCH 0978/1224] Exclude com.gradleup.shadow via dependabot --- .github/dependabot.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 01674d35061..1e89c9cb9e3 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -38,6 +38,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.junit.platform:junit-platform-launcher" update-types: [ "version-update:semver-major" ] + - dependency-name: "com.gradleup.shadow" + update-types: [ "version-update:semver-major" ] # Explicit entry for each module - package-ecosystem: "gradle" @@ -427,6 +429,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.junit.platform:junit-platform-launcher" update-types: [ "version-update:semver-major" ] + - dependency-name: "com.gradleup.shadow" + update-types: [ "version-update:semver-major" ] # Smoke test - package-ecosystem: "gradle" @@ -443,6 +447,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.junit.platform:junit-platform-launcher" update-types: [ "version-update:semver-major" ] + - dependency-name: "com.gradleup.shadow" + update-types: [ "version-update:semver-major" ] # GitHub Actions - package-ecosystem: "github-actions" From 786877eac4e5006251248f0a984c16e5ec89dba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 2 Dec 2025 23:16:48 +0100 Subject: [PATCH 0979/1224] Exclude JUnit 6 via dependabot --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1e89c9cb9e3..2d5826c160a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -153,6 +153,8 @@ updates: ignore: - dependency-name: "org.apache.tomcat:tomcat-jdbc" update-types: [ "version-update:semver-minor" ] + - dependency-name: "org.junit.jupiter:junit-jupiter" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/junit-jupiter" schedule: From 7d25a3118360271966ab0f378f5039aa1d9da723 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 3 Dec 2025 15:56:10 +0100 Subject: [PATCH 0980/1224] Fix dependabot --- .github/dependabot.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 2d5826c160a..1a71f6e1cb6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -38,8 +38,6 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.junit.platform:junit-platform-launcher" update-types: [ "version-update:semver-major" ] - - dependency-name: "com.gradleup.shadow" - update-types: [ "version-update:semver-major" ] # Explicit entry for each module - package-ecosystem: "gradle" From fa9c69a742305a02f839c3aee3c5b2ca54ea1442 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:50:30 +0000 Subject: [PATCH 0981/1224] Bump com.databend:databend-jdbc from 0.4.0 to 0.4.1 in /modules/databend Bumps [com.databend:databend-jdbc](https://github.com/databendcloud/databend-jdbc) from 0.4.0 to 0.4.1. - [Release notes](https://github.com/databendcloud/databend-jdbc/releases) - [Commits](https://github.com/databendcloud/databend-jdbc/compare/v0.4.0...v0.4.1) --- updated-dependencies: - dependency-name: com.databend:databend-jdbc dependency-version: 0.4.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index d9a5655b4ed..9da45a6fab9 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.databend:databend-jdbc:0.4.0' + testRuntimeOnly 'com.databend:databend-jdbc:0.4.1' } From 15b9397a1eb0d72c48d43540afb94ec2f600a7c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 4 Dec 2025 15:06:57 -0600 Subject: [PATCH 0982/1224] Exclude JUnit 6 via dependabot --- .github/dependabot.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 1a71f6e1cb6..5e1b5000846 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -161,6 +161,8 @@ updates: ignore: - dependency-name: "org.mockito:mockito-core" update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit:junit-bom" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/k3s" schedule: @@ -314,6 +316,8 @@ updates: ignore: - dependency-name: "io.r2dbc:r2dbc-spi" update-types: [ "version-update:semver-major", "version-update:semver-minor" ] + - dependency-name: "org.junit.jupiter:junit-jupiter" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/rabbitmq" schedule: From 6385e83974b958c0a380130192e0cbf414711f8b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 21:12:01 +0000 Subject: [PATCH 0983/1224] Bump org.junit.jupiter:junit-jupiter in /modules/r2dbc Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.4 to 5.14.1. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.4...r5.14.1) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.14.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 1e777a82d55..ecf02924009 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -13,5 +13,5 @@ dependencies { testFixturesImplementation 'io.projectreactor:reactor-core:3.7.11' testFixturesImplementation 'org.assertj:assertj-core:3.27.6' - testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' + testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.1' } From a8042ffdc9c6058b6f3a698216274077a29abbbb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 00:52:55 +0000 Subject: [PATCH 0984/1224] Bump com.mysql:mysql-connector-j from 8.2.0 to 9.5.0 in /modules/tidb Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 9.5.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...9.5.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/tidb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 66298ac6635..264d00fc883 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 57663e027b92816fcdf2c27c271eea80348136c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 01:13:58 +0000 Subject: [PATCH 0985/1224] Bump com.squareup.okhttp3:okhttp from 5.1.0 to 5.3.2 in /modules/azure Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 5.1.0 to 5.3.2. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-5.1.0...parent-5.3.2) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.3.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index e68cadf8b6e..681a6dc47e6 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':testcontainers-mssqlserver') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:5.1.0' + shaded 'com.squareup.okhttp3:okhttp:5.3.2' testImplementation platform("com.azure:azure-sdk-bom:1.2.32") testImplementation 'com.azure:azure-cosmos' From 744538daa0a8dfe532a6fac02075282988715c5f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:11:02 +0000 Subject: [PATCH 0986/1224] Bump org.junit.jupiter:junit-jupiter in /modules/jdbc-test Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.13.4 to 5.14.1. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.4...r5.14.1) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.14.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 5f4e0baafbd..f7b081acf7b 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -11,5 +11,5 @@ dependencies { api 'org.apache.tomcat:tomcat-jdbc:11.0.14' api 'org.vibur:vibur-dbcp:26.0' api 'com.mysql:mysql-connector-j:9.5.0' - api 'org.junit.jupiter:junit-jupiter:5.13.4' + api 'org.junit.jupiter:junit-jupiter:5.14.1' } From 978ae2c1447aaf710cc4d2ec7a8d4972bec1e8ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:17:11 +0000 Subject: [PATCH 0987/1224] Bump com.squareup.okhttp3:okhttp in /modules/couchbase Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 5.1.0 to 5.3.2. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-5.1.0...parent-5.3.2) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.3.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 251aa918330..e08696a654a 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Couchbase" dependencies { api project(':testcontainers') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:5.1.0' + shaded 'com.squareup.okhttp3:okhttp:5.3.2' testImplementation 'com.couchbase.client:java-client:3.9.1' testImplementation 'org.awaitility:awaitility:4.3.0' From 801393ba8a9787a3c3a32ed2ec4055b0659f4862 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:17:57 +0000 Subject: [PATCH 0988/1224] Bump org.apache.tinkerpop:gremlin-driver in /modules/orientdb Bumps [org.apache.tinkerpop:gremlin-driver](https://github.com/apache/tinkerpop) from 3.7.4 to 3.8.0. - [Changelog](https://github.com/apache/tinkerpop/blob/master/CHANGELOG.asciidoc) - [Commits](https://github.com/apache/tinkerpop/compare/3.7.4...3.8.0) --- updated-dependencies: - dependency-name: org.apache.tinkerpop:gremlin-driver dependency-version: 3.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index e815c9ff111..c9b492de2f9 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -5,6 +5,6 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.44" - testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' + testImplementation 'org.apache.tinkerpop:gremlin-driver:3.8.0' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.44" } From 7a362fd8f2731bc07810b10ac74bc048918f641d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:18:01 +0000 Subject: [PATCH 0989/1224] Bump com.orientechnologies:orientdb-gremlin in /modules/orientdb Bumps [com.orientechnologies:orientdb-gremlin](https://github.com/orientechnologies/orientdb-gremlin) from 3.2.44 to 3.2.46. - [Commits](https://github.com/orientechnologies/orientdb-gremlin/compare/3.2.44...3.2.46) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-gremlin dependency-version: 3.2.46 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index e815c9ff111..358acf05d96 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,8 +3,8 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.44" + api "com.orientechnologies:orientdb-client:3.2.46" testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.44" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.46" } From d9817d3f76c36d17454867561a6e352bdc5c0337 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:18:06 +0000 Subject: [PATCH 0990/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.44 to 3.2.46. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/3.2.46/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.44...3.2.46) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-version: 3.2.46 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index e815c9ff111..358acf05d96 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,8 +3,8 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.44" + api "com.orientechnologies:orientdb-client:3.2.46" testImplementation 'org.apache.tinkerpop:gremlin-driver:3.7.4' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.44" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.46" } From a236bee75a0d525a459692e335c425a24b18dd63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:18:16 +0000 Subject: [PATCH 0991/1224] Bump com.squareup.okhttp3:okhttp from 5.1.0 to 5.3.2 in /modules/solr Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 5.1.0 to 5.3.2. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-5.1.0...parent-5.3.2) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.3.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solr/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index 8340de66f2c..ca44d695421 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Solr" dependencies { api project(':testcontainers') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:5.1.0' + shaded 'com.squareup.okhttp3:okhttp:5.3.2' testImplementation 'org.apache.solr:solr-solrj:8.11.4' } From 2fb02e4e6d57495413158591d3fdee174bf31b51 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:19:28 +0000 Subject: [PATCH 0992/1224] Bump com.mysql:mysql-connector-j in /modules/oceanbase Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 9.5.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...9.5.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/oceanbase/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oceanbase/build.gradle b/modules/oceanbase/build.gradle index 5758598fb67..1fc1eb82e43 100644 --- a/modules/oceanbase/build.gradle +++ b/modules/oceanbase/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' } From b7b9ff2154d19e349edf968d76cb6ad1d47c2e5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:19:28 +0000 Subject: [PATCH 0993/1224] Bump com.mysql:mysql-connector-j from 8.2.0 to 9.5.0 in /modules/mysql Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 9.5.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...9.5.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 1ec899c424e..4a104559330 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' From d189c7b148fcf453a6b9ae08ad44cc415a77e8e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:19:42 +0000 Subject: [PATCH 0994/1224] Bump com.mysql:mysql-connector-j in /modules/junit-jupiter Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 9.5.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...9.5.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 01af88a3aab..a1df33fec98 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -15,5 +15,5 @@ dependencies { } testRuntimeOnly 'org.postgresql:postgresql:42.7.8' - testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' } From e5771040b6d27a91cf28403d82642956214b95d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 5 Dec 2025 17:20:17 +0000 Subject: [PATCH 0995/1224] Bump com.mysql:mysql-connector-j from 8.2.0 to 9.5.0 in /modules/spock Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 8.2.0 to 9.5.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.2.0...9.5.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.5.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 e2f1ce4554f..25ec090581c 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.8' - testRuntimeOnly 'com.mysql:mysql-connector-j:8.2.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' testRuntimeOnly platform('org.junit:junit-bom:5.13.4') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' From 0e64f6933e5bd7a44256d2bada0aef99a01cd1f8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:52:43 +0000 Subject: [PATCH 0996/1224] Bump redis.clients:jedis from 6.2.0 to 7.1.0 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.2.0 to 7.1.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.2.0...v7.1.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 a1df33fec98..9569f6f1d30 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.2' - testImplementation 'redis.clients:jedis:6.2.0' + testImplementation 'redis.clients:jedis:7.1.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From f3a28577cb9879173d1224a50db3764e44c7a933 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:52:45 +0000 Subject: [PATCH 0997/1224] Bump org.junit:junit-bom from 5.13.4 to 5.14.1 in /modules/junit-jupiter Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.13.4 to 5.14.1. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.4...r5.14.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.14.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 a1df33fec98..7439ecdae0a 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: JUnit Jupiter Extension" dependencies { api project(':testcontainers') - implementation platform('org.junit:junit-bom:5.13.4') + implementation platform('org.junit:junit-bom:5.14.1') implementation 'org.junit.jupiter:junit-jupiter-api' testImplementation project(':testcontainers-mysql') From 79d60e8f2cfebbf780b746bcf2c702e185390f2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:52:50 +0000 Subject: [PATCH 0998/1224] Bump org.junit:junit-bom from 5.13.4 to 5.14.1 in /modules/spock Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.13.4 to 5.14.1. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.13.4...r5.14.1) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.14.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 25ec090581c..53e945c8108 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -17,7 +17,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' - testRuntimeOnly platform('org.junit:junit-bom:5.13.4') + testRuntimeOnly platform('org.junit:junit-bom:5.14.1') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' From 38e52bd9e72b15729fdf4f7f04a64d622080e872 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 17:59:18 +0000 Subject: [PATCH 0999/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.9.1 to 3.10.0. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/3.9.1...3.10.0) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-version: 3.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 e08696a654a..a37998f75f0 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,6 +5,6 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.3.2' - testImplementation 'com.couchbase.client:java-client:3.9.1' + testImplementation 'com.couchbase.client:java-client:3.10.0' testImplementation 'org.awaitility:awaitility:4.3.0' } From f96c9d1e28da1e9a6bf85e71c7d3e24cff706edd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:33:46 +0000 Subject: [PATCH 1000/1224] Bump com.unboundid:unboundid-ldapsdk in /modules/ldap Bumps [com.unboundid:unboundid-ldapsdk](https://github.com/pingidentity/ldapsdk) from 7.0.3 to 7.0.4. - [Release notes](https://github.com/pingidentity/ldapsdk/releases) - [Changelog](https://github.com/pingidentity/ldapsdk/blob/master/docs/release-notes.html) - [Commits](https://github.com/pingidentity/ldapsdk/commits) --- updated-dependencies: - dependency-name: com.unboundid:unboundid-ldapsdk dependency-version: 7.0.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ldap/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ldap/build.gradle b/modules/ldap/build.gradle index 62f57581cf3..d357bb9996c 100644 --- a/modules/ldap/build.gradle +++ b/modules/ldap/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: LDAP" dependencies { api project(':testcontainers') - testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.3' + testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.4' } From 3c1fe2ae37abc366909b5cb6b470b885d798d1d7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:33:49 +0000 Subject: [PATCH 1001/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.34.8 to 2.40.1. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.40.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index 28e91cca882..efa12d591da 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(":testcontainers") testImplementation 'com.scylladb:java-driver-core:4.19.0.1' - testImplementation 'software.amazon.awssdk:dynamodb:2.34.8' + testImplementation 'software.amazon.awssdk:dynamodb:2.40.4' } From ccd2e418ae9238a2e18f44b2f6cb81a00096154d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:33:55 +0000 Subject: [PATCH 1002/1224] Bump software.amazon.awssdk:bom in /modules/localstack Bumps software.amazon.awssdk:bom from 2.35.0 to 2.40.1. --- updated-dependencies: - dependency-name: software.amazon.awssdk:bom dependency-version: 2.40.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 5b76d4581ba..130f7cdfef7 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testImplementation platform("software.amazon.awssdk:bom:2.35.0") + testImplementation platform("software.amazon.awssdk:bom:2.40.4") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' testImplementation 'software.amazon.awssdk:cloudwatchlogs' From 48fca06cca11ccb3a6ceee504d53559f1794bae5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:34:05 +0000 Subject: [PATCH 1003/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.45.0 to 4.47.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.45.0...4.47.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-version: 4.47.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 22ad28298a4..dabb35df363 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -12,7 +12,7 @@ dependencies { shaded("net.lingala.zip4j:zip4j:2.11.5") testImplementation(project(":testcontainers-junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.45.0") + testImplementation("com.hivemq:hivemq-extension-sdk:4.47.1") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.10") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.19") From 14a6c8c78dfc5b3d1462ff4a40a7c8b81575e411 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:34:09 +0000 Subject: [PATCH 1004/1224] Bump com.rabbitmq:amqp-client from 5.26.0 to 5.28.0 in /modules/rabbitmq Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.26.0 to 5.28.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.26.0...v5.28.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-version: 5.28.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index f83ca738d0b..ce7d5caaa6e 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testImplementation 'com.rabbitmq:amqp-client:5.26.0' + testImplementation 'com.rabbitmq:amqp-client:5.28.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' } From f116557469aa87679c263c4229d589afc2e05400 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:34:13 +0000 Subject: [PATCH 1005/1224] Bump org.typesense:typesense-java in /modules/typesense Bumps [org.typesense:typesense-java](https://github.com/typesense/typesense-java) from 1.3.0 to 2.0.0. - [Release notes](https://github.com/typesense/typesense-java/releases) - [Commits](https://github.com/typesense/typesense-java/compare/v1.3.0...v2.0.0) --- updated-dependencies: - dependency-name: org.typesense:typesense-java dependency-version: 2.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/typesense/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/typesense/build.gradle b/modules/typesense/build.gradle index 84a5978ba81..17d6135b604 100644 --- a/modules/typesense/build.gradle +++ b/modules/typesense/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Typesense" dependencies { api project(':testcontainers') - testImplementation 'org.typesense:typesense-java:1.3.0' + testImplementation 'org.typesense:typesense-java:2.0.0' } From b560d7c4361f308fdaf3a4d3b6da446e37576024 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Dec 2025 18:34:19 +0000 Subject: [PATCH 1006/1224] Bump com.scylladb:java-driver-core in /modules/scylladb Bumps [com.scylladb:java-driver-core](https://github.com/scylladb/java-driver) from 4.19.0.1 to 4.19.0.3. - [Release notes](https://github.com/scylladb/java-driver/releases) - [Commits](https://github.com/scylladb/java-driver/compare/4.19.0.1...4.19.0.3) --- updated-dependencies: - dependency-name: com.scylladb:java-driver-core dependency-version: 4.19.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index 28e91cca882..883ce486380 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: ScyllaDB" dependencies { api project(":testcontainers") - testImplementation 'com.scylladb:java-driver-core:4.19.0.1' + testImplementation 'com.scylladb:java-driver-core:4.19.0.4' testImplementation 'software.amazon.awssdk:dynamodb:2.34.8' } From 47306dacd2f074abf3443cf76f1d7946b19e2c8a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:02 +0000 Subject: [PATCH 1007/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.54.1 to 1.56.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.54.1...v1.56.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.56.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 4b9092e4786..1a407f66729 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.4' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.54.1') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.57.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From a34e21fd6f6fe9fd10506540a9fcad25ca08c0b3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:03 +0000 Subject: [PATCH 1008/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.1.4 to 9.2.2. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.1.4...v9.2.2) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.2.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 e1926d25028..860a7d11526 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.1.4" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.2.2" testImplementation "org.elasticsearch.client:transport:7.17.29" } From 5e26c13c5e152977a356bc7a2b18f24bbeffff97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:12 +0000 Subject: [PATCH 1009/1224] Bump com.ibm.db2:jcc from 12.1.2.0 to 12.1.3.0 in /modules/db2 Bumps com.ibm.db2:jcc from 12.1.2.0 to 12.1.3.0. --- updated-dependencies: - dependency-name: com.ibm.db2:jcc dependency-version: 12.1.3.0 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/db2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index a15081c9614..a0c3bc79e85 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.ibm.db2:jcc:12.1.2.0' + testRuntimeOnly 'com.ibm.db2:jcc:12.1.3.0' } From a0003ed9559a1508465caeea1792e814d673e90a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:13 +0000 Subject: [PATCH 1010/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.15.4 to 1.16.0. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.15.4...v1.16.0) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.16.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 4b9092e4786..b8426d43145 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'io.rest-assured:rest-assured:5.5.6' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.15.4' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.1' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.54.1') From d2e5882cea02890b8d8e70022621f1a902c425a5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:18 +0000 Subject: [PATCH 1011/1224] Bump commons-io:commons-io from 2.20.0 to 2.21.0 in /modules/hivemq Bumps [commons-io:commons-io](https://github.com/apache/commons-io) from 2.20.0 to 2.21.0. - [Changelog](https://github.com/apache/commons-io/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-io/compare/rel/commons-io-2.20.0...rel/commons-io-2.21.0) --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-version: 2.21.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 22ad28298a4..8861b687cf6 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -5,7 +5,7 @@ dependencies { api("org.jetbrains:annotations:26.0.2-1") shaded("org.apache.commons:commons-lang3:3.19.0") - shaded("commons-io:commons-io:2.20.0") + shaded("commons-io:commons-io:2.21.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") From 6f5a5baf2dcb4bb03c329747869a280f98d3efaf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:38 +0000 Subject: [PATCH 1012/1224] Bump io.kubernetes:client-java in /modules/k3s Bumps [io.kubernetes:client-java](https://github.com/kubernetes-client/java) from 24.0.0-legacy to 25.0.0-legacy. - [Release notes](https://github.com/kubernetes-client/java/releases) - [Changelog](https://github.com/kubernetes-client/java/blob/master/CHANGELOG.md) - [Commits](https://github.com/kubernetes-client/java/compare/v24.0.0-legacy...v25.0.0-legacy) --- updated-dependencies: - dependency-name: io.kubernetes:client-java dependency-version: 25.0.0-legacy dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index aab1a2aa40f..010494fe94c 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -7,5 +7,5 @@ dependencies { shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' testImplementation 'io.fabric8:kubernetes-client:7.4.0' - testImplementation 'io.kubernetes:client-java:24.0.0-legacy' + testImplementation 'io.kubernetes:client-java:25.0.0-legacy' } From f487f3370841355f83d6b248060464270f0b0c2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:37:54 +0000 Subject: [PATCH 1013/1224] Bump com.influxdb:influxdb-client-java in /modules/influxdb Bumps [com.influxdb:influxdb-client-java](https://github.com/influxdata/influxdb-client-java) from 7.3.0 to 7.4.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v7.3.0...v7.4.0) --- updated-dependencies: - dependency-name: com.influxdb:influxdb-client-java dependency-version: 7.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/influxdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index 53056f2f5bc..bc743e6bbce 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -6,5 +6,5 @@ dependencies { compileOnly 'org.influxdb:influxdb-java:2.25' testImplementation 'org.influxdb:influxdb-java:2.25' - testImplementation "com.influxdb:influxdb-client-java:7.3.0" + testImplementation "com.influxdb:influxdb-client-java:7.4.0" } From 913faa63f36600dcc10f3a714bb46d95d7d6c2c6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:38:02 +0000 Subject: [PATCH 1014/1224] Bump redis.clients:jedis from 6.2.0 to 7.1.0 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.2.0 to 7.1.0. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.2.0...v7.1.0) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.1.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index d6480227889..261f6c29384 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.11' - testImplementation 'redis.clients:jedis:6.2.0' + testImplementation 'redis.clients:jedis:7.1.0' } From 8828f99b9aa9e33e5bc99b67e1de09d76c98e5db Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:39:14 +0000 Subject: [PATCH 1015/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.7.11 to 3.8.0. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.7.11...v3.8.0) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-version: 3.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index ecf02924009..42b422257a8 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.7.11' + testFixturesImplementation 'io.projectreactor:reactor-core:3.8.1' testFixturesImplementation 'org.assertj:assertj-core:3.27.6' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.1' } From 51292fd4a0153cc4e2b657527ae2bc8c00d52833 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:39:44 +0000 Subject: [PATCH 1016/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps [com.solacesystems:sol-jcsmp](https://github.com/SolaceDev/solsuite) from 10.28.1 to 10.29.0. - [Commits](https://github.com/SolaceDev/solsuite/commits) --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-version: 10.29.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 83583fd5cdf..ab0e9555aae 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - testImplementation 'com.solacesystems:sol-jcsmp:10.28.1' + testImplementation 'com.solacesystems:sol-jcsmp:10.29.0' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From 5f11ab70bafe2990d25bc4484bd59d08716c650c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:41:03 +0000 Subject: [PATCH 1017/1224] Bump io.milvus:milvus-sdk-java from 2.6.5 to 2.6.10 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.6.5 to 2.6.10. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.6.5...v2.6.10) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-version: 2.6.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index 2aec7fc1da3..cb4ef3b2145 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testImplementation 'io.milvus:milvus-sdk-java:2.6.5' + testImplementation 'io.milvus:milvus-sdk-java:2.6.10' } From 51be1c5c030292ac1fd4f8a18ea72b04bea7f0ba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:41:11 +0000 Subject: [PATCH 1018/1224] Bump org.apache.activemq:activemq-client in /modules/activemq Bumps [org.apache.activemq:activemq-client](https://github.com/apache/activemq) from 6.1.7 to 6.2.0. - [Commits](https://github.com/apache/activemq/compare/activemq-6.1.7...activemq-6.2.0) --- updated-dependencies: - dependency-name: org.apache.activemq:activemq-client dependency-version: 6.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index f0ad74ba76b..27dfcf3b852 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') - testImplementation "org.apache.activemq:activemq-client:6.1.7" + testImplementation "org.apache.activemq:activemq-client:6.2.0" testImplementation "org.apache.activemq:artemis-jakarta-client:2.42.0" } From bc55c2ce5ca6cbab386abd33ebadae12d072663b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:41:31 +0000 Subject: [PATCH 1019/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.42.0 to 2.44.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-version: 2.44.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index f0ad74ba76b..d96cbfa0f8c 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation "org.apache.activemq:activemq-client:6.1.7" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.42.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.44.0" } From 2039c62068f758e2b9311cb847e0899616935a23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:42:10 +0000 Subject: [PATCH 1020/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.69.0 to 26.72.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Changelog](https://github.com/googleapis/java-cloud-bom/blob/main/release-please-config.json) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.69.0...v26.72.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.72.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 79b856cf06e..54271098ebc 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.69.0") + testImplementation platform("com.google.cloud:libraries-bom:26.72.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From 5a913c4ad59afb2e1ca738cfe7124af6adab1a07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:44:25 +0000 Subject: [PATCH 1021/1224] Bump io.qdrant:client from 1.15.0 to 1.16.1 in /modules/qdrant Bumps [io.qdrant:client](https://github.com/qdrant/java-client) from 1.15.0 to 1.16.1. - [Release notes](https://github.com/qdrant/java-client/releases) - [Commits](https://github.com/qdrant/java-client/compare/v1.15.0...v1.16.1) --- updated-dependencies: - dependency-name: io.qdrant:client dependency-version: 1.16.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index c67fd6c7f74..849cafeb37f 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Qdrant" dependencies { api project(':testcontainers') - testImplementation 'io.qdrant:client:1.15.0' + testImplementation 'io.qdrant:client:1.16.1' testImplementation platform('io.grpc:grpc-bom:1.75.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' From f8dbdcaad37a22a0686f00036af5898c73f9d713 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:44:52 +0000 Subject: [PATCH 1022/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 4.1.0 to 4.1.1. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-version: 4.1.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 74e91674c70..3f60fd8db71 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.34' - testImplementation 'org.apache.kafka:kafka-clients:4.1.0' + testImplementation 'org.apache.kafka:kafka-clients:4.1.1' testImplementation 'io.rest-assured:rest-assured:5.5.6' testImplementation 'org.awaitility:awaitility:4.3.0' } From d076f2fea66891f60ce8baee258e19fd713c70b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 10 Dec 2025 20:45:34 +0000 Subject: [PATCH 1023/1224] Bump dev.openfga:openfga-sdk from 0.9.0 to 0.9.3 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.9.0 to 0.9.3. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.9.0...v0.9.3) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-version: 0.9.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index f681fe841e2..c483eb8e5e6 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') - testImplementation 'dev.openfga:openfga-sdk:0.9.0' + testImplementation 'dev.openfga:openfga-sdk:0.9.4' } test { From 0bd9966a3981ff330a3d5338a0bd71271811370a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 11 Dec 2025 11:46:19 -0600 Subject: [PATCH 1024/1224] Update questdb/questdb image version to 9.2.2 (#11347) --- .../src/test/java/org/testcontainers/QuestDBTestImages.java | 2 +- .../org/testcontainers/junit/questdb/SimpleQuestDBTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/questdb/src/test/java/org/testcontainers/QuestDBTestImages.java b/modules/questdb/src/test/java/org/testcontainers/QuestDBTestImages.java index 555b56f172c..14e42d72fae 100644 --- a/modules/questdb/src/test/java/org/testcontainers/QuestDBTestImages.java +++ b/modules/questdb/src/test/java/org/testcontainers/QuestDBTestImages.java @@ -3,5 +3,5 @@ import org.testcontainers.utility.DockerImageName; public interface QuestDBTestImages { - DockerImageName QUESTDB_IMAGE = DockerImageName.parse("questdb/questdb:6.5.3"); + DockerImageName QUESTDB_IMAGE = DockerImageName.parse("questdb/questdb:9.2.2"); } diff --git a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java index aad4df70c2c..6b0ff6e3107 100644 --- a/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java +++ b/modules/questdb/src/test/java/org/testcontainers/junit/questdb/SimpleQuestDBTest.java @@ -27,7 +27,7 @@ class SimpleQuestDBTest extends AbstractContainerDatabaseTest { @Test void testSimple() throws SQLException { try ( // container { - QuestDBContainer questDB = new QuestDBContainer("questdb/questdb:6.5.3") + QuestDBContainer questDB = new QuestDBContainer("questdb/questdb:9.2.2") // } ) { questDB.start(); From d83653df0f53345e0d8b5404a38b81465b220270 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 11 Dec 2025 12:10:36 -0600 Subject: [PATCH 1025/1224] Fix compatibility with older Docker Engines by falling back to v1.32 (#11346) Previously, minimum Docker API version was raised to v1.44 to keep compatibility with most recent Docker Enginer API. This commit introduces a fallback to API v1.32, which was used before. Fixes #11232 --- .../DockerClientProviderStrategy.java | 33 +++++++++++++------ 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java index e16beeb6614..7b0aaafc169 100644 --- a/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java +++ b/core/src/main/java/org/testcontainers/dockerclient/DockerClientProviderStrategy.java @@ -401,21 +401,34 @@ public static DockerClient getClientForConfig(TransportConfig transportConfig) { throw new IllegalArgumentException("Unknown transport type '" + transportType + "'"); } - DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig.createDefaultConfigBuilder(); + DefaultDockerClientConfig.Builder configBuilder = DefaultDockerClientConfig + .createDefaultConfigBuilder() + .withDockerHost(transportConfig.getDockerHost().toString()); - if (configBuilder.build().getApiVersion() == RemoteApiVersion.UNKNOWN_VERSION) { - configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_44); - } Map headers = new HashMap<>(); headers.put("x-tc-sid", DockerClientFactory.SESSION_ID); headers.put("User-Agent", String.format("tc-java/%s", DockerClientFactory.TESTCONTAINERS_VERSION)); - return DockerClientImpl.getInstance( - new AuthDelegatingDockerClientConfig( - configBuilder.withDockerHost(transportConfig.getDockerHost().toString()).build() - ), - new HeadersAddingDockerHttpClient(dockerHttpClient, headers) - ); + try { + if (configBuilder.build().getApiVersion() == RemoteApiVersion.UNKNOWN_VERSION) { + configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_44); + } + DockerClient client = DockerClientImpl.getInstance( + new AuthDelegatingDockerClientConfig(configBuilder.build()), + new HeadersAddingDockerHttpClient(dockerHttpClient, headers) + ); + log.debug("Pinging Docker API version 1.44."); + client.pingCmd().exec(); + return client; + } catch (Exception ex) { + log.debug("Fallback to Docker API version 1.32."); + return DockerClientImpl.getInstance( + new AuthDelegatingDockerClientConfig( + configBuilder.withApiVersion(RemoteApiVersion.VERSION_1_32).build() + ), + new HeadersAddingDockerHttpClient(dockerHttpClient, headers) + ); + } } public synchronized String getDockerHostIpAddress() { From c769b20fb2559563930b3295d794665f1a5887e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 16:48:17 +0000 Subject: [PATCH 1026/1224] Bump org.questdb:questdb from 9.0.3 to 9.2.2 in /modules/questdb Bumps [org.questdb:questdb](https://github.com/questdb/questdb) from 9.0.3 to 9.2.2. - [Release notes](https://github.com/questdb/questdb/releases) - [Commits](https://github.com/questdb/questdb/compare/9.0.3...9.2.2) --- updated-dependencies: - dependency-name: org.questdb:questdb dependency-version: 9.2.2 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index ef90382450b..6403e4cd11d 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -7,7 +7,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.8' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.questdb:questdb:9.0.3' + testImplementation 'org.questdb:questdb:9.2.2' testImplementation 'org.awaitility:awaitility:4.3.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' } From b955a3f5fb53fe35ed41148781563a6e1eca4722 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 17:55:41 +0000 Subject: [PATCH 1027/1224] Bump org.apache.commons:commons-lang3 in /modules/hivemq Bumps org.apache.commons:commons-lang3 from 3.19.0 to 3.20.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-version: 3.20.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index bbf2dd665a0..477c3617aa7 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -4,7 +4,7 @@ dependencies { api(project(":testcontainers")) api("org.jetbrains:annotations:26.0.2-1") - shaded("org.apache.commons:commons-lang3:3.19.0") + shaded("org.apache.commons:commons-lang3:3.20.0") shaded("commons-io:commons-io:2.21.0") shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") From 489e4c51c4efd0264c95a41a3879e1dd8b89f2ec Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Dec 2025 17:55:45 +0000 Subject: [PATCH 1028/1224] Bump ch.qos.logback:logback-classic in /modules/hivemq Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.19 to 1.5.21. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.19...v_1.5.21) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.5.21 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index bbf2dd665a0..9cde8122c21 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.hivemq:hivemq-extension-sdk:4.47.1") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.10") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") - testImplementation("ch.qos.logback:logback-classic:1.5.19") + testImplementation("ch.qos.logback:logback-classic:1.5.22") } test { From 38fead21c818d1b188db4ae3d223c3582c668115 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 23:33:50 +0000 Subject: [PATCH 1029/1224] Bump org.assertj:assertj-core from 3.27.6 to 3.27.7 in /core Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.6 to 3.27.7. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.6...assertj-build-3.27.7) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index da9ec1f2a44..24157ce28fe 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -115,14 +115,14 @@ dependencies { // Synthetic JAR used for MountableFileTest and DirectoryTarResourceTest testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') - testImplementation 'org.assertj:assertj-core:3.27.6' + testImplementation 'org.assertj:assertj-core:3.27.7' testImplementation 'io.rest-assured:rest-assured:5.5.6' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" jarFileTestRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' jarFileTestImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - jarFileTestImplementation 'org.assertj:assertj-core:3.27.6' + jarFileTestImplementation 'org.assertj:assertj-core:3.27.7' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' } From 96c84355c4810e8dea2cc64cca0f3e151aee0ece Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:22:53 +0000 Subject: [PATCH 1030/1224] Bump com.mysql:mysql-connector-j in /modules/junit-jupiter Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 9.5.0 to 9.6.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/9.5.0...9.6.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 29b896793a9..b9c2fc7bcee 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -15,5 +15,5 @@ dependencies { } testRuntimeOnly 'org.postgresql:postgresql:42.7.8' - testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' } From 1536650bd6872306b5f10eaf1f27d94e53f7dbb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:23:14 +0000 Subject: [PATCH 1031/1224] Bump com.mysql:mysql-connector-j from 9.5.0 to 9.6.0 in /modules/spock Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 9.5.0 to 9.6.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/9.5.0...9.6.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 53e945c8108..7522d7f697f 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -16,7 +16,7 @@ dependencies { testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.8' - testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' testRuntimeOnly platform('org.junit:junit-bom:5.14.1') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' From f79f6c591791ff34970e9e8fd4cfd994fec8aeab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:23:15 +0000 Subject: [PATCH 1032/1224] Bump com.mysql:mysql-connector-j from 9.5.0 to 9.6.0 in /modules/mysql Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 9.5.0 to 9.6.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/9.5.0...9.6.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 4a104559330..51cf73b1589 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.asyncer:r2dbc-mysql:1.4.1' testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' From 3b0f061a2a40c43dcff7e11f64174d7ac8495597 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:27:17 +0000 Subject: [PATCH 1033/1224] Bump org.assertj:assertj-core from 3.27.6 to 3.27.7 in /modules/r2dbc Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.6 to 3.27.7. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.6...assertj-build-3.27.7) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 42b422257a8..3a2a55c7f0d 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -12,6 +12,6 @@ dependencies { testImplementation project(':testcontainers-postgresql') testFixturesImplementation 'io.projectreactor:reactor-core:3.8.1' - testFixturesImplementation 'org.assertj:assertj-core:3.27.6' + testFixturesImplementation 'org.assertj:assertj-core:3.27.7' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.1' } From 013db9815bd71cc947fb70e5db64b30851e05aff Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Feb 2026 22:31:42 +0000 Subject: [PATCH 1034/1224] Bump com.mysql:mysql-connector-j from 9.5.0 to 9.6.0 in /modules/tidb Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 9.5.0 to 9.6.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/9.5.0...9.6.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/tidb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 264d00fc883..7cf52e57ca9 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' } From dea972503664ebfed2b74957c740e58bd93d579f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 3 Feb 2026 15:12:59 -0600 Subject: [PATCH 1035/1224] Update ryuk version to 0.14.0 (#11486) --- .../src/main/java/org/testcontainers/utility/RyukContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/utility/RyukContainer.java b/core/src/main/java/org/testcontainers/utility/RyukContainer.java index 475a957f344..a0139420cab 100644 --- a/core/src/main/java/org/testcontainers/utility/RyukContainer.java +++ b/core/src/main/java/org/testcontainers/utility/RyukContainer.java @@ -9,7 +9,7 @@ class RyukContainer extends GenericContainer { RyukContainer() { - super("testcontainers/ryuk:0.13.0"); + super("testcontainers/ryuk:0.14.0"); withExposedPorts(8080); withCreateContainerCmdModifier(cmd -> { cmd.withName("testcontainers-ryuk-" + DockerClientFactory.SESSION_ID); From 8da56ffeff9f2b6afd712364e40ecc5b3f6ca34d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 26 Feb 2026 15:35:16 -0600 Subject: [PATCH 1036/1224] Support apache/activemq in ActiveMQContainer (#11498) --- .../activemq/ActiveMQContainer.java | 8 ++++++-- .../activemq/ActiveMQContainerTest.java | 15 +++++++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/modules/activemq/src/main/java/org/testcontainers/activemq/ActiveMQContainer.java b/modules/activemq/src/main/java/org/testcontainers/activemq/ActiveMQContainer.java index 14814d95da9..9313efc55d6 100644 --- a/modules/activemq/src/main/java/org/testcontainers/activemq/ActiveMQContainer.java +++ b/modules/activemq/src/main/java/org/testcontainers/activemq/ActiveMQContainer.java @@ -21,7 +21,11 @@ */ public class ActiveMQContainer extends GenericContainer { - private static final DockerImageName DEFAULT_IMAGE = DockerImageName.parse("apache/activemq-classic"); + private static final DockerImageName APACHE_ACTIVEMQ_CLASSIC_IMAGE = DockerImageName.parse( + "apache/activemq-classic" + ); + + private static final DockerImageName DEFAULT_IMAGE = DockerImageName.parse("apache/activemq"); private static final int WEB_CONSOLE_PORT = 8161; @@ -45,7 +49,7 @@ public ActiveMQContainer(String image) { public ActiveMQContainer(DockerImageName dockerImageName) { super(dockerImageName); - dockerImageName.assertCompatibleWith(DEFAULT_IMAGE); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE, APACHE_ACTIVEMQ_CLASSIC_IMAGE); withExposedPorts(WEB_CONSOLE_PORT, TCP_PORT, AMQP_PORT, STOMP_PORT, MQTT_PORT, WS_PORT); waitingFor(Wait.forLogMessage(".*Apache ActiveMQ.*started.*", 1).withStartupTimeout(Duration.ofMinutes(1))); diff --git a/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java b/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java index 564ee5382e7..cb66ebba864 100644 --- a/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java +++ b/modules/activemq/src/test/java/org/testcontainers/activemq/ActiveMQContainerTest.java @@ -10,6 +10,8 @@ import lombok.SneakyThrows; import org.apache.activemq.ActiveMQConnectionFactory; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; @@ -18,7 +20,7 @@ class ActiveMQContainerTest { @Test void test() { try ( // container { - ActiveMQContainer activemq = new ActiveMQContainer("apache/activemq-classic:5.18.3") + ActiveMQContainer activemq = new ActiveMQContainer("apache/activemq:5.18.7") // } ) { activemq.start(); @@ -29,11 +31,20 @@ void test() { } } + @ParameterizedTest + @ValueSource(strings = { "apache/activemq-classic:5.18.7", "apache/activemq:5.18.7" }) + void compatibility(String image) { + try (ActiveMQContainer activemq = new ActiveMQContainer(image)) { + activemq.start(); + assertFunctionality(activemq, false); + } + } + @Test void customCredentials() { try ( // settingCredentials { - ActiveMQContainer activemq = new ActiveMQContainer("apache/activemq-classic:5.18.3") + ActiveMQContainer activemq = new ActiveMQContainer("apache/activemq:5.18.7") .withUser("testcontainers") .withPassword("testcontainers") // } From d00d339406c3c2f9e962cf8736033fab2c8d8c56 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:06 +0000 Subject: [PATCH 1037/1224] Bump org.jetbrains:annotations in /modules/oracle-xe Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index 6faeeb9367e..b87fcbec90a 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' From b674b8fd4728a4b68ac247a0bfc9c7b3b107d084 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:10 +0000 Subject: [PATCH 1038/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /modules/jdbc Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 f34c99c0385..149038f2d98 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC" dependencies { api project(':testcontainers-database-commons') - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.14' From f218aa2a69b16a7f08c87e559c8e02bfc4c6aee9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:10 +0000 Subject: [PATCH 1039/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /modules/nginx Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/nginx/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nginx/build.gradle b/modules/nginx/build.gradle index 13bd94d88d2..60d24d863d8 100644 --- a/modules/nginx/build.gradle +++ b/modules/nginx/build.gradle @@ -2,5 +2,5 @@ description = "Testcontainers :: Nginx" dependencies { api project(':testcontainers') - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 12899cffc743169adb46a25ff581f2433e16795f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:15 +0000 Subject: [PATCH 1040/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /modules/mysql Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 4a104559330..b70f826176d 100644 --- a/modules/mysql/build.gradle +++ b/modules/mysql/build.gradle @@ -12,5 +12,5 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.asyncer:r2dbc-mysql:1.4.1' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 3734df0a42e4825ed8d30b9f12b45d731d1fb0dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:31 +0000 Subject: [PATCH 1041/1224] Bump org.jetbrains:annotations in /modules/presto Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/presto/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/presto/build.gradle b/modules/presto/build.gradle index 874b532fb85..1d2933dec53 100644 --- a/modules/presto/build.gradle +++ b/modules/presto/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.prestosql:presto-jdbc:350' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 2ad363b1523731923f44569ff8d1d06c41703580 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:37 +0000 Subject: [PATCH 1042/1224] Bump org.postgresql:postgresql in /modules/cockroachdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.8 to 42.7.10. - [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.7.8...REL42.7.10) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cockroachdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cockroachdb/build.gradle b/modules/cockroachdb/build.gradle index 6d7acda1515..275e69eef3d 100644 --- a/modules/cockroachdb/build.gradle +++ b/modules/cockroachdb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC :: CockroachDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.8' + testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testImplementation project(':testcontainers-jdbc-test') } From a82249fad876dcab878ff32c5c11510a2692fa46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:22:49 +0000 Subject: [PATCH 1043/1224] Bump org.jetbrains:annotations in /modules/rabbitmq Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index ce7d5caaa6e..350adce5a76 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(":testcontainers") testImplementation 'com.rabbitmq:amqp-client:5.28.0' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From c249352a5216fcf530e108e86fc3b1ce6d653bcd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:26:08 +0000 Subject: [PATCH 1044/1224] Bump org.jetbrains:annotations in /modules/hivemq Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 1cada0e354d..8c1b2c02034 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: HiveMQ" dependencies { api(project(":testcontainers")) - api("org.jetbrains:annotations:26.0.2-1") + api("org.jetbrains:annotations:26.1.0") shaded("org.apache.commons:commons-lang3:3.20.0") shaded("commons-io:commons-io:2.21.0") From 3f66ea79aa5c3b93cd0407c3a633ad10341d3e9a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:29:47 +0000 Subject: [PATCH 1045/1224] Bump org.postgresql:postgresql in /modules/questdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.8 to 42.7.10. - [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.7.8...REL42.7.10) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 6403e4cd11d..5e9da5686d8 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.8' + testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.questdb:questdb:9.2.2' From 0e728cc9129887d1e0f6ce4559e879dc9336a0dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:33:12 +0000 Subject: [PATCH 1046/1224] Bump org.postgresql:postgresql in /modules/cratedb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.8 to 42.7.10. - [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.7.8...REL42.7.10) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index be60919c0e3..3a93f97cae8 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC :: CrateDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.8' + testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testImplementation project(':testcontainers-jdbc-test') From 2d1fa5bcd5dabac6bffc21e99c821fa26506de47 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:33:25 +0000 Subject: [PATCH 1047/1224] Bump org.jetbrains:annotations in /modules/oracle-free Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index e7cc9669632..b99b1bf8e89 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -9,7 +9,7 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' From 985a145a25e782ec795359155803fe77b165dc79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 1 Mar 2026 22:38:37 +0000 Subject: [PATCH 1048/1224] Bump com.mysql:mysql-connector-j in /modules/oceanbase Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 9.5.0 to 9.6.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/9.5.0...9.6.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/oceanbase/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oceanbase/build.gradle b/modules/oceanbase/build.gradle index 1fc1eb82e43..f570d741f7b 100644 --- a/modules/oceanbase/build.gradle +++ b/modules/oceanbase/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.mysql:mysql-connector-j:9.5.0' + testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' } From 5323acdeb4d399b2dc1a61eb07012a39f86643e6 Mon Sep 17 00:00:00 2001 From: bramvonk Date: Tue, 3 Mar 2026 00:03:35 +0100 Subject: [PATCH 1049/1224] Use non-deprecated MSSQLServerContainer in ServiceBusEmulatorContainer (#11223) Fixes #11554 --- modules/azure/build.gradle | 4 ++++ .../testcontainers/azure/ServiceBusEmulatorContainer.java | 6 +++--- .../azure/ServiceBusEmulatorContainerTest.java | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 681a6dc47e6..796f500410b 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -15,3 +15,7 @@ dependencies { testImplementation 'com.azure:azure-messaging-servicebus' testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.3.0.jre8-preview' } + +tasks.japicmp { + methodExcludes = ["org.testcontainers.azure.ServiceBusEmulatorContainer#withMsSqlServerContainer(org.testcontainers.containers.MSSQLServerContainer)"] +} diff --git a/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java b/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java index fd055a0d39b..4557b6acb6a 100644 --- a/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java +++ b/modules/azure/src/main/java/org/testcontainers/azure/ServiceBusEmulatorContainer.java @@ -1,9 +1,9 @@ package org.testcontainers.azure; import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.images.builder.Transferable; +import org.testcontainers.mssqlserver.MSSQLServerContainer; import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.LicenseAcceptance; @@ -25,7 +25,7 @@ public class ServiceBusEmulatorContainer extends GenericContainer msSqlServerContainer; + private MSSQLServerContainer msSqlServerContainer; /** * @param dockerImageName The specified docker image name to run @@ -51,7 +51,7 @@ public ServiceBusEmulatorContainer(final DockerImageName dockerImageName) { * @param msSqlServerContainer The MS SQL Server container used by Service Bus as a dependency * @return this */ - public ServiceBusEmulatorContainer withMsSqlServerContainer(final MSSQLServerContainer msSqlServerContainer) { + public ServiceBusEmulatorContainer withMsSqlServerContainer(final MSSQLServerContainer msSqlServerContainer) { dependsOn(msSqlServerContainer); this.msSqlServerContainer = msSqlServerContainer; return this; diff --git a/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java index 6bf6ac80fae..83cd633c5a9 100644 --- a/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java +++ b/modules/azure/src/test/java/org/testcontainers/azure/ServiceBusEmulatorContainerTest.java @@ -10,8 +10,8 @@ import com.github.dockerjava.api.model.Capability; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.testcontainers.containers.MSSQLServerContainer; import org.testcontainers.containers.Network; +import org.testcontainers.mssqlserver.MSSQLServerContainer; import org.testcontainers.utility.MountableFile; import java.util.List; @@ -31,7 +31,7 @@ void testWithClient() { Network network = Network.newNetwork(); // } // sqlContainer { - MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer<>( + MSSQLServerContainer mssqlServerContainer = new MSSQLServerContainer( "mcr.microsoft.com/mssql/server:2022-CU14-ubuntu-22.04" ) .acceptLicense() From a756bc6a572cde84fbe429b3a1fcf09ba9559581 Mon Sep 17 00:00:00 2001 From: Meyon Soo Kim <39788337+PreAgile@users.noreply.github.com> Date: Fri, 13 Mar 2026 06:55:09 +0900 Subject: [PATCH 1050/1224] Improve k6 docs (#11564) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #8780 --------- Co-authored-by: Eddú Meléndez Gonzales --- docs/modules/k6.md | 15 +++++++++++++-- .../org/testcontainers/k6/K6ContainerTests.java | 2 ++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/docs/modules/k6.md b/docs/modules/k6.md index 4783ca1e5ad..13e0ddc9252 100644 --- a/docs/modules/k6.md +++ b/docs/modules/k6.md @@ -11,12 +11,23 @@ Testcontainers module for [k6](https://registry.hub.docker.com/r/grafana/k6). ## Basic script execution -Execute a simple k6 test script, `test.js`, with commandline options and injected script variable. +You can start a K6 container instance from any Java application by using: + + +[Setup the container](../../modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java) inside_block:standard_k6 + + +The test above uses a simple k6 script, `test.js`, with command line options and an injected script variable. + +Once the container is started, you can wait for the test results to be collected: + + +[Wait for test results](../../modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java) inside_block:wait + Create a simple k6 test script to be executed as part of your tests: -[Setup the container](../../modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java) inside_block:standard_k6 [Content of `scripts/test.js`](../../modules/k6/src/test/resources/scripts/test.js) inside_block:access_script_vars diff --git a/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java b/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java index 255cb376b4f..43b390c4db4 100644 --- a/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java +++ b/modules/k6/src/test/java/org/testcontainers/k6/K6ContainerTests.java @@ -23,6 +23,7 @@ void k6StandardTest() throws Exception { ) { container.start(); + // wait { WaitingConsumer consumer = new WaitingConsumer(); container.followOutput(consumer); @@ -34,6 +35,7 @@ void k6StandardTest() throws Exception { 3, TimeUnit.SECONDS ); + // } assertThat(container.getLogs()).contains("k6 tests are cool!"); } From 326987f41a5d23e736bf8e92d7f68f6feaabe515 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 12 Mar 2026 16:02:39 -0600 Subject: [PATCH 1051/1224] Update Pull Request template --- .github/pull_request_template.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 31553ebfff1..6137bf623e3 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,8 @@ -[Wait for the exposed port and use a custom timeout](../../core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java) inside_block:composeContainerWaitForPortWithTimeout +[Wait for the exposed port and use a custom timeout](../../core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategiesTest.java) inside_block:composeContainerWaitForPortWithTimeout Needless to say, we can define different strategies for each service in our Docker Compose setup. @@ -81,7 +81,7 @@ For example, our Redis container can wait for a successful redis-cli command, while our db service waits for a specific log message: -[Wait for a custom command and a log message](../../core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategies.java) inside_block:composeContainerWithCombinedWaitStrategies +[Wait for a custom command and a log message](../../core/src/test/java/org/testcontainers/junit/ComposeContainerWithWaitStrategiesTest.java) inside_block:composeContainerWithCombinedWaitStrategies From 561c4835c24f9f8f32db7aea44552b6b4aa37923 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Tue, 24 Mar 2026 10:30:56 -0600 Subject: [PATCH 1061/1224] Update LocalStack docs (#11581) Fixes #11568 --- docs/modules/localstack.md | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/docs/modules/localstack.md b/docs/modules/localstack.md index 72d4fc843a7..ca51979f5a0 100644 --- a/docs/modules/localstack.md +++ b/docs/modules/localstack.md @@ -10,15 +10,21 @@ You can start a LocalStack container instance from any Java application by using [Container creation](../../modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java) inside_block:container +Environment variables listed in the [LocalStack configuration documentation](https://docs.localstack.cloud/references/configuration/) may be used to customize LocalStack's configuration. +Use the `.withEnv(key, value)` method on `LocalStackContainer` to apply configuration settings. + +!!! note + Starting March 23, 2026, `localstack/localstack` requires authentication via a `LOCALSTACK_AUTH_TOKEN` environment variable. Without it, the container will fail to start. + + Use `.withEnv("LOCALSTACK_AUTH_TOKEN", System.getenv("LOCALSTACK_AUTH_TOKEN"))` to pass the token. + See the [LocalStack blog post](https://blog.localstack.cloud/localstack-single-image-next-steps/) for more details. + ## Creating a client using AWS SDK [AWS SDK V2](../../modules/localstack/src/test/java/org/testcontainers/localstack/LocalStackContainerTest.java) inside_block:with_aws_sdk_v2 -Environment variables listed in [Localstack's README](https://github.com/localstack/localstack#configurations) may be used to customize Localstack's configuration. -Use the `.withEnv(key, value)` method on `LocalStackContainer` to apply configuration settings. - ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: From 96653222a3939ae57d344bfecb1d7ea08f57c77a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ga=C5=A1per=20Kojek?= Date: Tue, 24 Mar 2026 19:55:55 +0100 Subject: [PATCH 1062/1224] Fix jarFileTest cache relocatability (#11574) The jarFileTest task sets `systemProperty("jarFile", absolutePath)` which embeds an absolute path as a task input, making the task not cache-relocatable across different project locations. Fix by: - Using `inputs.files(shadowJar).withPathSensitivity(RELATIVE)` instead of the bare `file()` call (which doesn't register a proper input) - Passing the jar path as a relative path to the system property The test (AbstractJarFileTest) uses `Paths.get(System.getProperty("jarFile"))` which resolves relative paths against the working directory (project dir), so the test works identically with both absolute and relative paths. --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 9a4d413379f..c44ea7b4761 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -34,8 +34,8 @@ task jarFileTest(type: Test) { testClassesDirs = sourceSets.jarFileTest.output.classesDirs classpath = sourceSets.jarFileTest.runtimeClasspath - file(shadowJar.outputs.files.singleFile) // input for correct caching - systemProperty("jarFile", shadowJar.outputs.files.singleFile) + inputs.files(shadowJar).withPathSensitivity(PathSensitivity.RELATIVE) + systemProperty("jarFile", project.projectDir.toPath().relativize(shadowJar.outputs.files.singleFile.toPath()).toString()) dependsOn(shadowJar) } From 7fe356ec4f28c32cace4f179a423a3163f4f0bf0 Mon Sep 17 00:00:00 2001 From: Konstantin Belinski Date: Tue, 24 Mar 2026 20:34:56 +0100 Subject: [PATCH 1063/1224] Fix LocalStack javadoc (#11570) --- .../org/testcontainers/localstack/LocalStackContainer.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java b/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java index 779f9a1e4ad..31eee4ca5ca 100644 --- a/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java +++ b/modules/localstack/src/main/java/org/testcontainers/localstack/LocalStackContainer.java @@ -168,7 +168,7 @@ public URI getEndpoint() { * The access key can be used to construct AWS SDK v2 clients: *

    S3Client s3 = S3Client
                  .builder()
    -             .endpointOverride(localstack.getEndpointOverride(LocalStackContainer.Service.S3))
    +             .endpointOverride(localstack.getEndpoint())
                  .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
                  localstack.getAccessKey(), localstack.getSecretKey()
                  )))
    @@ -187,7 +187,7 @@ public String getAccessKey() {
          * The secret key can be used to construct AWS SDK v2 clients:
          * 
    S3Client s3 = S3Client
                  .builder()
    -             .endpointOverride(localstack.getEndpointOverride(LocalStackContainer.Service.S3))
    +             .endpointOverride(localstack.getEndpoint())
                  .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
                  localstack.getAccessKey(), localstack.getSecretKey()
                  )))
    @@ -205,7 +205,7 @@ public String getSecretKey() {
          * The region can be used to construct AWS SDK v2 clients:
          * 
    S3Client s3 = S3Client
                  .builder()
    -             .endpointOverride(localstack.getEndpointOverride(LocalStackContainer.Service.S3))
    +             .endpointOverride(localstack.getEndpoint())
                  .credentialsProvider(StaticCredentialsProvider.create(AwsBasicCredentials.create(
                  localstack.getAccessKey(), localstack.getSecretKey()
                  )))
    
    From 87ea1068d17ec63beddbdba58d683969dd2125f1 Mon Sep 17 00:00:00 2001
    From: Melissa <65674838+meck-gd@users.noreply.github.com>
    Date: Wed, 25 Mar 2026 16:39:10 +0100
    Subject: [PATCH 1064/1224] Add support for !override docker compose tag
     (#11490)
    
    ---
     .../containers/ParsedDockerComposeFile.java   |  2 +-
     .../junit/ComposeContainerOverrideTest.java   | 31 +++++++++++++++++++
     .../compose-override/compose-override.yml     |  2 ++
     .../resources/compose-override/compose.yml    |  2 ++
     4 files changed, 36 insertions(+), 1 deletion(-)
    
    diff --git a/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java b/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java
    index d797a86bfbf..2d3104af6b1 100644
    --- a/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java
    +++ b/core/src/main/java/org/testcontainers/containers/ParsedDockerComposeFile.java
    @@ -50,7 +50,7 @@ class ParsedDockerComposeFile {
             SafeConstructor constructor = new SafeConstructor(options) {
                 @Override
                 protected Object constructObject(Node node) {
    -                if (node.getTag().equals(new Tag("!reset"))) {
    +                if (node.getTag().equals(new Tag("!reset")) || node.getTag().equals(new Tag("!override"))) {
                         return null;
                     }
                     return super.constructObject(node);
    diff --git a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java
    index bf38af0f929..5065aaf62b2 100644
    --- a/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java
    +++ b/core/src/test/java/org/testcontainers/junit/ComposeContainerOverrideTest.java
    @@ -45,4 +45,35 @@ void resetEnvironment() {
                 assertThat(container.getConfig().getEnv()).doesNotContain("foo=bar");
             }
         }
    +
    +    @Test
    +    void readLabel() {
    +        try (
    +            ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), BASE)
    +                .withExposedService("redis", 6379)
    +        ) {
    +            compose.start();
    +            InspectContainerResponse container = compose
    +                .getContainerByServiceName("redis-1")
    +                .map(ContainerState::getContainerInfo)
    +                .get();
    +            assertThat(container.getConfig().getLabels()).containsKey("label1");
    +        }
    +    }
    +
    +    @Test
    +    void readOverriddenLabel() {
    +        try (
    +            ComposeContainer compose = new ComposeContainer(DockerImageName.parse("docker:25.0.5"), BASE, OVERRIDE)
    +                .withExposedService("redis", 6379)
    +        ) {
    +            compose.start();
    +            InspectContainerResponse container = compose
    +                .getContainerByServiceName("redis-1")
    +                .map(ContainerState::getContainerInfo)
    +                .get();
    +            assertThat(container.getConfig().getLabels()).doesNotContainKey("label1");
    +            assertThat(container.getConfig().getLabels()).containsKey("label2");
    +        }
    +    }
     }
    diff --git a/core/src/test/resources/compose-override/compose-override.yml b/core/src/test/resources/compose-override/compose-override.yml
    index f5f457a6236..7dbf6ff5987 100644
    --- a/core/src/test/resources/compose-override/compose-override.yml
    +++ b/core/src/test/resources/compose-override/compose-override.yml
    @@ -5,3 +5,5 @@ services:
           - 6379
         environment:
           foo: !reset null
    +    labels: !override
    +      label2: value2
    diff --git a/core/src/test/resources/compose-override/compose.yml b/core/src/test/resources/compose-override/compose.yml
    index a304ae82273..9e4a1e9169a 100644
    --- a/core/src/test/resources/compose-override/compose.yml
    +++ b/core/src/test/resources/compose-override/compose.yml
    @@ -5,3 +5,5 @@ services:
           - 6379
         environment:
           foo: bar
    +    labels:
    +      label1: value1
    
    From 58e48acaed5bde6778e592ad4cd5bc30b694f834 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= 
    Date: Wed, 25 Mar 2026 11:56:29 -0600
    Subject: [PATCH 1065/1224] Fix vault docs
    
    ---
     docs/modules/vault.md | 17 +----------------
     1 file changed, 1 insertion(+), 16 deletions(-)
    
    diff --git a/docs/modules/vault.md b/docs/modules/vault.md
    index 45d34844b7f..161efa8ccb0 100644
    --- a/docs/modules/vault.md
    +++ b/docs/modules/vault.md
    @@ -4,7 +4,7 @@ Testcontainers module for [Vault](https://github.com/hashicorp/vault). Vault is
     
     ## Usage example
     
    -Start Vault container as a `@ClassRule`:
    +You can start a Vault container instance from any Java application by using:
     
     
     [Starting a Vault container](../../modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java) inside_block:vaultContainer
    @@ -22,21 +22,6 @@ Use Http API to read data from Vault container:
     [Use Http API to read data](../../modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java) inside_block:readFirstSecretPathOverHttpApi
     
     
    -Use client library to read data from Vault container:
    -
    -
    -[Use library to read data](../../modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java) inside_block:readWithLibrary
    -
    -
    -[See full example.](https://github.com/testcontainers/testcontainers-java/blob/master/modules/vault/src/test/java/org/testcontainers/vault/VaultContainerTest.java)
    -
    -## Why Vault in Junit tests?
    -
    -With the increasing popularity of Vault and secret management, applications are now needing to source secrets from Vault.
    -This can prove challenging in the development phase without a running Vault instance readily on hand. This library 
    -aims to solve your apps integration testing with Vault. You can also use it to
    -test how your application behaves with Vault by writing different test scenarios in Junit.
    -
     ## Adding this module to your project dependencies
     
     Add the following dependency to your `pom.xml`/`build.gradle` file:
    
    From 99791ff3d744dd75f13a37b60991002b5cf27787 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= 
    Date: Wed, 25 Mar 2026 11:59:55 -0600
    Subject: [PATCH 1066/1224] Fix hivemq docs
    
    ---
     docs/modules/hivemq.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/docs/modules/hivemq.md b/docs/modules/hivemq.md
    index 0029204a06c..8bba4c18b36 100644
    --- a/docs/modules/hivemq.md
    +++ b/docs/modules/hivemq.md
    @@ -2,7 +2,7 @@
     
     ![hivemq logo](../modules_logos/hivemq-module.png)
     
    -Automatic starting HiveMQ docker containers for JUnit4 and JUnit5 tests.
    +Automatic starting HiveMQ docker containers for JUnit5 tests.
     This enables testing MQTT client applications and integration testing of custom HiveMQ extensions.
     
     - Community forum: https://community.hivemq.com/
    
    From b1106296b1e089ac62c7270ab4bdbc515c2c0f8d Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= 
    Date: Wed, 25 Mar 2026 16:28:02 -0600
    Subject: [PATCH 1067/1224] Fix neo4j docs
    
    ---
     docs/modules/databases/neo4j.md               |  11 +-
     .../containers/Neo4jExampleTest.java          |   2 -
     .../neo4j/Neo4jContainerTest.java             | 140 ++++++++++--------
     3 files changed, 79 insertions(+), 74 deletions(-)
    
    diff --git a/docs/modules/databases/neo4j.md b/docs/modules/databases/neo4j.md
    index 9bfb7fbfca7..c7b06e99fe7 100644
    --- a/docs/modules/databases/neo4j.md
    +++ b/docs/modules/databases/neo4j.md
    @@ -9,19 +9,12 @@ the Testcontainers integration supports also newer 5.x images of Neo4j.
     
     ## Usage example
     
    -Declare your Testcontainers as a `@ClassRule` or `@Rule` in a JUnit 4 test or as static or member attribute of a JUnit 5 test annotated with `@Container` as you would with other Testcontainers.
    -You can either use call `getBoltUrl()` or `getHttpUrl()` on the Neo4j container.
    -`getBoltUrl()` is meant to be used with one of the [official Bolt drivers](https://neo4j.com/developer/language-guides/) while `getHttpUrl()` gives you the HTTP-address of the transactional HTTP endpoint.
    -On the JVM you would most likely use the [Java driver](https://github.com/neo4j/neo4j-java-driver).
    -
    -The following example uses the JUnit 5 extension `@Testcontainers` and demonstrates both the usage of the Java Driver and the REST endpoint:
    +You can start a Neo4j container instance from any Java application by using:
     
     
    -[JUnit 5 example](../../../examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java) inside_block:junitExample
    +[Neo4j container](../../../modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java) inside_block:container
     
     
    -You are not limited to Unit tests, and you can use an instance of the Neo4j Testcontainers in vanilla Java code as well.
    -
     ## Additional features
     
     ### Custom password
    diff --git a/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java b/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java
    index 38c22a0ff45..bc8770aaef0 100644
    --- a/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java
    +++ b/examples/neo4j-container/src/test/java/org/testcontainers/containers/Neo4jExampleTest.java
    @@ -22,7 +22,6 @@
     import static org.assertj.core.api.Assertions.assertThat;
     import static org.assertj.core.api.Assertions.fail;
     
    -// junitExample {
     @Testcontainers
     class Neo4jExampleTest {
     
    @@ -68,4 +67,3 @@ void testSomethingUsingHttp() throws IOException {
             }
         }
     }
    -// }
    diff --git a/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java
    index 7676450e75a..b880e7b4e8f 100644
    --- a/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java
    +++ b/modules/neo4j/src/test/java/org/testcontainers/neo4j/Neo4jContainerTest.java
    @@ -30,18 +30,33 @@ class Neo4jContainerTest {
         // See org.testcontainers.utility.LicenseAcceptance#ACCEPTANCE_FILE_NAME
         private static final String ACCEPTANCE_FILE_LOCATION = "/container-license-acceptance.txt";
     
    +    @Test
    +    void authenticated() {
    +        try (
    +            // container {
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
    +            // }
    +        ) {
    +            neo4j.start();
    +            try (Driver driver = getDriver(neo4j); Session session = driver.session()) {
    +                long one = session.run("RETURN 1", Collections.emptyMap()).next().get(0).asLong();
    +                assertThat(one).isEqualTo(1L);
    +            }
    +        }
    +    }
    +
         @Test
         void shouldDisableAuthentication() {
             try (
                 // spotless:off
                 // withoutAuthentication {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4")
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
                     .withoutAuthentication()
                 // }
                 // spotless:on
             ) {
    -            neo4jContainer.start();
    -            try (Driver driver = getDriver(neo4jContainer); Session session = driver.session()) {
    +            neo4j.start();
    +            try (Driver driver = getDriver(neo4j); Session session = driver.session()) {
                     long one = session.run("RETURN 1", Collections.emptyMap()).next().get(0).asLong();
                     assertThat(one).isEqualTo(1L);
                 }
    @@ -54,12 +69,12 @@ void shouldCopyDatabase() {
             assumeThat(DockerClientFactory.instance().getInfo().getArchitecture()).isNotEqualTo("aarch64");
             try (
                 // copyDatabase {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:3.5.30")
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:3.5.30")
                     .withDatabase(MountableFile.forClasspathResource("/test-graph.db"))
                 // }
             ) {
    -            neo4jContainer.start();
    -            try (Driver driver = getDriver(neo4jContainer); Session session = driver.session()) {
    +            neo4j.start();
    +            try (Driver driver = getDriver(neo4j); Session session = driver.session()) {
                     Result result = session.run("MATCH (t:Thing) RETURN t");
                     assertThat(result.list().stream().map(r -> r.get("t").get("name").asString()))
                         .containsExactlyInAnyOrder("Thing", "Thing 2", "Thing 3", "A box");
    @@ -98,12 +113,12 @@ void shouldFailOnCopyDatabaseForCustomNonSemverNeo4j4Image() {
         void shouldCopyPlugins() {
             try (
                 // registerPluginsPath {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4")
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
                     .withPlugins(MountableFile.forClasspathResource("/custom-plugins"))
                 // }
             ) {
    -            neo4jContainer.start();
    -            try (Driver driver = getDriver(neo4jContainer); Session session = driver.session()) {
    +            neo4j.start();
    +            try (Driver driver = getDriver(neo4j); Session session = driver.session()) {
                     assertThatCustomPluginWasCopied(session);
                 }
             }
    @@ -113,12 +128,12 @@ void shouldCopyPlugins() {
         void shouldCopyPlugin() {
             try (
                 // registerPluginsJar {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4")
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
                     .withPlugins(MountableFile.forClasspathResource("/custom-plugins/hello-world.jar"))
                 // }
             ) {
    -            neo4jContainer.start();
    -            try (Driver driver = getDriver(neo4jContainer); Session session = driver.session()) {
    +            neo4j.start();
    +            try (Driver driver = getDriver(neo4j); Session session = driver.session()) {
                     assertThatCustomPluginWasCopied(session);
                 }
             }
    @@ -137,13 +152,13 @@ void shouldRunEnterprise() {
     
             try (
                 // enterpriseEdition {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4-enterprise")
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4-enterprise")
                     .acceptLicense()
                     // }
                     .withAdminPassword("Picard123")
             ) {
    -            neo4jContainer.start();
    -            try (Driver driver = getDriver(neo4jContainer); Session session = driver.session()) {
    +            neo4j.start();
    +            try (Driver driver = getDriver(neo4j); Session session = driver.session()) {
                     String edition = session
                         .run("CALL dbms.components() YIELD edition RETURN edition", Collections.emptyMap())
                         .next()
    @@ -157,110 +172,109 @@ void shouldRunEnterprise() {
         @Test
         void shouldAddConfigToEnvironment() {
             // neo4jConfiguration {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4")
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
                 .withNeo4jConfig("dbms.security.procedures.unrestricted", "apoc.*,algo.*")
                 .withNeo4jConfig("dbms.tx_log.rotation.size", "42M");
             // }
     
    -        assertThat(neo4jContainer.getEnvMap())
    -            .containsEntry("NEO4J_dbms_security_procedures_unrestricted", "apoc.*,algo.*");
    -        assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4J_dbms_tx__log_rotation_size", "42M");
    +        assertThat(neo4j.getEnvMap()).containsEntry("NEO4J_dbms_security_procedures_unrestricted", "apoc.*,algo.*");
    +        assertThat(neo4j.getEnvMap()).containsEntry("NEO4J_dbms_tx__log_rotation_size", "42M");
         }
     
         @Test
         void shouldRespectEnvironmentAuth() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withEnv("NEO4J_AUTH", "neo4j/secret");
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withEnv("NEO4J_AUTH", "neo4j/secret");
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4J_AUTH", "neo4j/secret");
    +        assertThat(neo4j.getEnvMap()).containsEntry("NEO4J_AUTH", "neo4j/secret");
         }
     
         @Test
         void shouldSetCustomPasswordCorrectly() {
             // withAdminPassword {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withAdminPassword("verySecret");
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withAdminPassword("verySecret");
             // }
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4J_AUTH", "neo4j/verySecret");
    +        assertThat(neo4j.getEnvMap()).containsEntry("NEO4J_AUTH", "neo4j/verySecret");
         }
     
         @Test
    -    void containerAdminPasswordOverrulesEnvironmentAuth() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4")
    +    void adminPasswordOverrulesEnvironmentAuth() {
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
                 .withEnv("NEO4J_AUTH", "neo4j/secret")
                 .withAdminPassword("anotherSecret");
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4J_AUTH", "neo4j/anotherSecret");
    +        assertThat(neo4j.getEnvMap()).containsEntry("NEO4J_AUTH", "neo4j/anotherSecret");
         }
     
         @Test
    -    void containerWithoutAuthenticationOverrulesEnvironmentAuth() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4")
    +    void shouldWithoutAuthenticationOverrulesEnvironmentAuth() {
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4")
                 .withEnv("NEO4J_AUTH", "neo4j/secret")
                 .withoutAuthentication();
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4J_AUTH", "none");
    +        assertThat(neo4j.getEnvMap()).containsEntry("NEO4J_AUTH", "none");
         }
     
         @Test
         void shouldRespectAlreadyDefinedPortMappingsBolt() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687);
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687);
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getExposedPorts()).containsExactly(7687);
    +        assertThat(neo4j.getExposedPorts()).containsExactly(7687);
         }
     
         @Test
         void shouldRespectAlreadyDefinedPortMappingsHttp() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7474);
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withExposedPorts(7474);
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getExposedPorts()).containsExactly(7474);
    +        assertThat(neo4j.getExposedPorts()).containsExactly(7474);
         }
     
         @Test
         void shouldRespectAlreadyDefinedPortMappingsWithoutHttps() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687, 7474);
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withExposedPorts(7687, 7474);
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getExposedPorts()).containsExactlyInAnyOrder(7474, 7687);
    +        assertThat(neo4j.getExposedPorts()).containsExactlyInAnyOrder(7474, 7687);
         }
     
         @Test
         void shouldDefaultExportBoltHttpAndHttps() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4");
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4");
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer.getExposedPorts()).containsExactlyInAnyOrder(7473, 7474, 7687);
    +        assertThat(neo4j.getExposedPorts()).containsExactlyInAnyOrder(7473, 7474, 7687);
         }
     
         @Test
         void shouldRespectCustomWaitStrategy() {
    -        Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").waitingFor(new CustomDummyWaitStrategy());
    +        Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").waitingFor(new CustomDummyWaitStrategy());
     
    -        neo4jContainer.configure();
    +        neo4j.configure();
     
    -        assertThat(neo4jContainer).extracting("waitStrategy").isInstanceOf(CustomDummyWaitStrategy.class);
    +        assertThat(neo4j).extracting("waitStrategy").isInstanceOf(CustomDummyWaitStrategy.class);
         }
     
         @Test
         void shouldConfigureSinglePluginByName() {
    -        try (Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withPlugins("apoc")) {
    +        try (Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withPlugins("apoc")) {
                 // needs to get called explicitly for setup
    -            neo4jContainer.configure();
    +            neo4j.configure();
     
    -            assertThat(neo4jContainer.getEnvMap()).containsEntry("NEO4JLABS_PLUGINS", "[\"apoc\"]");
    +            assertThat(neo4j.getEnvMap()).containsEntry("NEO4JLABS_PLUGINS", "[\"apoc\"]");
             }
         }
     
    @@ -268,14 +282,14 @@ void shouldConfigureSinglePluginByName() {
         void shouldConfigureMultiplePluginsByName() {
             try (
                 // configureLabsPlugins {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4") //
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4") //
                     .withPlugins("apoc", "bloom");
                 // }
             ) {
                 // needs to get called explicitly for setup
    -            neo4jContainer.configure();
    +            neo4j.configure();
     
    -            assertThat(neo4jContainer.getEnvMap().get("NEO4JLABS_PLUGINS"))
    +            assertThat(neo4j.getEnvMap().get("NEO4JLABS_PLUGINS"))
                     .containsAnyOf("[\"apoc\",\"bloom\"]", "[\"bloom\",\"apoc\"]");
             }
         }
    @@ -284,26 +298,26 @@ void shouldConfigureMultiplePluginsByName() {
         void shouldCreateRandomUuidBasedPasswords() {
             try (
                 // withRandomPassword {
    -            Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4").withRandomPassword();
    +            Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4").withRandomPassword();
                 // }
             ) {
                 // It will throw an exception if it's not UUID parsable.
    -            assertThatNoException().isThrownBy(neo4jContainer::configure);
    +            assertThatNoException().isThrownBy(neo4j::configure);
                 // This basically is always true at if the random password is UUID-like.
    -            assertThat(neo4jContainer.getAdminPassword())
    +            assertThat(neo4j.getAdminPassword())
                     .satisfies(password -> assertThat(UUID.fromString(password).toString()).isEqualTo(password));
             }
         }
     
         @Test
         void shouldWarnOnPasswordTooShort() {
    -        try (Neo4jContainer neo4jContainer = new Neo4jContainer("neo4j:4.4");) {
    +        try (Neo4jContainer neo4j = new Neo4jContainer("neo4j:4.4");) {
                 Logger logger = (Logger) DockerLoggerFactory.getLogger("neo4j:4.4");
                 TestLogAppender testLogAppender = new TestLogAppender();
                 logger.addAppender(testLogAppender);
                 testLogAppender.start();
     
    -            neo4jContainer.withAdminPassword("short");
    +            neo4j.withAdminPassword("short");
     
                 testLogAppender.stop();
     
    @@ -337,11 +351,11 @@ protected void append(ILoggingEvent eventObject) {
             }
         }
     
    -    private static Driver getDriver(Neo4jContainer container) {
    +    private static Driver getDriver(Neo4jContainer neo4j) {
             AuthToken authToken = AuthTokens.none();
    -        if (container.getAdminPassword() != null) {
    -            authToken = AuthTokens.basic("neo4j", container.getAdminPassword());
    +        if (neo4j.getAdminPassword() != null) {
    +            authToken = AuthTokens.basic("neo4j", neo4j.getAdminPassword());
             }
    -        return GraphDatabase.driver(container.getBoltUrl(), authToken);
    +        return GraphDatabase.driver(neo4j.getBoltUrl(), authToken);
         }
     }
    
    From de41ece851d57ed6973177ed3f6ce2e29ed2bd74 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= 
    Date: Wed, 25 Mar 2026 16:47:21 -0600
    Subject: [PATCH 1068/1224] Fix JUnit 5 docs
    
    ---
     docs/test_framework_integration/junit_5.md | 7 +------
     1 file changed, 1 insertion(+), 6 deletions(-)
    
    diff --git a/docs/test_framework_integration/junit_5.md b/docs/test_framework_integration/junit_5.md
    index 883adc90af9..aed2d515af9 100644
    --- a/docs/test_framework_integration/junit_5.md
    +++ b/docs/test_framework_integration/junit_5.md
    @@ -1,7 +1,6 @@
     # Jupiter / JUnit 5
     
    -While Testcontainers is tightly coupled with the JUnit 4.x rule API, this module provides
    -an API that is based on the [JUnit Jupiter](https://junit.org/junit5/) extension model.
    +This module provides an API that is based on the [JUnit Jupiter](https://junit.org/junit5/) extension model.
     
     The extension supports two modes:
     
    @@ -58,10 +57,6 @@ using JUnit 5.
     
     ## Limitations
     
    -Since this module has a dependency onto JUnit Jupiter and on Testcontainers core, which
    -has a dependency onto JUnit 4.x, projects using this module will end up with both, JUnit Jupiter
    -and JUnit 4.x in the test classpath.
    -
     This extension has only been tested with sequential test execution. Using it with parallel test execution is unsupported and may have unintended side effects.
     
     ## Adding Testcontainers JUnit 5 support to your project dependencies
    
    From 990a7dc27a836077a1098a6e5172cf2d57b8ebb6 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= 
    Date: Wed, 25 Mar 2026 16:55:56 -0600
    Subject: [PATCH 1069/1224] Fix docs
    
    ---
     docs/features/creating_container.md                    | 10 ++--------
     docs/features/creating_images.md                       |  4 ++--
     .../manual_lifecycle_control.md                        |  3 +--
     3 files changed, 5 insertions(+), 12 deletions(-)
    
    diff --git a/docs/features/creating_container.md b/docs/features/creating_container.md
    index 443e04f1a91..baaea5fb36d 100644
    --- a/docs/features/creating_container.md
    +++ b/docs/features/creating_container.md
    @@ -34,14 +34,8 @@ It is suggested that developers treat `DockerImageName`s as you would any other
     A generic container rule can be used with any public docker image; for example:
     
      
    -[Creating a Redis container (JUnit 4)](../examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java) inside_block:simple
    +[Creating a Redis container](../examples/junit5/redis/src/test/java/quickstart/RedisBackedCacheIntTest.java) inside_block:container
     
     
    -Further options may be specified:
    -
    - 
    -[Creating a container with more options (JUnit 4)](../examples/junit4/generic/src/test/java/generic/ContainerCreationTest.java) inside_block:withOptions
    -
    -
    -These containers, as `@ClassRule`s, will be started before any tests in the class run, and will be destroyed after all
    +The container, as `@Container`, will be started before any tests in the class run, and will be destroyed after all
     tests have run.
    diff --git a/docs/features/creating_images.md b/docs/features/creating_images.md
    index 6f1988ed28e..8a239d342cc 100644
    --- a/docs/features/creating_images.md
    +++ b/docs/features/creating_images.md
    @@ -13,9 +13,9 @@ Testcontainers will `docker build` a temporary container image, and will use it
     
     `ImageFromDockerfile` accepts arbitrary files, strings or classpath resources to be used as files in the build context.
     At least one of these needs to be a `Dockerfile`.
    +
     ```java
    -@Rule
    -public GenericContainer dslContainer = new GenericContainer(
    +GenericContainer container = new GenericContainer(
         new ImageFromDockerfile()
                 .withFileFromString("folder/someFile.txt", "hello")
                 .withFileFromClasspath("test.txt", "mappable-resource/test-resource.txt")
    diff --git a/docs/test_framework_integration/manual_lifecycle_control.md b/docs/test_framework_integration/manual_lifecycle_control.md
    index 6de3cb47196..e1005397c00 100644
    --- a/docs/test_framework_integration/manual_lifecycle_control.md
    +++ b/docs/test_framework_integration/manual_lifecycle_control.md
    @@ -1,7 +1,6 @@
     # Manual container lifecycle control
     
    -While Testcontainers was originally built with JUnit 4 integration in mind, it is fully usable with other test 
    -frameworks, or with no framework at all.
    +Testcontainers is fully usable with any test framework, or with no framework at all.
     
     ## Manually starting/stopping containers
     
    
    From 8e5416d44f272e2db5bae141c299619e58500add Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= 
    Date: Mon, 30 Mar 2026 12:21:08 -0600
    Subject: [PATCH 1070/1224] Fix ActiveMQ docs
    
    ---
     docs/modules/activemq.md | 2 +-
     1 file changed, 1 insertion(+), 1 deletion(-)
    
    diff --git a/docs/modules/activemq.md b/docs/modules/activemq.md
    index 07cc6e75381..3e925326498 100644
    --- a/docs/modules/activemq.md
    +++ b/docs/modules/activemq.md
    @@ -1,6 +1,6 @@
     # ActiveMQ
     
    -Testcontainers module for [ActiveMQ](https://hub.docker.com/r/apache/activemq-classic) and
    +Testcontainers module for [ActiveMQ](https://hub.docker.com/r/apache/activemq) and
     [Artemis](https://hub.docker.com/r/apache/activemq-artemis).
     
     ## ActiveMQContainer's usage examples
    
    From 6a02d006010512a35d54c674524216b7b00c5ac4 Mon Sep 17 00:00:00 2001
    From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?=
     
    Date: Mon, 30 Mar 2026 13:16:43 -0600
    Subject: [PATCH 1071/1224] Support apache/artemis in ArtemisContainer (#11590)
    
    Fixes #11588
    ---
     docs/modules/activemq.md                        |  2 +-
     .../activemq/ArtemisContainer.java              |  6 +++++-
     .../activemq/ArtemisContainerTest.java          | 17 ++++++++++++++---
     3 files changed, 20 insertions(+), 5 deletions(-)
    
    diff --git a/docs/modules/activemq.md b/docs/modules/activemq.md
    index 3e925326498..7959c47576a 100644
    --- a/docs/modules/activemq.md
    +++ b/docs/modules/activemq.md
    @@ -1,7 +1,7 @@
     # ActiveMQ
     
     Testcontainers module for [ActiveMQ](https://hub.docker.com/r/apache/activemq) and
    -[Artemis](https://hub.docker.com/r/apache/activemq-artemis).
    +[Artemis](https://hub.docker.com/r/apache/artemis).
     
     ## ActiveMQContainer's usage examples
     
    diff --git a/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java b/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java
    index 7d4918a9306..82072993b48 100644
    --- a/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java
    +++ b/modules/activemq/src/main/java/org/testcontainers/activemq/ArtemisContainer.java
    @@ -9,6 +9,8 @@
     /**
      * Testcontainers implementation for Apache ActiveMQ Artemis.
      * 

    + * Supported images: {@code apache/artemis}, {@code apache/activemq-artemis} + *

    * Exposed ports: *

      *
    • Console: 8161
    • @@ -24,6 +26,8 @@ public class ArtemisContainer extends GenericContainer { private static final DockerImageName DEFAULT_IMAGE = DockerImageName.parse("apache/activemq-artemis"); + private static final DockerImageName APACHE_ARTEMIS_IMAGE = DockerImageName.parse("apache/artemis"); + private static final int WEB_CONSOLE_PORT = 8161; // CORE,MQTT,AMQP,HORNETQ,STOMP,OPENWIRE @@ -49,7 +53,7 @@ public ArtemisContainer(String image) { public ArtemisContainer(DockerImageName dockerImageName) { super(dockerImageName); - dockerImageName.assertCompatibleWith(DEFAULT_IMAGE); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE, APACHE_ARTEMIS_IMAGE); withExposedPorts(WEB_CONSOLE_PORT, TCP_PORT, HORNETQ_STOMP_PORT, AMQP_PORT, STOMP_PORT, MQTT_PORT, WS_PORT); waitingFor(Wait.forLogMessage(".*HTTP Server started.*", 1).withStartupTimeout(Duration.ofMinutes(1))); diff --git a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java index 6a3c3ecc19c..74cdfa76da7 100644 --- a/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java +++ b/modules/activemq/src/test/java/org/testcontainers/activemq/ArtemisContainerTest.java @@ -9,6 +9,8 @@ import lombok.SneakyThrows; import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import static org.assertj.core.api.Assertions.assertThat; @@ -18,7 +20,7 @@ class ArtemisContainerTest { void defaultCredentials() { try ( // container { - ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.30.0-alpine") + ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.32.0-alpine") // } ) { artemis.start(); @@ -33,7 +35,7 @@ void defaultCredentials() { void customCredentials() { try ( // settingCredentials { - ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.30.0-alpine") + ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.32.0-alpine") .withUser("testcontainers") .withPassword("testcontainers") // } @@ -50,7 +52,7 @@ void customCredentials() { void allowAnonymousLogin() { try ( // enableAnonymousLogin { - ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.30.0-alpine") + ArtemisContainer artemis = new ArtemisContainer("apache/activemq-artemis:2.32.0-alpine") .withEnv("ANONYMOUS_LOGIN", "true") // } ) { @@ -60,6 +62,15 @@ void allowAnonymousLogin() { } } + @ParameterizedTest + @ValueSource(strings = { "apache/activemq-artemis:2.32.0-alpine", "apache/artemis:2.53.0-alpine" }) + void compatibility(String image) { + try (ArtemisContainer artemis = new ArtemisContainer(image)) { + artemis.start(); + assertFunctionality(artemis, false); + } + } + @SneakyThrows private void assertFunctionality(ArtemisContainer artemis, boolean anonymousLogin) { ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(artemis.getBrokerUrl()); From 2ea4d7496b2969187f5a50977e0343f63cd68041 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:47:14 +0000 Subject: [PATCH 1072/1224] Bump org.apache.pulsar:pulsar-bom from 4.1.1 to 4.2.0 in /modules/pulsar Bumps [org.apache.pulsar:pulsar-bom](https://github.com/apache/pulsar) from 4.1.1 to 4.2.0. - [Release notes](https://github.com/apache/pulsar/releases) - [Commits](https://github.com/apache/pulsar/compare/v4.1.1...v4.2.0) --- updated-dependencies: - dependency-name: org.apache.pulsar:pulsar-bom dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 eb8053cc71b..9dee1058aa5 100644 --- a/modules/pulsar/build.gradle +++ b/modules/pulsar/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Pulsar" dependencies { api project(':testcontainers') - testImplementation platform("org.apache.pulsar:pulsar-bom:4.1.1") + testImplementation platform("org.apache.pulsar:pulsar-bom:4.2.0") testImplementation 'org.apache.pulsar:pulsar-client' testImplementation 'org.apache.pulsar:pulsar-client-admin' } From fcbf43b25bcc2c8f608ebb29c208f121cf0a423f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:47:19 +0000 Subject: [PATCH 1073/1224] Bump org.mariadb.jdbc:mariadb-java-client in /modules/mariadb Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.5.6 to 3.5.8. - [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases) - [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/main/CHANGELOG.md) - [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.6...3.5.8) --- updated-dependencies: - dependency-name: org.mariadb.jdbc:mariadb-java-client dependency-version: 3.5.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 2cfef8d924c..fd8569f6c36 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.6' + testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.8' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' From 06a85b3e498ba7ecff4e49de900dddad46281d7c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:47:24 +0000 Subject: [PATCH 1074/1224] Bump com.clickhouse:clickhouse-jdbc in /modules/clickhouse Bumps [com.clickhouse:clickhouse-jdbc](https://github.com/ClickHouse/clickhouse-java) from 0.9.4 to 0.9.8. - [Release notes](https://github.com/ClickHouse/clickhouse-java/releases) - [Changelog](https://github.com/ClickHouse/clickhouse-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/ClickHouse/clickhouse-java/compare/v0.9.4...v0.9.8) --- updated-dependencies: - dependency-name: com.clickhouse:clickhouse-jdbc dependency-version: 0.9.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/clickhouse/build.gradle | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/clickhouse/build.gradle b/modules/clickhouse/build.gradle index 91d80a687d7..59ea169583c 100644 --- a/modules/clickhouse/build.gradle +++ b/modules/clickhouse/build.gradle @@ -5,12 +5,12 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.4', classifier: 'http') + compileOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.8', classifier: 'http') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.4', classifier: 'all') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-jdbc', version: '0.9.8', classifier: 'all') - testImplementation 'com.clickhouse:client-v2:0.9.4' + testImplementation 'com.clickhouse:client-v2:0.9.8' testImplementation testFixtures(project(':testcontainers-r2dbc')) - testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.4', classifier: 'http') + testRuntimeOnly(group: 'com.clickhouse', name: 'clickhouse-r2dbc', version: '0.9.8', classifier: 'http') } From b963d1892b129c3e3026dd5d96f058bdb5e88c23 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:47:34 +0000 Subject: [PATCH 1075/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/mssqlserver Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.3.0.jre8-preview to 13.4.0.jre11. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.4.0.jre11 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 6561dbbe486..6e2628da7a2 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.3.0.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.4.0.jre11' testImplementation project(':testcontainers-r2dbc') testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' From 19964a3517d1ba79841fef06f759e892d0a30c48 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:47:42 +0000 Subject: [PATCH 1076/1224] Bump com.microsoft.sqlserver:mssql-jdbc in /modules/azure Bumps [com.microsoft.sqlserver:mssql-jdbc](https://github.com/Microsoft/mssql-jdbc) from 13.3.0.jre8-preview to 13.4.0.jre11. - [Release notes](https://github.com/Microsoft/mssql-jdbc/releases) - [Changelog](https://github.com/microsoft/mssql-jdbc/blob/main/CHANGELOG.md) - [Commits](https://github.com/Microsoft/mssql-jdbc/commits) --- updated-dependencies: - dependency-name: com.microsoft.sqlserver:mssql-jdbc dependency-version: 13.4.0.jre11 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index 796f500410b..faabca60be9 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation 'com.azure:azure-data-tables' testImplementation 'com.azure:azure-messaging-eventhubs' testImplementation 'com.azure:azure-messaging-servicebus' - testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.3.0.jre8-preview' + testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.4.0.jre11' } tasks.japicmp { From 1aa812dff14944ef4c46d54179a79120dd160138 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:47:43 +0000 Subject: [PATCH 1077/1224] Bump io.trino:trino-jdbc from 478 to 480 in /modules/trino Bumps io.trino:trino-jdbc from 478 to 480. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-version: '480' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 004bd38a8b9..82f831db36a 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:478' + testRuntimeOnly 'io.trino:trino-jdbc:480' compileOnly 'org.jetbrains:annotations:26.0.2-1' } From 0e6ddb0f3f41da0b9aa2cd23ad313420637514d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 02:56:41 +0000 Subject: [PATCH 1078/1224] Bump io.minio:minio from 8.6.0 to 9.0.0 in /modules/minio Bumps [io.minio:minio](https://github.com/minio/minio-java) from 8.6.0 to 9.0.0. - [Release notes](https://github.com/minio/minio-java/releases) - [Commits](https://github.com/minio/minio-java/compare/8.6.0...9.0.0) --- updated-dependencies: - dependency-name: io.minio:minio dependency-version: 9.0.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index 35dcecb8b95..bca68abc4d6 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testImplementation("io.minio:minio:8.6.0") + testImplementation("io.minio:minio:9.0.0") } From 41c9445d01637349336ac5eb430215d995847773 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 Apr 2026 03:01:02 +0000 Subject: [PATCH 1079/1224] Bump com.databend:databend-jdbc from 0.4.1 to 0.4.5 in /modules/databend Bumps [com.databend:databend-jdbc](https://github.com/databendcloud/databend-jdbc) from 0.4.1 to 0.4.5. - [Release notes](https://github.com/databendcloud/databend-jdbc/releases) - [Commits](https://github.com/databendcloud/databend-jdbc/commits) --- updated-dependencies: - dependency-name: com.databend:databend-jdbc dependency-version: 0.4.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 9da45a6fab9..1b9eaf4f0c8 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.databend:databend-jdbc:0.4.1' + testRuntimeOnly 'com.databend:databend-jdbc:0.4.5' } From ef3764a83a34742830d436db4cd352427fb16e96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 Apr 2026 22:21:08 +0000 Subject: [PATCH 1080/1224] Bump com.gradle:common-custom-user-data-gradle-plugin Bumps [com.gradle:common-custom-user-data-gradle-plugin](https://github.com/gradle/common-custom-user-data-gradle-plugin) from 2.4.0 to 2.5.0. - [Release notes](https://github.com/gradle/common-custom-user-data-gradle-plugin/releases) - [Commits](https://github.com/gradle/common-custom-user-data-gradle-plugin/compare/v2.4.0...v2.5.0) --- updated-dependencies: - dependency-name: com.gradle:common-custom-user-data-gradle-plugin dependency-version: 2.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle b/settings.gradle index 6784ae93160..d59d26df2df 100644 --- a/settings.gradle +++ b/settings.gradle @@ -6,7 +6,7 @@ buildscript { } dependencies { classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.19.2" - classpath "com.gradle:common-custom-user-data-gradle-plugin:2.4.0" + classpath "com.gradle:common-custom-user-data-gradle-plugin:2.5.0" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } } From a7f79aeb10270d96c8700a578308179506cda31e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 15:51:20 +0000 Subject: [PATCH 1081/1224] Bump gradle/actions from 5 to 6 Bumps [gradle/actions](https://github.com/gradle/actions) from 5 to 6. - [Release notes](https://github.com/gradle/actions/releases) - [Commits](https://github.com/gradle/actions/compare/v5...v6) --- updated-dependencies: - dependency-name: gradle/actions dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-rootless.yml | 2 +- .github/workflows/ci.yml | 6 +++--- .github/workflows/release.yml | 2 +- .github/workflows/update-gradle-wrapper.yml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci-rootless.yml b/.github/workflows/ci-rootless.yml index 05d3d6d6607..46e2b4a9a23 100644 --- a/.github/workflows/ci-rootless.yml +++ b/.github/workflows/ci-rootless.yml @@ -52,7 +52,7 @@ jobs: with: rootless: true - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - name: Build with Gradle run: ./gradlew --no-daemon --scan testcontainers:test --tests '*GenericContainerRuleTest' - uses: ./.github/actions/setup-junit-report diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8d7f5f65a27..b1ff89858e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -91,7 +91,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - id: set-matrix env: # Since we override the tests executor, @@ -126,7 +126,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - id: set-matrix working-directory: ./examples/ env: @@ -163,7 +163,7 @@ jobs: - uses: actions/checkout@v5 - uses: ./.github/actions/setup-java - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - id: set-matrix env: # Since we override the tests executor, diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bdb87788c0a..0630e826628 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -21,7 +21,7 @@ jobs: run: docker image prune -af - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - name: Run Gradle Build run: ./gradlew build --scan --no-daemon -i -x test diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index fe1174c60d6..062cf4017c9 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -24,4 +24,4 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} labels: dependencies - - uses: gradle/actions/wrapper-validation@v5 + - uses: gradle/actions/wrapper-validation@v6 From bd5863e6d0e075af8900817a8074207e5c60cd83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 Apr 2026 18:26:30 +0000 Subject: [PATCH 1082/1224] Bump org.jetbrains:annotations in /modules/selenium Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/selenium/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/selenium/build.gradle b/modules/selenium/build.gradle index 30c3c1a7619..79b525b6185 100644 --- a/modules/selenium/build.gradle +++ b/modules/selenium/build.gradle @@ -14,5 +14,5 @@ dependencies { testImplementation 'org.mortbay.jetty:jetty:6.1.26' testImplementation project(':testcontainers-nginx') - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 01d1dd67cd0b23c24f0ee4318a45479708b7abd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 8 Apr 2026 09:30:31 -0600 Subject: [PATCH 1083/1224] Ignore major update for rest-assured --- .github/dependabot.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 5e1b5000846..48739f1910c 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -22,6 +22,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.junit.platform:junit-platform-launcher" update-types: [ "version-update:semver-major" ] + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/" allow: @@ -63,6 +65,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/clickhouse" schedule: @@ -78,6 +83,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/couchbase" schedule: @@ -122,6 +130,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/hivemq" schedule: @@ -214,6 +225,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/mongodb" schedule: @@ -254,6 +268,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/openfga" schedule: @@ -328,6 +345,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/scylladb" schedule: @@ -395,6 +415,9 @@ updates: schedule: interval: "monthly" open-pull-requests-limit: 10 + ignore: + - dependency-name: "io.rest-assured:rest-assured" + update-types: [ "version-update:semver-major" ] - package-ecosystem: "gradle" directory: "/modules/weaviate" schedule: From b55d3e4c51a60ee1031063a92e2d129348491cfc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:31:45 +0000 Subject: [PATCH 1084/1224] Bump io.rest-assured:rest-assured in /modules/chromadb Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/chromadb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/chromadb/build.gradle b/modules/chromadb/build.gradle index cec94a23faa..ec41def56df 100644 --- a/modules/chromadb/build.gradle +++ b/modules/chromadb/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: ChromaDB" dependencies { api project(':testcontainers') - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' } From da25bcb0b5fb63036a6b9acd52e5af8776c1e7b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:31:46 +0000 Subject: [PATCH 1085/1224] Bump io.rest-assured:rest-assured in /modules/grafana Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 90b84ee2c6c..da11a209555 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Grafana" dependencies { api project(':testcontainers') - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.1' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' From a61963b9a5c789075df0f00f2562509b6faeda5c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:31:48 +0000 Subject: [PATCH 1086/1224] Bump io.rest-assured:rest-assured from 5.5.6 to 5.5.7 in /modules/consul Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/consul/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/consul/build.gradle b/modules/consul/build.gradle index ff88de2db29..f496a86d6fd 100644 --- a/modules/consul/build.gradle +++ b/modules/consul/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'com.ecwid.consul:consul-api:1.4.5' - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' } From 1603050276d645eec75326ae852a60c628392b11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:31:52 +0000 Subject: [PATCH 1087/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc Bumps org.apache.tomcat:tomcat-jdbc from 11.0.14 to 11.0.21. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.21 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 f34c99c0385..2b896d3724b 100644 --- a/modules/jdbc/build.gradle +++ b/modules/jdbc/build.gradle @@ -6,7 +6,7 @@ dependencies { compileOnly 'org.jetbrains:annotations:26.0.2-1' testImplementation 'commons-dbutils:commons-dbutils:1.8.1' testImplementation 'org.vibur:vibur-dbcp:26.0' - testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.14' + testImplementation 'org.apache.tomcat:tomcat-jdbc:11.0.21' testImplementation 'com.zaxxer:HikariCP-java6:2.3.13' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From 1d7bb195cc03ef295a69363d4f99183c4057fee5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:32:39 +0000 Subject: [PATCH 1088/1224] Bump io.rest-assured:rest-assured in /modules/mockserver Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/mockserver/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/mockserver/build.gradle b/modules/mockserver/build.gradle index aa06ec3af1e..2ff2e9f34c6 100644 --- a/modules/mockserver/build.gradle +++ b/modules/mockserver/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'org.mock-server:mockserver-client-java:5.15.0' - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' } From a68e065fc0b10cb1a7c863dc5f2c858a957f9dd5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:32:59 +0000 Subject: [PATCH 1089/1224] Bump io.milvus:milvus-sdk-java from 2.6.10 to 2.6.17 in /modules/milvus Bumps [io.milvus:milvus-sdk-java](https://github.com/milvus-io/milvus-sdk-java) from 2.6.10 to 2.6.17. - [Release notes](https://github.com/milvus-io/milvus-sdk-java/releases) - [Changelog](https://github.com/milvus-io/milvus-sdk-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/milvus-io/milvus-sdk-java/compare/v2.6.10...v2.6.17) --- updated-dependencies: - dependency-name: io.milvus:milvus-sdk-java dependency-version: 2.6.17 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/milvus/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/milvus/build.gradle b/modules/milvus/build.gradle index cb4ef3b2145..613971697b6 100644 --- a/modules/milvus/build.gradle +++ b/modules/milvus/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Milvus" dependencies { api project(':testcontainers') - testImplementation 'io.milvus:milvus-sdk-java:2.6.10' + testImplementation 'io.milvus:milvus-sdk-java:2.6.17' } From 2a1bd1a0e3987b30c9076ec93ba504889c069489 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:33:20 +0000 Subject: [PATCH 1090/1224] Bump io.rest-assured:rest-assured from 5.5.6 to 5.5.7 in /modules/ollama Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ollama/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ollama/build.gradle b/modules/ollama/build.gradle index 87a31296135..0da01d0ad96 100644 --- a/modules/ollama/build.gradle +++ b/modules/ollama/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Ollama" dependencies { api project(':testcontainers') - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' } From e2535eaa77ca606d244e4ea046dc0a90536b2608 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:34:15 +0000 Subject: [PATCH 1091/1224] Bump redis.clients:jedis from 7.1.0 to 7.4.1 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 7.1.0 to 7.4.1. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v7.1.0...v7.4.1) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.4.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 261f6c29384..205147293fd 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.11' - testImplementation 'redis.clients:jedis:7.1.0' + testImplementation 'redis.clients:jedis:7.4.1' } From f85aadaa68efe5b6b71f5dae01f5eeb77d93106b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:34:25 +0000 Subject: [PATCH 1092/1224] Bump io.rest-assured:rest-assured in /modules/redpanda Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index 3f60fd8db71..e560d73a848 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -5,6 +5,6 @@ dependencies { shaded 'org.freemarker:freemarker:2.3.34' testImplementation 'org.apache.kafka:kafka-clients:4.1.1' - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' testImplementation 'org.awaitility:awaitility:4.3.0' } From 9f3e62cd7ce36609c2136380b9b0ce4fea060044 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 15:46:06 +0000 Subject: [PATCH 1093/1224] Bump io.rest-assured:rest-assured from 5.5.6 to 5.5.7 in /modules/vault Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 7c222d4b064..bbf7929c4e7 100644 --- a/modules/vault/build.gradle +++ b/modules/vault/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation 'com.bettercloud:vault-java-driver:5.1.0' - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' } From db2f9010564e8574cb73a5d245beae2900e9d480 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 8 Apr 2026 11:46:07 -0600 Subject: [PATCH 1094/1224] Cleanup dependencies --- docs/examples/junit5/redis/build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/examples/junit5/redis/build.gradle b/docs/examples/junit5/redis/build.gradle index 3404178b957..277ec0b8ae5 100644 --- a/docs/examples/junit5/redis/build.gradle +++ b/docs/examples/junit5/redis/build.gradle @@ -3,9 +3,7 @@ description = "Examples for docs" dependencies { api "io.lettuce:lettuce-core:6.8.0.RELEASE" - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.13.4' - testImplementation 'org.junit.jupiter:junit-jupiter-params:5.13.4' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.13.4' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.10.3' testImplementation project(":testcontainers") testImplementation project(":testcontainers-junit-jupiter") From 65507da8f155a6ea5373b0211f7406f74ee0e233 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 22:11:03 +0000 Subject: [PATCH 1095/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-free Bumps com.oracle.database.jdbc:ojdbc11 from 23.26.0.0.0 to 23.26.1.0.0. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.26.1.0.0 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index e7cc9669632..5d2eeecab5c 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.1.0.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' From cfc475ece29225dabdab36d15aea84142204d98c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 22:11:04 +0000 Subject: [PATCH 1096/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-xe Bumps com.oracle.database.jdbc:ojdbc11 from 23.26.0.0.0 to 23.26.1.0.0. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.26.1.0.0 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/oracle-xe/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-xe/build.gradle b/modules/oracle-xe/build.gradle index 6faeeb9367e..856ee74a065 100644 --- a/modules/oracle-xe/build.gradle +++ b/modules/oracle-xe/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.0.0.0' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.1.0.0' compileOnly 'org.jetbrains:annotations:26.0.2-1' From 7219459ad3260abffb6958075433ec07bfd9a7fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 22:11:16 +0000 Subject: [PATCH 1097/1224] Bump org.assertj:assertj-core in /modules/jdbc-test Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.27.6 to 3.27.7. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.27.6...assertj-build-3.27.7) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-version: 3.27.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 f7b081acf7b..128fd059841 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -6,7 +6,7 @@ dependencies { api 'com.zaxxer:HikariCP-java6:2.3.13' api 'commons-dbutils:commons-dbutils:1.8.1' - api 'org.assertj:assertj-core:3.27.6' + api 'org.assertj:assertj-core:3.27.7' api 'org.apache.tomcat:tomcat-jdbc:11.0.14' api 'org.vibur:vibur-dbcp:26.0' From f216c42335df8bdc07e6bc7c144250108542115e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Apr 2026 22:11:18 +0000 Subject: [PATCH 1098/1224] Bump com.mysql:mysql-connector-j in /modules/jdbc-test Bumps [com.mysql:mysql-connector-j](https://github.com/mysql/mysql-connector-j) from 9.5.0 to 9.6.0. - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/9.x/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/9.5.0...9.6.0) --- updated-dependencies: - dependency-name: com.mysql:mysql-connector-j dependency-version: 9.6.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 f7b081acf7b..70bf000d4bb 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -10,6 +10,6 @@ dependencies { api 'org.apache.tomcat:tomcat-jdbc:11.0.14' api 'org.vibur:vibur-dbcp:26.0' - api 'com.mysql:mysql-connector-j:9.5.0' + api 'com.mysql:mysql-connector-j:9.6.0' api 'org.junit.jupiter:junit-jupiter:5.14.1' } From 37262149abb92b06a411ab21e6b8aae74c2ef105 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 03:43:36 +0000 Subject: [PATCH 1099/1224] Bump io.qdrant:client from 1.16.1 to 1.17.0 in /modules/qdrant Bumps [io.qdrant:client](https://github.com/qdrant/java-client) from 1.16.1 to 1.17.0. - [Release notes](https://github.com/qdrant/java-client/releases) - [Commits](https://github.com/qdrant/java-client/compare/v1.16.1...v1.17.0) --- updated-dependencies: - dependency-name: io.qdrant:client dependency-version: 1.17.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 849cafeb37f..5d695095300 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Qdrant" dependencies { api project(':testcontainers') - testImplementation 'io.qdrant:client:1.16.1' + testImplementation 'io.qdrant:client:1.17.0' testImplementation platform('io.grpc:grpc-bom:1.75.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' From 5fa1ebe7746cbaf56af9c04e6f34d7b12a8039d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 03:43:41 +0000 Subject: [PATCH 1100/1224] Bump org.typesense:typesense-java in /modules/typesense Bumps [org.typesense:typesense-java](https://github.com/typesense/typesense-java) from 2.0.0 to 2.1.0. - [Release notes](https://github.com/typesense/typesense-java/releases) - [Commits](https://github.com/typesense/typesense-java/commits) --- updated-dependencies: - dependency-name: org.typesense:typesense-java dependency-version: 2.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/typesense/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/typesense/build.gradle b/modules/typesense/build.gradle index 17d6135b604..87aef78cad1 100644 --- a/modules/typesense/build.gradle +++ b/modules/typesense/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: Typesense" dependencies { api project(':testcontainers') - testImplementation 'org.typesense:typesense-java:2.0.0' + testImplementation 'org.typesense:typesense-java:2.1.0' } From 80bc3a8f91154b29a10c279dab855a72737755ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 05:33:30 +0000 Subject: [PATCH 1101/1224] Bump io.grpc:grpc-bom from 1.75.0 to 1.80.0 in /modules/qdrant Bumps [io.grpc:grpc-bom](https://github.com/grpc/grpc-java) from 1.75.0 to 1.80.0. - [Release notes](https://github.com/grpc/grpc-java/releases) - [Commits](https://github.com/grpc/grpc-java/compare/v1.75.0...v1.80.0) --- updated-dependencies: - dependency-name: io.grpc:grpc-bom dependency-version: 1.80.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/qdrant/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/qdrant/build.gradle b/modules/qdrant/build.gradle index 5d695095300..98b8fc403fc 100644 --- a/modules/qdrant/build.gradle +++ b/modules/qdrant/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'io.qdrant:client:1.17.0' - testImplementation platform('io.grpc:grpc-bom:1.75.0') + testImplementation platform('io.grpc:grpc-bom:1.80.0') testImplementation 'io.grpc:grpc-stub' testImplementation 'io.grpc:grpc-protobuf' testImplementation 'io.grpc:grpc-netty-shaded' From fa7e79b232bdec182c46134ddf791ee7969f9f93 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Thu, 9 Apr 2026 09:27:36 -0600 Subject: [PATCH 1102/1224] Ignore major update for junit-bom --- .github/dependabot.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 48739f1910c..57d781044cc 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -456,6 +456,8 @@ updates: update-types: [ "version-update:semver-major" ] - dependency-name: "org.junit.platform:junit-platform-launcher" update-types: [ "version-update:semver-major" ] + - dependency-name: "org.junit:junit-bom" + update-types: [ "version-update:semver-major" ] - dependency-name: "com.gradleup.shadow" update-types: [ "version-update:semver-major" ] From 851aaef29aabeda1f480a4fe987380a6bfe9129e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:43:50 +0000 Subject: [PATCH 1103/1224] Bump com.databend:databend-jdbc from 0.4.5 to 0.4.6 in /modules/databend Bumps [com.databend:databend-jdbc](https://github.com/databendcloud/databend-jdbc) from 0.4.5 to 0.4.6. - [Release notes](https://github.com/databendcloud/databend-jdbc/releases) - [Commits](https://github.com/databendcloud/databend-jdbc/commits/v0.4.6) --- updated-dependencies: - dependency-name: com.databend:databend-jdbc dependency-version: 0.4.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/databend/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/databend/build.gradle b/modules/databend/build.gradle index 1b9eaf4f0c8..7a779d3ca20 100644 --- a/modules/databend/build.gradle +++ b/modules/databend/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.databend:databend-jdbc:0.4.5' + testRuntimeOnly 'com.databend:databend-jdbc:0.4.6' } From 085ab379ae1b8d4b98f5f3ad97b69745faff7252 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:52:49 +0000 Subject: [PATCH 1104/1224] Bump org.postgresql:postgresql in /modules/junit-jupiter Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.8 to 42.7.10. - [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.7.8...REL42.7.10) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b9c2fc7bcee..e362b51c756 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -14,6 +14,6 @@ dependencies { exclude(module: 'hamcrest-core') } - testRuntimeOnly 'org.postgresql:postgresql:42.7.8' + testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' } From c4709ac64d549e60d3163d7e62ce93c4bd3f7d1f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:52:54 +0000 Subject: [PATCH 1105/1224] Bump org.postgresql:postgresql in /modules/postgresql Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.8 to 42.7.10. - [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.7.8...REL42.7.10) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 cf1c69a9a19..73e424f9ffc 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.8' + testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' From 767aa923d175c7748d0b56b1b176239b22acff26 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:53:02 +0000 Subject: [PATCH 1106/1224] Bump org.jetbrains:annotations in /modules/postgresql Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 cf1c69a9a19..d2c1948bf86 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -12,5 +12,5 @@ dependencies { testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 5e22ac7430453c432b160ec0298179f06e2e9e53 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Apr 2026 22:53:23 +0000 Subject: [PATCH 1107/1224] Bump org.postgresql:postgresql from 42.7.8 to 42.7.10 in /modules/spock Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.8 to 42.7.10. - [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.7.8...REL42.7.10) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.10 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 7522d7f697f..b45362a8e63 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'com.zaxxer:HikariCP:7.0.2' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testRuntimeOnly 'org.postgresql:postgresql:42.7.8' + testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' testRuntimeOnly platform('org.junit:junit-bom:5.14.1') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' From f943e8cbeb1200cd38856d6b1a525c0b63a4d79c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:01:17 +0000 Subject: [PATCH 1108/1224] Bump org.junit:junit-bom from 5.14.1 to 5.14.3 in /modules/spock Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.14.1 to 5.14.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.14.1...r5.14.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.14.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b45362a8e63..7ed9214dd11 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -17,7 +17,7 @@ dependencies { testRuntimeOnly 'org.postgresql:postgresql:42.7.10' testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' - testRuntimeOnly platform('org.junit:junit-bom:5.14.1') + testRuntimeOnly platform('org.junit:junit-bom:5.14.3') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' From 32fe73aa702e6328f166f4991a2d3c461136f635 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:01:23 +0000 Subject: [PATCH 1109/1224] Bump org.junit:junit-bom from 5.14.1 to 5.14.3 in /modules/junit-jupiter Bumps [org.junit:junit-bom](https://github.com/junit-team/junit-framework) from 5.14.1 to 5.14.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.14.1...r5.14.3) --- updated-dependencies: - dependency-name: org.junit:junit-bom dependency-version: 5.14.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 e362b51c756..d6689bee21d 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -2,7 +2,7 @@ description = "Testcontainers :: JUnit Jupiter Extension" dependencies { api project(':testcontainers') - implementation platform('org.junit:junit-bom:5.14.1') + implementation platform('org.junit:junit-bom:5.14.3') implementation 'org.junit.jupiter:junit-jupiter-api' testImplementation project(':testcontainers-mysql') From 5f9b0034afa70c42a110f6ca1c18560389c3dfd3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:01:32 +0000 Subject: [PATCH 1110/1224] Bump org.junit.jupiter:junit-jupiter in /modules/r2dbc Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.14.1 to 5.14.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.14.1...r5.14.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.14.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 3a2a55c7f0d..8854a19ee46 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -13,5 +13,5 @@ dependencies { testFixturesImplementation 'io.projectreactor:reactor-core:3.8.1' testFixturesImplementation 'org.assertj:assertj-core:3.27.7' - testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.1' + testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.3' } From c31d51f1ff113be4089dfec6deaf2aae4792d20f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 07:01:41 +0000 Subject: [PATCH 1111/1224] Bump org.junit.jupiter:junit-jupiter in /modules/jdbc-test Bumps [org.junit.jupiter:junit-jupiter](https://github.com/junit-team/junit-framework) from 5.14.1 to 5.14.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/compare/r5.14.1...r5.14.3) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter dependency-version: 5.14.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 d3f04a3a3f6..15d1d11226a 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -11,5 +11,5 @@ dependencies { api 'org.apache.tomcat:tomcat-jdbc:11.0.14' api 'org.vibur:vibur-dbcp:26.0' api 'com.mysql:mysql-connector-j:9.6.0' - api 'org.junit.jupiter:junit-jupiter:5.14.1' + api 'org.junit.jupiter:junit-jupiter:5.14.3' } From c8debe622a4e631ec3d9f62b0694fe75859b1b98 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 08:44:33 +0000 Subject: [PATCH 1112/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 11.0.14 to 11.0.21. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.21 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 15d1d11226a..cbf94737eed 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.7' - api 'org.apache.tomcat:tomcat-jdbc:11.0.14' + api 'org.apache.tomcat:tomcat-jdbc:11.0.21' api 'org.vibur:vibur-dbcp:26.0' api 'com.mysql:mysql-connector-j:9.6.0' api 'org.junit.jupiter:junit-jupiter:5.14.3' From 8205eb3c123a66e4d32004e7b0df9e91b154b0cb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 08:44:44 +0000 Subject: [PATCH 1113/1224] Bump redis.clients:jedis from 7.1.0 to 7.4.1 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 7.1.0 to 7.4.1. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v7.1.0...v7.4.1) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.4.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 d6689bee21d..7f4d55e9bd3 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.2' - testImplementation 'redis.clients:jedis:7.1.0' + testImplementation 'redis.clients:jedis:7.4.1' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From 58947d3ac71bbe14d6fe63f8e2a0df5b70e1cfae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 08:44:44 +0000 Subject: [PATCH 1114/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.8.1 to 3.8.4. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.8.1...v3.8.4) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-version: 3.8.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index 8854a19ee46..afad9a553ef 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.8.1' + testFixturesImplementation 'io.projectreactor:reactor-core:3.8.4' testFixturesImplementation 'org.assertj:assertj-core:3.27.7' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.3' } From 1917ff470e49f5482ae0c5662c64d4974f3a25ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 12 Apr 2026 03:46:30 -0500 Subject: [PATCH 1115/1224] Update gradle/actions/setup-gradle version to v6 --- .github/actions/setup-gradle/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-gradle/action.yml b/.github/actions/setup-gradle/action.yml index c97d776e04f..76d1b0ff4b2 100644 --- a/.github/actions/setup-gradle/action.yml +++ b/.github/actions/setup-gradle/action.yml @@ -4,7 +4,7 @@ runs: using: "composite" steps: - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v4 + uses: gradle/actions/setup-gradle@v6 with: gradle-home-cache-includes: | caches From c713d0257bffb3f7b026f54c840ebcd1c5f4f32f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 12 Apr 2026 03:46:48 -0500 Subject: [PATCH 1116/1224] Update actions/setup-java version to v5 --- .github/actions/setup-java/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-java/action.yml b/.github/actions/setup-java/action.yml index ee8c3323fc1..093fbc2e7fd 100644 --- a/.github/actions/setup-java/action.yml +++ b/.github/actions/setup-java/action.yml @@ -8,7 +8,7 @@ inputs: runs: using: "composite" steps: - - uses: actions/setup-java@v4 + - uses: actions/setup-java@v5 with: java-version: ${{ inputs.java-version }} distribution: temurin From 6b4018f65e890285f12ed039551ff7535bb1a3f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 12 Apr 2026 04:10:15 -0500 Subject: [PATCH 1117/1224] Update mikepenz/action-junit-report version to v6 --- .github/actions/setup-junit-report/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup-junit-report/action.yml b/.github/actions/setup-junit-report/action.yml index 538af9af21f..df0af39297f 100644 --- a/.github/actions/setup-junit-report/action.yml +++ b/.github/actions/setup-junit-report/action.yml @@ -4,7 +4,7 @@ runs: using: "composite" steps: - name: Publish Test Report - uses: mikepenz/action-junit-report@v4 + uses: mikepenz/action-junit-report@v6 if: always() # always run even if the previous step fails with: report_paths: '**/build/test-results/test/TEST-*.xml' From c6abf4a23eebc08bb6d64937d6023cdce307ff97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Sun, 12 Apr 2026 04:07:19 -0600 Subject: [PATCH 1118/1224] Polish CI workflows (#11686) --- .github/workflows/ci-rootless.yml | 3 +-- .github/workflows/ci.yml | 12 +++--------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/ci-rootless.yml b/.github/workflows/ci-rootless.yml index 46e2b4a9a23..d21030fb82e 100644 --- a/.github/workflows/ci-rootless.yml +++ b/.github/workflows/ci-rootless.yml @@ -51,8 +51,7 @@ jobs: uses: docker/setup-docker-action@v4 with: rootless: true - - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v6 + - uses: ./.github/actions/setup-build - name: Build with Gradle run: ./gradlew --no-daemon --scan testcontainers:test --tests '*GenericContainerRuleTest' - uses: ./.github/actions/setup-junit-report diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b1ff89858e1..48dedc8463b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -89,9 +89,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v5 - - uses: ./.github/actions/setup-java - - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v6 + - uses: ./.github/actions/setup-build - id: set-matrix env: # Since we override the tests executor, @@ -124,9 +122,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v5 - - uses: ./.github/actions/setup-java - - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v6 + - uses: ./.github/actions/setup-build - id: set-matrix working-directory: ./examples/ env: @@ -161,9 +157,7 @@ jobs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - uses: actions/checkout@v5 - - uses: ./.github/actions/setup-java - - name: Setup Gradle Build Action - uses: gradle/actions/setup-gradle@v6 + - uses: ./.github/actions/setup-build - id: set-matrix env: # Since we override the tests executor, From b0a027dcff4215092c80ad96bd70c0f9ae8a7a67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 12 Apr 2026 05:54:36 -0500 Subject: [PATCH 1119/1224] Update directories for github actions via dependabot --- .github/dependabot.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 57d781044cc..789ec351da2 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -481,7 +481,9 @@ updates: # GitHub Actions - package-ecosystem: "github-actions" - directory: "/" + directories: + - /.github/workflows + - /.github/actions/** schedule: interval: "weekly" open-pull-requests-limit: 10 From 79828c666169da6136a2dcee7204f165427c3b0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 10:56:02 +0000 Subject: [PATCH 1120/1224] Bump software.amazon.awssdk:bom in /modules/localstack Bumps software.amazon.awssdk:bom from 2.40.4 to 2.42.33. --- updated-dependencies: - dependency-name: software.amazon.awssdk:bom dependency-version: 2.42.33 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 130f7cdfef7..3af7b5cee55 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testImplementation platform("software.amazon.awssdk:bom:2.40.4") + testImplementation platform("software.amazon.awssdk:bom:2.42.33") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' testImplementation 'software.amazon.awssdk:cloudwatchlogs' From 1147680ec7469cd6bb59dee5ca0fbb65fe3aed95 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 11:00:17 +0000 Subject: [PATCH 1121/1224] Bump actions/checkout from 5 to 6 in /.github/workflows Bumps [actions/checkout](https://github.com/actions/checkout) from 5 to 6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v5...v6) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: '6' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-docker-wormhole.yml | 2 +- .github/workflows/ci-rootless.yml | 2 +- .github/workflows/ci-windows.yml | 4 ++-- .github/workflows/ci.yml | 16 ++++++++-------- .github/workflows/moby-latest.yml | 2 +- .github/workflows/release.yml | 2 +- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-gradle-wrapper.yml | 2 +- .../workflows/update-testcontainers-version.yml | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/ci-docker-wormhole.yml b/.github/workflows/ci-docker-wormhole.yml index 9359316a924..45957af1e28 100644 --- a/.github/workflows/ci-docker-wormhole.yml +++ b/.github/workflows/ci-docker-wormhole.yml @@ -44,7 +44,7 @@ jobs: in-docker_test: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Build with Gradle run: | docker run -i --rm \ diff --git a/.github/workflows/ci-rootless.yml b/.github/workflows/ci-rootless.yml index d21030fb82e..3122bd88069 100644 --- a/.github/workflows/ci-rootless.yml +++ b/.github/workflows/ci-rootless.yml @@ -46,7 +46,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Setup rootless Docker uses: docker/setup-docker-action@v4 with: diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index f039f6597b7..6a3c2372a5d 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -52,7 +52,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - name: Build with Gradle run: ./gradlew.bat cleanTest testcontainers:test --no-daemon --continue --scan --no-build-cache @@ -78,7 +78,7 @@ jobs: target_url: `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`, context: 'CI - Windows', }) - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: token: ${{ secrets.GITHUB_TOKEN }} repository: ${{ github.event.client_payload.pull_request.head.repo.full_name }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48dedc8463b..bc128acb50c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -54,7 +54,7 @@ jobs: matrix: java: [ '17', '21' ] steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build with: java-version: ${{ matrix.java }} @@ -69,7 +69,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - name: Setup Testcontainers Cloud Client uses: atomicjar/testcontainers-cloud-setup-action@main @@ -88,7 +88,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - id: set-matrix env: @@ -108,7 +108,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - name: Build and test with Gradle (${{matrix.gradle_args}}) run: | @@ -121,7 +121,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - id: set-matrix working-directory: ./examples/ @@ -142,7 +142,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - name: Build and test Examples with Gradle (${{matrix.gradle_args}}) working-directory: ./examples/ @@ -156,7 +156,7 @@ jobs: outputs: matrix: ${{ steps.set-matrix.outputs.matrix }} steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - id: set-matrix env: @@ -176,7 +176,7 @@ jobs: permissions: checks: write steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - name: Build and test with Gradle (${{matrix.gradle_args}}) run: | diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index aa6a8afa809..75e1ea92550 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -27,7 +27,7 @@ jobs: runs-on: ubuntu-22.04 continue-on-error: true steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-build - name: Install Stable Docker diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0630e826628..78d644971f8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -15,7 +15,7 @@ jobs: release: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - uses: ./.github/actions/setup-java - name: Clear existing docker image cache run: docker image prune -af diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index 6e9981b19ac..631026eca84 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -15,7 +15,7 @@ jobs: if: github.repository == 'testcontainers/testcontainers-java' runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: main - name: Update latest_version property in mkdocs.yml diff --git a/.github/workflows/update-gradle-wrapper.yml b/.github/workflows/update-gradle-wrapper.yml index 062cf4017c9..9f710f30ec5 100644 --- a/.github/workflows/update-gradle-wrapper.yml +++ b/.github/workflows/update-gradle-wrapper.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 - name: Update Gradle Wrapper uses: gradle-update/update-gradle-wrapper-action@512b1875f3b6270828abfe77b247d5895a2da1e5 # v1.0.13 diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index 9cf679e8952..a51fe6ff2a6 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -15,7 +15,7 @@ jobs: if: github.repository == 'testcontainers/testcontainers-java' runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v5 + - uses: actions/checkout@v6 with: ref: main - name: Update testcontainers.version property in gradle.properties From 1c40be20bc6074ce796295611002cca140337c45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 11:00:20 +0000 Subject: [PATCH 1122/1224] Bump docker/setup-docker-action from 4 to 5 in /.github/workflows Bumps [docker/setup-docker-action](https://github.com/docker/setup-docker-action) from 4 to 5. - [Release notes](https://github.com/docker/setup-docker-action/releases) - [Commits](https://github.com/docker/setup-docker-action/compare/v4...v5) --- updated-dependencies: - dependency-name: docker/setup-docker-action dependency-version: '5' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-rootless.yml | 2 +- .github/workflows/moby-latest.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci-rootless.yml b/.github/workflows/ci-rootless.yml index d21030fb82e..73345ca7308 100644 --- a/.github/workflows/ci-rootless.yml +++ b/.github/workflows/ci-rootless.yml @@ -48,7 +48,7 @@ jobs: steps: - uses: actions/checkout@v5 - name: Setup rootless Docker - uses: docker/setup-docker-action@v4 + uses: docker/setup-docker-action@v5 with: rootless: true - uses: ./.github/actions/setup-build diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index aa6a8afa809..40bcd367088 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -32,7 +32,7 @@ jobs: - name: Install Stable Docker id: setup_docker - uses: docker/setup-docker-action@v4 + uses: docker/setup-docker-action@v5 with: version: ${{ matrix.version }} channel: ${{ matrix.channel }} From dbf7211c277b0b887c9b338e283aea4f740241c1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 11:00:24 +0000 Subject: [PATCH 1123/1224] Bump actions/github-script from 8 to 9 in /.github/workflows Bumps [actions/github-script](https://github.com/actions/github-script) from 8 to 9. - [Release notes](https://github.com/actions/github-script/releases) - [Commits](https://github.com/actions/github-script/compare/v8...v9) --- updated-dependencies: - dependency-name: actions/github-script dependency-version: '9' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-windows.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index f039f6597b7..c2f59d1cf80 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -66,7 +66,7 @@ jobs: statuses: write steps: - name: Create pending status - uses: actions/github-script@v8 + uses: actions/github-script@v9 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | @@ -89,7 +89,7 @@ jobs: - uses: ./.github/actions/setup-junit-report - name: Create success status - uses: actions/github-script@v8 + uses: actions/github-script@v9 if: success() with: github-token: ${{ secrets.GITHUB_TOKEN }} @@ -104,7 +104,7 @@ jobs: }) - name: Create failure status - uses: actions/github-script@v8 + uses: actions/github-script@v9 if: failure() with: github-token: ${{ secrets.GITHUB_TOKEN }} From 99b52bdfbafaa710412f606582e8a8571418e310 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 11:00:29 +0000 Subject: [PATCH 1124/1224] Bump peter-evans/create-pull-request in /.github/workflows Bumps [peter-evans/create-pull-request](https://github.com/peter-evans/create-pull-request) from 7.0.8 to 8.1.1. - [Release notes](https://github.com/peter-evans/create-pull-request/releases) - [Commits](https://github.com/peter-evans/create-pull-request/compare/271a8d0340265f705b14b6d32b9829c1cb33d45e...5f6978faf089d4d20b00c7766989d076bb2fc7f1) --- updated-dependencies: - dependency-name: peter-evans/create-pull-request dependency-version: 8.1.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/update-docs-version.yml | 2 +- .github/workflows/update-testcontainers-version.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/update-docs-version.yml b/.github/workflows/update-docs-version.yml index 6e9981b19ac..6a18801e7ad 100644 --- a/.github/workflows/update-docs-version.yml +++ b/.github/workflows/update-docs-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/latest_version: .*/latest_version: ${GITHUB_REF_NAME}/g" mkdocs.yml git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v3.10.1 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v3.10.1 with: title: Update docs version to ${{ github.ref_name }} body: | diff --git a/.github/workflows/update-testcontainers-version.yml b/.github/workflows/update-testcontainers-version.yml index 9cf679e8952..b980aa4ebf7 100644 --- a/.github/workflows/update-testcontainers-version.yml +++ b/.github/workflows/update-testcontainers-version.yml @@ -23,7 +23,7 @@ jobs: sed -i "s/^testcontainers\.version=.*/testcontainers\.version=${GITHUB_REF_NAME}/g" gradle.properties git diff - name: Create Pull Request - uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v3.10.1 + uses: peter-evans/create-pull-request@5f6978faf089d4d20b00c7766989d076bb2fc7f1 # v3.10.1 with: title: Update testcontainers version to ${{ github.ref_name }} body: | From af7f5043dbaf4f95e47804352f65bca7f6dd757d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 11:00:35 +0000 Subject: [PATCH 1125/1224] Bump slackapi/slack-github-action in /.github/workflows Bumps [slackapi/slack-github-action](https://github.com/slackapi/slack-github-action) from 2.1.1 to 3.0.1. - [Release notes](https://github.com/slackapi/slack-github-action/releases) - [Commits](https://github.com/slackapi/slack-github-action/compare/v2.1.1...v3.0.1) --- updated-dependencies: - dependency-name: slackapi/slack-github-action dependency-version: 3.0.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/moby-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index aa6a8afa809..b4f2bfae215 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -50,7 +50,7 @@ jobs: - name: Notify to Slack on failures if: failure() id: slack - uses: slackapi/slack-github-action@v2.1.1 + uses: slackapi/slack-github-action@v3.0.1 with: payload: | { From 01f0f1de7b1bdcb59f5e28e5dc6dcea3c8da4e35 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 11:00:38 +0000 Subject: [PATCH 1126/1224] Bump peter-evans/slash-command-dispatch in /.github/workflows Bumps [peter-evans/slash-command-dispatch](https://github.com/peter-evans/slash-command-dispatch) from 4.0.0 to 5.0.2. - [Release notes](https://github.com/peter-evans/slash-command-dispatch/releases) - [Commits](https://github.com/peter-evans/slash-command-dispatch/compare/13bc09769d122a64f75aa5037256f6f2d78be8c4...9bdcd7914ec1b75590b790b844aa3b8eee7c683a) --- updated-dependencies: - dependency-name: peter-evans/slash-command-dispatch dependency-version: 5.0.2 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/ci-windows-trigger.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci-windows-trigger.yml b/.github/workflows/ci-windows-trigger.yml index 540ab221dbf..ce5d40a173b 100644 --- a/.github/workflows/ci-windows-trigger.yml +++ b/.github/workflows/ci-windows-trigger.yml @@ -15,7 +15,7 @@ jobs: steps: - name: Trigger windows-test command - uses: peter-evans/slash-command-dispatch@13bc09769d122a64f75aa5037256f6f2d78be8c4 # v4.0.0 + uses: peter-evans/slash-command-dispatch@9bdcd7914ec1b75590b790b844aa3b8eee7c683a # v5.0.2 with: token: ${{ secrets.WINDOWS_WORKERS_TOKEN }} # The command to trigger the pipeline: e.g. /windows-test From 6cbf148cc224f6b77607e72967c55ba4465b750f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:11:37 +0000 Subject: [PATCH 1127/1224] Bump org.jetbrains:annotations in /modules/cratedb Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index 3a93f97cae8..7b6a3468e03 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -7,5 +7,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 92433175ee4ebc3710ac200cffc65e5d6d884330 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:11:39 +0000 Subject: [PATCH 1128/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /modules/tidb Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/tidb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/tidb/build.gradle b/modules/tidb/build.gradle index 7cf52e57ca9..a59b1f6a84e 100644 --- a/modules/tidb/build.gradle +++ b/modules/tidb/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From f54a0c69619bb03697bd475ca7fe70bd95e5a2fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:11:52 +0000 Subject: [PATCH 1129/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /modules/trino Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index 82f831db36a..e6a9b32e85b 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -5,5 +5,5 @@ dependencies { testImplementation project(':testcontainers-jdbc-test') testRuntimeOnly 'io.trino:trino-jdbc:480' - compileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' } From 468cb413f8a25790d4170d22c922fb2f959b1c7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:12:08 +0000 Subject: [PATCH 1130/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /modules/spock Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 7ed9214dd11..acea4c64eeb 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -21,7 +21,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'org.junit.platform:junit-platform-testkit' - testCompileOnly 'org.jetbrains:annotations:26.0.2-1' + testCompileOnly 'org.jetbrains:annotations:26.1.0' } tasks.withType(GroovyCompile) { From 221f7a7131d5caa14bd68e3ea2da37ac6e369c1c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:59:27 +0000 Subject: [PATCH 1131/1224] Bump com.hivemq:hivemq-mqtt-client in /modules/hivemq Bumps [com.hivemq:hivemq-mqtt-client](https://github.com/hivemq/hivemq-mqtt-client) from 1.3.10 to 1.3.13. - [Release notes](https://github.com/hivemq/hivemq-mqtt-client/releases) - [Changelog](https://github.com/hivemq/hivemq-mqtt-client/blob/master/RELEASE.md) - [Commits](https://github.com/hivemq/hivemq-mqtt-client/compare/1.3.10...v1.3.13) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-mqtt-client dependency-version: 1.3.13 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 8c1b2c02034..f20d5875319 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.47.1") - testImplementation("com.hivemq:hivemq-mqtt-client:1.3.10") + testImplementation("com.hivemq:hivemq-mqtt-client:1.3.13") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.22") } From 16726cb795e89d0deae04d075ef1bb9fa5befc0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 22:31:10 +0000 Subject: [PATCH 1132/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 4.1.1 to 4.2.0. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-version: 4.2.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index e560d73a848..dc544fd394b 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.34' - testImplementation 'org.apache.kafka:kafka-clients:4.1.1' + testImplementation 'org.apache.kafka:kafka-clients:4.2.0' testImplementation 'io.rest-assured:rest-assured:5.5.7' testImplementation 'org.awaitility:awaitility:4.3.0' } From 3de666511344ea4b4e81cadacbccd8ca3c241f42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:45:32 +0000 Subject: [PATCH 1133/1224] Bump org.neo4j.driver:neo4j-java-driver in /modules/neo4j Bumps [org.neo4j.driver:neo4j-java-driver](https://github.com/neo4j/neo4j-java-driver) from 4.4.21 to 4.4.22. - [Release notes](https://github.com/neo4j/neo4j-java-driver/releases) - [Commits](https://github.com/neo4j/neo4j-java-driver/compare/4.4.21...4.4.22) --- updated-dependencies: - dependency-name: org.neo4j.driver:neo4j-java-driver dependency-version: 4.4.22 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 b8bc956b825..96f73b3bb81 100644 --- a/modules/neo4j/build.gradle +++ b/modules/neo4j/build.gradle @@ -33,5 +33,5 @@ dependencies { api project(":testcontainers") - testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.21' + testImplementation 'org.neo4j.driver:neo4j-java-driver:4.4.22' } From f39e19d034133fe06029bdf56a7ae05a51a326cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 13:45:33 +0000 Subject: [PATCH 1134/1224] Bump io.fabric8:kubernetes-client from 7.4.0 to 7.6.1 in /modules/k3s Bumps [io.fabric8:kubernetes-client](https://github.com/fabric8io/kubernetes-client) from 7.4.0 to 7.6.1. - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v7.4.0...v7.6.1) --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-version: 7.6.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 010494fe94c..645dfd8e68d 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -6,6 +6,6 @@ dependencies { // Synchronize with the jackson version, must match major and minor version shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' - testImplementation 'io.fabric8:kubernetes-client:7.4.0' + testImplementation 'io.fabric8:kubernetes-client:7.6.1' testImplementation 'io.kubernetes:client-java:25.0.0-legacy' } From d71f4021b758fc908104e2593d2d2b4d311b7d24 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:47:47 +0000 Subject: [PATCH 1135/1224] Bump dev.openfga:openfga-sdk from 0.9.4 to 0.9.7 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.9.4 to 0.9.7. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.9.4...v0.9.7) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-version: 0.9.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index c483eb8e5e6..983c42f2efd 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') - testImplementation 'dev.openfga:openfga-sdk:0.9.4' + testImplementation 'dev.openfga:openfga-sdk:0.9.7' } test { From 06bfdcbe72721e38ce98b1fe200a8adb424e3471 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 14:49:19 +0000 Subject: [PATCH 1136/1224] Bump io.rest-assured:rest-assured from 5.5.6 to 5.5.7 in /core Bumps [io.rest-assured:rest-assured](https://github.com/rest-assured/rest-assured) from 5.5.6 to 5.5.7. - [Changelog](https://github.com/rest-assured/rest-assured/blob/master/changelog.txt) - [Commits](https://github.com/rest-assured/rest-assured/compare/rest-assured-5.5.6...rest-assured-5.5.7) --- updated-dependencies: - dependency-name: io.rest-assured:rest-assured dependency-version: 5.5.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index fd6bb2df579..1bc76a8b047 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -116,7 +116,7 @@ dependencies { testImplementation files('testlib/repo/fakejar/fakejar/0/fakejar-0.jar') testImplementation 'org.assertj:assertj-core:3.27.7' - testImplementation 'io.rest-assured:rest-assured:5.5.6' + testImplementation 'io.rest-assured:rest-assured:5.5.7' jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" From 7007c49a31dfa75b6867b0a8d91b2f28f96879e4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:38:36 +0000 Subject: [PATCH 1137/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.2.2 to 9.3.3. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/CHANGELOG.md) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.2.2...v9.3.3) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.3.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 860a7d11526..114a07ffe85 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.2.2" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.3.3" testImplementation "org.elasticsearch.client:transport:7.17.29" } From bf24ca9ecff7b555b6b46bfed0b1ba9a7b1b2039 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:10:52 +0000 Subject: [PATCH 1138/1224] Bump net.lingala.zip4j:zip4j from 2.11.5 to 2.11.6 in /modules/hivemq Bumps [net.lingala.zip4j:zip4j](https://github.com/srikanth-lingala/zip4j) from 2.11.5 to 2.11.6. - [Release notes](https://github.com/srikanth-lingala/zip4j/releases) - [Commits](https://github.com/srikanth-lingala/zip4j/compare/v2.11.5...v2.11.6) --- updated-dependencies: - dependency-name: net.lingala.zip4j:zip4j dependency-version: 2.11.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 8c1b2c02034..541b5bf65d5 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -9,7 +9,7 @@ dependencies { shaded("org.javassist:javassist:3.30.2-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") - shaded("net.lingala.zip4j:zip4j:2.11.5") + shaded("net.lingala.zip4j:zip4j:2.11.6") testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.47.1") From b846540df51c513377ccf1157bc9dd64cff5cbb1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 21:55:13 +0000 Subject: [PATCH 1139/1224] Bump com.hivemq:hivemq-extension-sdk in /modules/hivemq Bumps [com.hivemq:hivemq-extension-sdk](https://github.com/hivemq/hivemq-extension-sdk) from 4.47.1 to 4.50.0. - [Release notes](https://github.com/hivemq/hivemq-extension-sdk/releases) - [Commits](https://github.com/hivemq/hivemq-extension-sdk/compare/4.47.1...4.50.0) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-extension-sdk dependency-version: 4.50.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 27014550dc4..57ee107f7b6 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -12,7 +12,7 @@ dependencies { shaded("net.lingala.zip4j:zip4j:2.11.6") testImplementation(project(":testcontainers-junit-jupiter")) - testImplementation("com.hivemq:hivemq-extension-sdk:4.47.1") + testImplementation("com.hivemq:hivemq-extension-sdk:4.50.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.13") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.22") From 006659dafbca9edeb267fc7411ac1af1e947bfea Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:21:24 +0000 Subject: [PATCH 1140/1224] Bump ch.qos.logback:logback-classic in /modules/hivemq Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.22 to 1.5.32. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.22...v_1.5.32) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.5.32 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 27014550dc4..170cd2e7afc 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.hivemq:hivemq-extension-sdk:4.47.1") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.13") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") - testImplementation("ch.qos.logback:logback-classic:1.5.22") + testImplementation("ch.qos.logback:logback-classic:1.5.32") } test { From f658d6dc21cab7e26bd4e9904dbe1d7c6aebb391 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 22:21:27 +0000 Subject: [PATCH 1141/1224] Bump com.scylladb:java-driver-core in /modules/scylladb Bumps [com.scylladb:java-driver-core](https://github.com/scylladb/java-driver) from 4.19.0.4 to 4.19.0.8. - [Release notes](https://github.com/scylladb/java-driver/releases) - [Commits](https://github.com/scylladb/java-driver/compare/4.19.0.4...4.19.0.8) --- updated-dependencies: - dependency-name: com.scylladb:java-driver-core dependency-version: 4.19.0.8 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index f6d794e7525..a7931d7c7c9 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: ScyllaDB" dependencies { api project(":testcontainers") - testImplementation 'com.scylladb:java-driver-core:4.19.0.4' + testImplementation 'com.scylladb:java-driver-core:4.19.0.8' testImplementation 'software.amazon.awssdk:dynamodb:2.40.4' } From 6a893fa701f18c47bb743a75fa1fa434e3e2ff96 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:19:18 +0000 Subject: [PATCH 1142/1224] Bump org.apache.activemq:activemq-client in /modules/activemq Bumps [org.apache.activemq:activemq-client](https://github.com/apache/activemq) from 6.2.0 to 6.2.4. - [Release notes](https://github.com/apache/activemq/releases) - [Commits](https://github.com/apache/activemq/compare/activemq-6.2.0...activemq-6.2.4) --- updated-dependencies: - dependency-name: org.apache.activemq:activemq-client dependency-version: 6.2.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 41b81baa2c8..158e8503759 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: ActiveMQ" dependencies { api project(':testcontainers') - testImplementation "org.apache.activemq:activemq-client:6.2.0" + testImplementation "org.apache.activemq:activemq-client:6.2.4" testImplementation "org.apache.activemq:artemis-jakarta-client:2.44.0" } From 0713c4b0a9abbb7d1ad25e597b7fcb7dea4a453a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:20:28 +0000 Subject: [PATCH 1143/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.16.1 to 1.16.4. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.16.1...v1.16.4) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.16.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index da11a209555..319c18bbd40 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'io.rest-assured:rest-assured:5.5.7' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.1' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.5' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.57.0') From a0db454741ff59b0df5aaf27dbc242c3312575d2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:20:33 +0000 Subject: [PATCH 1144/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.57.0 to 1.61.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.57.0...v1.61.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.61.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index da11a209555..28a2b910144 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.1' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.57.0') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.61.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From 97a2d1730b6f0fda54f9cd4c033df914284692cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Apr 2026 23:21:07 +0000 Subject: [PATCH 1145/1224] Bump com.couchbase.client:java-client in /modules/couchbase Bumps [com.couchbase.client:java-client](https://github.com/couchbase/couchbase-jvm-clients) from 3.10.0 to 3.11.1. - [Commits](https://github.com/couchbase/couchbase-jvm-clients/compare/3.10.0...3.11.1) --- updated-dependencies: - dependency-name: com.couchbase.client:java-client dependency-version: 3.11.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 a37998f75f0..707a559290a 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -5,6 +5,6 @@ dependencies { // TODO use JDK's HTTP client and/or Apache HttpClient5 shaded 'com.squareup.okhttp3:okhttp:5.3.2' - testImplementation 'com.couchbase.client:java-client:3.10.0' + testImplementation 'com.couchbase.client:java-client:3.11.2' testImplementation 'org.awaitility:awaitility:4.3.0' } From 3ae9cc0a99e6c3fafe9a6f12fc9fa19957a7f175 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 13 Apr 2026 18:32:50 -0500 Subject: [PATCH 1146/1224] Update maven central badge --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22c800f03be..2cd203a0335 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Testcontainers -[![Maven Central](https://maven-badges.herokuapp.com/maven-central/org.testcontainers/testcontainers/badge.svg)](https://maven-badges.herokuapp.com/maven-central/org.testcontainers/testcontainers) +![Maven Central Version](https://img.shields.io/maven-central/v/org.testcontainers/testcontainers) [![Netlify Status](https://api.netlify.com/api/v1/badges/189f28a2-7faa-42ff-b03c-738142079cc9/deploy-status)](https://app.netlify.com/sites/testcontainers/deploys) From e23f7708295bf979e1117530688c41d1ed262939 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:03:06 +0000 Subject: [PATCH 1147/1224] Bump org.apache.tinkerpop:gremlin-driver in /modules/orientdb Bumps [org.apache.tinkerpop:gremlin-driver](https://github.com/apache/tinkerpop) from 3.8.0 to 3.8.1. - [Changelog](https://github.com/apache/tinkerpop/blob/master/CHANGELOG.asciidoc) - [Commits](https://github.com/apache/tinkerpop/compare/3.8.0...3.8.1) --- updated-dependencies: - dependency-name: org.apache.tinkerpop:gremlin-driver dependency-version: 3.8.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 4abe225d3bf..f9ee813dc64 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -5,6 +5,6 @@ dependencies { api "com.orientechnologies:orientdb-client:3.2.46" - testImplementation 'org.apache.tinkerpop:gremlin-driver:3.8.0' + testImplementation 'org.apache.tinkerpop:gremlin-driver:3.8.1' testImplementation "com.orientechnologies:orientdb-gremlin:3.2.46" } From 88d99946243cf8f555a09855a3d09d5978f88ebf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:03:13 +0000 Subject: [PATCH 1148/1224] Bump com.ibm.db2:jcc from 12.1.3.0 to 12.1.4.0 in /modules/db2 Bumps com.ibm.db2:jcc from 12.1.3.0 to 12.1.4.0. --- updated-dependencies: - dependency-name: com.ibm.db2:jcc dependency-version: 12.1.4.0 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/db2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index a0c3bc79e85..5546fdb6c65 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.ibm.db2:jcc:12.1.3.0' + testRuntimeOnly 'com.ibm.db2:jcc:12.1.4.0' } From 726dbccf5b7c340d05a5c33029ddfeb20f1a1dc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:03:19 +0000 Subject: [PATCH 1149/1224] Bump com.rabbitmq:amqp-client from 5.28.0 to 5.29.0 in /modules/rabbitmq Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.28.0 to 5.29.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.28.0...v5.29.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-version: 5.29.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 350adce5a76..441ff2ddb22 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testImplementation 'com.rabbitmq:amqp-client:5.28.0' + testImplementation 'com.rabbitmq:amqp-client:5.29.0' compileOnly 'org.jetbrains:annotations:26.1.0' } From 5752bb11c83f447a4b407cd1d340917459f2d245 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:03:25 +0000 Subject: [PATCH 1150/1224] Bump com.influxdb:influxdb-client-java in /modules/influxdb Bumps [com.influxdb:influxdb-client-java](https://github.com/influxdata/influxdb-client-java) from 7.4.0 to 7.5.0. - [Release notes](https://github.com/influxdata/influxdb-client-java/releases) - [Changelog](https://github.com/influxdata/influxdb-client-java/blob/master/CHANGELOG.md) - [Commits](https://github.com/influxdata/influxdb-client-java/compare/v7.4.0...v7.5.0) --- updated-dependencies: - dependency-name: com.influxdb:influxdb-client-java dependency-version: 7.5.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/influxdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/influxdb/build.gradle b/modules/influxdb/build.gradle index bc743e6bbce..145aa4aac52 100644 --- a/modules/influxdb/build.gradle +++ b/modules/influxdb/build.gradle @@ -6,5 +6,5 @@ dependencies { compileOnly 'org.influxdb:influxdb-java:2.25' testImplementation 'org.influxdb:influxdb-java:2.25' - testImplementation "com.influxdb:influxdb-client-java:7.4.0" + testImplementation "com.influxdb:influxdb-client-java:7.5.0" } From 6a446af80b0330cc9bde747bb55926bf15d32ba2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:03:28 +0000 Subject: [PATCH 1151/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps [com.solacesystems:sol-jcsmp](https://github.com/SolaceDev/solsuite) from 10.29.0 to 10.29.1. - [Commits](https://github.com/SolaceDev/solsuite/commits) --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-version: 10.29.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index ab0e9555aae..9172fbe878f 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - testImplementation 'com.solacesystems:sol-jcsmp:10.29.0' + testImplementation 'com.solacesystems:sol-jcsmp:10.29.1' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From 50757ee3f343d47868eb1062788b4e56059d2466 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:03:37 +0000 Subject: [PATCH 1152/1224] Bump io.r2dbc:r2dbc-mssql in /modules/mssqlserver Bumps [io.r2dbc:r2dbc-mssql](https://github.com/r2dbc/r2dbc-mssql) from 1.0.3.RELEASE to 1.0.4.RELEASE. - [Release notes](https://github.com/r2dbc/r2dbc-mssql/releases) - [Changelog](https://github.com/r2dbc/r2dbc-mssql/blob/v1.0.4.RELEASE/CHANGELOG) - [Commits](https://github.com/r2dbc/r2dbc-mssql/compare/v1.0.3.RELEASE...v1.0.4.RELEASE) --- updated-dependencies: - dependency-name: io.r2dbc:r2dbc-mssql dependency-version: 1.0.4.RELEASE dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 6e2628da7a2..a03534cf147 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -4,13 +4,13 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' + compileOnly 'io.r2dbc:r2dbc-mssql:1.0.4.RELEASE' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.4.0.jre11' testImplementation project(':testcontainers-r2dbc') - testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.3.RELEASE' + testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.4.RELEASE' // MSSQL's wait strategy requires the JDBC driver testImplementation testFixtures(project(':testcontainers-r2dbc')) From d7b889f2aec1487c5cc36026404c32c1f2c55168 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 04:48:02 +0000 Subject: [PATCH 1153/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.72.0 to 26.79.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.72.0...v26.79.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.79.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 54271098ebc..08fb09887dd 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.72.0") + testImplementation platform("com.google.cloud:libraries-bom:26.79.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From a3ee4a7434a4314fd62db975ef22c4140dcfd47b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 05:31:11 +0000 Subject: [PATCH 1154/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.46 to 3.2.51. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/3.2.51/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.46...3.2.51) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-version: 3.2.51 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index f9ee813dc64..39b15e5a420 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,8 +3,8 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.46" + api "com.orientechnologies:orientdb-client:3.2.51" testImplementation 'org.apache.tinkerpop:gremlin-driver:3.8.1' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.46" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.51" } From 78ca388bb21040681a2d5c44ec245ba67ac6ed91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 06:40:15 +0000 Subject: [PATCH 1155/1224] Bump org.yaml:snakeyaml from 2.5 to 2.6 in /core Bumps [org.yaml:snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml) from 2.5 to 2.6. - [Commits](https://bitbucket.org/snakeyaml/snakeyaml/branches/compare/snakeyaml-2.6..snakeyaml-2.5) --- updated-dependencies: - dependency-name: org.yaml:snakeyaml dependency-version: '2.6' dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 1bc76a8b047..550243a6f1a 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -92,7 +92,7 @@ dependencies { api 'com.github.docker-java:docker-java-transport-zerodep' shaded 'com.google.guava:guava:33.3.1-jre' - shaded "org.yaml:snakeyaml:2.5" + shaded "org.yaml:snakeyaml:2.6" shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2' From c6f0e933233ebb2021df94d7d83249a701d86c74 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 06:40:18 +0000 Subject: [PATCH 1156/1224] Bump redis.clients:jedis from 6.2.0 to 7.4.1 in /core Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 6.2.0 to 7.4.1. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v6.2.0...v7.4.1) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.4.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 1bc76a8b047..e7f34b570a7 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -105,7 +105,7 @@ dependencies { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testImplementation 'redis.clients:jedis:6.2.0' + testImplementation 'redis.clients:jedis:7.4.1' testImplementation 'com.rabbitmq:amqp-client:5.26.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' From 747db2b9895470ae4047c3f8a5fb27951aaccc25 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 06:40:18 +0000 Subject: [PATCH 1157/1224] Bump org.junit.platform:junit-platform-launcher in /core Bumps [org.junit.platform:junit-platform-launcher](https://github.com/junit-team/junit-framework) from 1.11.0 to 1.14.3. - [Release notes](https://github.com/junit-team/junit-framework/releases) - [Commits](https://github.com/junit-team/junit-framework/commits) --- updated-dependencies: - dependency-name: org.junit.platform:junit-platform-launcher dependency-version: 1.14.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 1bc76a8b047..4a36b3e9f7b 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -98,7 +98,7 @@ dependencies { shaded 'org.zeroturnaround:zt-exec:1.12' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.14.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testImplementation('com.google.cloud.tools:jib-core:0.27.3') { @@ -120,7 +120,7 @@ dependencies { jarFileTestCompileOnly "org.projectlombok:lombok:${lombok.version}" jarFileTestAnnotationProcessor "org.projectlombok:lombok:${lombok.version}" - jarFileTestRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' + jarFileTestRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.14.3' jarFileTestImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' jarFileTestImplementation 'org.assertj:assertj-core:3.27.7' jarFileTestImplementation 'org.ow2.asm:asm-debug-all:5.2' From 15a762ce8890487d940ad5769f676f3287d8d527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 06:40:22 +0000 Subject: [PATCH 1158/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.44.0 to 2.53.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-version: 2.53.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index 158e8503759..d88c0053379 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation "org.apache.activemq:activemq-client:6.2.4" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.44.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.53.0" } From 81a30189f5d5467a09e27511b93f67aacee6844d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 06:40:31 +0000 Subject: [PATCH 1159/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.40.4 to 2.42.33. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.42.33 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index a7931d7c7c9..c3fe0927d6a 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(":testcontainers") testImplementation 'com.scylladb:java-driver-core:4.19.0.8' - testImplementation 'software.amazon.awssdk:dynamodb:2.40.4' + testImplementation 'software.amazon.awssdk:dynamodb:2.42.34' } From 25d284d4198927c0a2cf9712d5d1981b27cc5570 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 19:47:30 +0000 Subject: [PATCH 1160/1224] Bump com.google.cloud.tools:jib-core from 0.27.3 to 0.28.1 in /core Bumps [com.google.cloud.tools:jib-core](https://github.com/GoogleContainerTools/jib) from 0.27.3 to 0.28.1. - [Release notes](https://github.com/GoogleContainerTools/jib/releases) - [Commits](https://github.com/GoogleContainerTools/jib/commits) --- updated-dependencies: - dependency-name: com.google.cloud.tools:jib-core dependency-version: 0.28.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 1bc76a8b047..000560172b6 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -70,7 +70,7 @@ dependencies { exclude(group: 'org.jetbrains', module: 'annotations') } - provided('com.google.cloud.tools:jib-core:0.27.3') { + provided('com.google.cloud.tools:jib-core:0.28.1') { exclude group: 'com.google.guava', module: 'guava' exclude group: 'com.fasterxml.jackson.datatype', module: 'jackson-datatype-jsr310' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core' @@ -101,7 +101,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation('com.google.cloud.tools:jib-core:0.27.3') { + testImplementation('com.google.cloud.tools:jib-core:0.28.1') { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' From 72384f273a02945dbe202ce0ad969cee7013a70c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Apr 2026 19:47:59 +0000 Subject: [PATCH 1161/1224] Bump org.jetbrains:annotations from 26.0.2-1 to 26.1.0 in /core Bumps [org.jetbrains:annotations](https://github.com/JetBrains/java-annotations) from 26.0.2-1 to 26.1.0. - [Release notes](https://github.com/JetBrains/java-annotations/releases) - [Changelog](https://github.com/JetBrains/java-annotations/blob/master/CHANGELOG.md) - [Commits](https://github.com/JetBrains/java-annotations/compare/26.0.2-1...26.1.0) --- updated-dependencies: - dependency-name: org.jetbrains:annotations dependency-version: 26.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 1bc76a8b047..b394225e6e2 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -63,8 +63,8 @@ configurations.all { dependencies { api 'org.slf4j:slf4j-api:1.7.36' - compileOnly 'org.jetbrains:annotations:26.0.2-1' - testCompileOnly 'org.jetbrains:annotations:26.0.2-1' + compileOnly 'org.jetbrains:annotations:26.1.0' + testCompileOnly 'org.jetbrains:annotations:26.1.0' api 'org.apache.commons:commons-compress:1.28.0' api ('org.rnorth.duct-tape:duct-tape:1.0.8') { exclude(group: 'org.jetbrains', module: 'annotations') From a412b8ea77bae4ef51ca3e6bed7cffd0566b362e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Wed, 15 Apr 2026 23:32:54 -0600 Subject: [PATCH 1162/1224] Use weaviate client v6 (#11711) --- modules/weaviate/build.gradle | 15 +++- .../weaviate/WeaviateContainerTest.java | 68 +++++++++++-------- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index fd61cd7e3f4..5392b585b71 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -3,5 +3,18 @@ description = "Testcontainers :: Weaviate" dependencies { api project(':testcontainers') - testImplementation 'io.weaviate:client:5.5.0' + testImplementation 'io.weaviate:client6:6.1.0' +} + +test { + javaLauncher = javaToolchains.launcherFor { + languageVersion = JavaLanguageVersion.of(17) + } +} + +compileTestJava { + javaCompiler = javaToolchains.compilerFor { + languageVersion = JavaLanguageVersion.of(17) + } + options.release.set(17) } diff --git a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java index 9a1ad47d5af..d103970053c 100644 --- a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java +++ b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java @@ -1,9 +1,7 @@ package org.testcontainers.weaviate; -import io.weaviate.client.Config; -import io.weaviate.client.WeaviateClient; -import io.weaviate.client.base.Result; -import io.weaviate.client.v1.misc.model.Meta; +import io.weaviate.client6.v1.api.InstanceMetadata; +import io.weaviate.client6.v1.api.WeaviateClient; import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; @@ -17,22 +15,30 @@ class WeaviateContainerTest { @Test - void testWeaviate() { + void testWeaviate() throws Exception { try ( // container { - WeaviateContainer weaviate = new WeaviateContainer("cr.weaviate.io/semitechnologies/weaviate:1.29.0") + WeaviateContainer weaviate = new WeaviateContainer("cr.weaviate.io/semitechnologies/weaviate:1.32.0") // } ) { weaviate.start(); - Config config = new Config("http", weaviate.getHttpHostAddress()); - config.setGRPCHost(weaviate.getGrpcHostAddress()); - WeaviateClient client = new WeaviateClient(config); - Result meta = client.misc().metaGetter().run(); - assertThat(meta.getResult().getVersion()).isEqualTo("1.29.0"); + try ( + WeaviateClient client = WeaviateClient.connectToCustom(conn -> { + return conn + .scheme("http") + .httpHost(weaviate.getHost()) + .httpPort(weaviate.getMappedPort(8080)) + .grpcHost(weaviate.getHost()) + .grpcPort(weaviate.getMappedPort(50051)); + }) + ) { + InstanceMetadata meta = client.meta(); + assertThat(meta.version()).isEqualTo("1.32.0"); + } } } @Test - void testWeaviateWithModules() { + void testWeaviateWithModules() throws Exception { List enableModules = Arrays.asList( "backup-filesystem", "text2vec-openai", @@ -43,22 +49,30 @@ void testWeaviateWithModules() { Map env = new HashMap<>(); env.put("ENABLE_MODULES", String.join(",", enableModules)); env.put("BACKUP_FILESYSTEM_PATH", "/tmp/backups"); - try (WeaviateContainer weaviate = new WeaviateContainer("semitechnologies/weaviate:1.29.0").withEnv(env)) { + try (WeaviateContainer weaviate = new WeaviateContainer("semitechnologies/weaviate:1.32.0").withEnv(env)) { weaviate.start(); - Config config = new Config("http", weaviate.getHttpHostAddress()); - config.setGRPCHost(weaviate.getGrpcHostAddress()); - WeaviateClient client = new WeaviateClient(config); - Result meta = client.misc().metaGetter().run(); - assertThat(meta.getResult().getVersion()).isEqualTo("1.29.0"); - Object modules = meta.getResult().getModules(); - assertThat(modules) - .isNotNull() - .asInstanceOf(InstanceOfAssertFactories.map(String.class, Object.class)) - .extracting(Map::keySet) - .satisfies(keys -> { - assertThat(keys.size()).isEqualTo(enableModules.size()); - keys.forEach(key -> assertThat(enableModules.contains(key)).isTrue()); - }); + try ( + WeaviateClient client = WeaviateClient.connectToCustom(conn -> { + return conn + .scheme("http") + .httpHost(weaviate.getHost()) + .httpPort(weaviate.getMappedPort(8080)) + .grpcHost(weaviate.getHost()) + .grpcPort(weaviate.getMappedPort(50051)); + }) + ) { + InstanceMetadata meta = client.meta(); + assertThat(meta.version()).isEqualTo("1.32.0"); + Map modules = meta.modules(); + assertThat(modules) + .isNotNull() + .asInstanceOf(InstanceOfAssertFactories.map(String.class, Object.class)) + .extracting(Map::keySet) + .satisfies(keys -> { + assertThat(keys.size()).isEqualTo(enableModules.size()); + keys.forEach(key -> assertThat(enableModules.contains(key)).isTrue()); + }); + } } } } From 84b1c3a5951f18421ed35e82c44a1d17c5690cad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Thu, 16 Apr 2026 00:07:08 -0600 Subject: [PATCH 1163/1224] Add getHttpPort and getGrpcPort methods in WeaviateContainer (#11712) --- .../weaviate/WeaviateContainer.java | 20 +++++++++++++++---- .../weaviate/WeaviateContainerTest.java | 8 ++++---- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/modules/weaviate/src/main/java/org/testcontainers/weaviate/WeaviateContainer.java b/modules/weaviate/src/main/java/org/testcontainers/weaviate/WeaviateContainer.java index 86aff57ae5d..dbc18a49a22 100644 --- a/modules/weaviate/src/main/java/org/testcontainers/weaviate/WeaviateContainer.java +++ b/modules/weaviate/src/main/java/org/testcontainers/weaviate/WeaviateContainer.java @@ -17,6 +17,10 @@ */ public class WeaviateContainer extends GenericContainer { + private static final int HTTP_PORT = 8080; + + private static final int GRPC_PORT = 50051; + private static final DockerImageName DEFAULT_WEAVIATE_IMAGE = DockerImageName.parse( "cr.weaviate.io/semitechnologies/weaviate" ); @@ -30,17 +34,25 @@ public WeaviateContainer(String dockerImageName) { public WeaviateContainer(DockerImageName dockerImageName) { super(dockerImageName); dockerImageName.assertCompatibleWith(DEFAULT_WEAVIATE_IMAGE, DOCKER_HUB_WEAVIATE_IMAGE); - withExposedPorts(8080, 50051); + withExposedPorts(HTTP_PORT, GRPC_PORT); withEnv("AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED", "true"); withEnv("PERSISTENCE_DATA_PATH", "/var/lib/weaviate"); - waitingFor(Wait.forHttp("/v1/.well-known/ready").forPort(8080).forStatusCode(200)); + waitingFor(Wait.forHttp("/v1/.well-known/ready").forPort(HTTP_PORT).forStatusCode(200)); } public String getHttpHostAddress() { - return getHost() + ":" + getMappedPort(8080); + return getHost() + ":" + getHttpPort(); + } + + public Integer getHttpPort() { + return getMappedPort(HTTP_PORT); } public String getGrpcHostAddress() { - return getHost() + ":" + getMappedPort(50051); + return getHost() + ":" + getGrpcPort(); + } + + public Integer getGrpcPort() { + return getMappedPort(GRPC_PORT); } } diff --git a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java index d103970053c..098a1561913 100644 --- a/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java +++ b/modules/weaviate/src/test/java/org/testcontainers/weaviate/WeaviateContainerTest.java @@ -26,9 +26,9 @@ void testWeaviate() throws Exception { return conn .scheme("http") .httpHost(weaviate.getHost()) - .httpPort(weaviate.getMappedPort(8080)) + .httpPort(weaviate.getHttpPort()) .grpcHost(weaviate.getHost()) - .grpcPort(weaviate.getMappedPort(50051)); + .grpcPort(weaviate.getGrpcPort()); }) ) { InstanceMetadata meta = client.meta(); @@ -56,9 +56,9 @@ void testWeaviateWithModules() throws Exception { return conn .scheme("http") .httpHost(weaviate.getHost()) - .httpPort(weaviate.getMappedPort(8080)) + .httpPort(weaviate.getHttpPort()) .grpcHost(weaviate.getHost()) - .grpcPort(weaviate.getMappedPort(50051)); + .grpcPort(weaviate.getGrpcPort()); }) ) { InstanceMetadata meta = client.meta(); From 5c448202ac69d073f746433d3e79f6a2bf0ec585 Mon Sep 17 00:00:00 2001 From: Haider Kagalwala <70105477+haider2122@users.noreply.github.com> Date: Mon, 20 Apr 2026 21:53:51 +0530 Subject: [PATCH 1164/1224] Fix typo (#11717) --- .../java/org/testcontainers/containers/GenericContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 0fe944433ae..fa5711807e7 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -1115,7 +1115,7 @@ public SELF withEnv(Map env) { @Override public SELF withLabel(String key, String value) { if (key.startsWith("org.testcontainers")) { - throw new IllegalArgumentException("The org.testcontainers namespace is reserved for interal use"); + throw new IllegalArgumentException("The org.testcontainers namespace is reserved for internal use"); } this.containerDef.addLabel(key, value); return self(); From 09752a8ba2648983842c9617cd5d2560f185bfea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 12:46:49 -0600 Subject: [PATCH 1165/1224] [create-pull-request] automated change (#11720) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index eeb86a395e8..f9e383482f4 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,4 +3,4 @@ org.gradle.caching=true org.gradle.configureondemand=true org.gradle.jvmargs=-Xmx2g -testcontainers.version=2.0.4 +testcontainers.version=2.0.5 From afd28bb559b07f8da5aaa9e2bc21721ee8ee97af Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Apr 2026 12:47:04 -0600 Subject: [PATCH 1166/1224] [create-pull-request] automated change (#11721) Co-authored-by: eddumelendez <1810547+eddumelendez@users.noreply.github.com> --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 552f36f29f4..ad75b0b2f22 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -140,4 +140,4 @@ nav: - bounty.md edit_uri: edit/main/docs/ extra: - latest_version: 2.0.4 + latest_version: 2.0.5 From adbea9d4e70598551817cfcfe425c6c3c35943ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 2 May 2026 01:19:15 +0300 Subject: [PATCH 1167/1224] Remove duplicated org.junit.platform:junit-platform-launcher dependency --- examples/immudb/build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/immudb/build.gradle b/examples/immudb/build.gradle index 4c2256983eb..a4d656dd762 100644 --- a/examples/immudb/build.gradle +++ b/examples/immudb/build.gradle @@ -15,7 +15,6 @@ dependencies { testImplementation 'ch.qos.logback:logback-classic:1.3.15' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } test { From 6299b4f2135d45e11957a321a13b37d28b10ab59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 2 May 2026 01:19:46 +0300 Subject: [PATCH 1168/1224] Polish neo4j-container build file --- examples/neo4j-container/build.gradle | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/examples/neo4j-container/build.gradle b/examples/neo4j-container/build.gradle index 5ba6faf08af..7a6eed0016d 100644 --- a/examples/neo4j-container/build.gradle +++ b/examples/neo4j-container/build.gradle @@ -14,3 +14,7 @@ dependencies { testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.11.0' } + +test { + useJUnitPlatform() +} From 38783111aea6899ee42541756771394f2fb02958 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 2 May 2026 01:20:45 +0300 Subject: [PATCH 1169/1224] Remove unused gradle plugin --- examples/settings.gradle | 1 - smoke-test/settings.gradle | 1 - 2 files changed, 2 deletions(-) diff --git a/examples/settings.gradle b/examples/settings.gradle index 8d144867bbd..b9b58a917bf 100644 --- a/examples/settings.gradle +++ b/examples/settings.gradle @@ -5,7 +5,6 @@ buildscript { } } dependencies { - classpath "gradle.plugin.ch.myniva.gradle:s3-build-cache:0.10.0" classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.17.4" classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.1" } diff --git a/smoke-test/settings.gradle b/smoke-test/settings.gradle index e79fb0d5c94..6334742441a 100644 --- a/smoke-test/settings.gradle +++ b/smoke-test/settings.gradle @@ -5,7 +5,6 @@ buildscript { } } dependencies { - classpath "gradle.plugin.ch.myniva.gradle:s3-build-cache:0.10.0" classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.17.4" classpath "com.gradle:common-custom-user-data-gradle-plugin:2.0.1" } From 50484874fccd1b38892e0baa92cda484879b6b07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Przyby=C5=82?= <23506256+pioorg@users.noreply.github.com> Date: Wed, 20 May 2026 14:50:24 +0200 Subject: [PATCH 1170/1224] Added KibanaContainer (#11493) Co-authored-by: Kevin Wittek --- docs/modules/elasticsearch.md | 27 + .../elasticsearch/ElasticsearchContainer.java | 89 +++ .../elasticsearch/KibanaContainer.java | 613 ++++++++++++++++++ .../ElasticsearchContainerTest.java | 33 + .../elasticsearch/KibanaContainerTest.java | 461 +++++++++++++ 5 files changed, 1223 insertions(+) create mode 100644 modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java create mode 100644 modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java diff --git a/docs/modules/elasticsearch.md b/docs/modules/elasticsearch.md index c1fb4a3f6a8..5817a21de02 100644 --- a/docs/modules/elasticsearch.md +++ b/docs/modules/elasticsearch.md @@ -30,6 +30,33 @@ You can turn on security by providing a password: [HttpClient](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java) inside_block:httpClientSecuredContainer +## Kibana container + +This module also provides a `KibanaContainer` for testing with [Kibana](https://www.elastic.co/kibana). +Kibana requires a connection to Elasticsearch and `KibanaContainer` supports two modes: managed and external. + +### Managed mode + +In managed mode, `KibanaContainer` automatically connects to an `ElasticsearchContainer`: + + +[Kibana with Elasticsearch](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java) inside_block:managedModeCanStartAndReachElasticsearchInSameExplicitNetwork + + +When using managed mode with explicit networks, both containers must share the same `Network` instance. +Alternatively, you can omit the network configuration entirely, and `KibanaContainer` will do its best effort to create a shared, ad-hoc network automatically. + +### External mode + +In external mode, `KibanaContainer` connects to an external Elasticsearch instance via URL and using provided credentials: + + +[Kibana with external Elasticsearch](../../modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java) inside_block:externalModeCanWorkWithUsernamePassword + + +For external mode with HTTPS, use `withElasticsearchCaCertificate()` to provide the CA certificate. +You can authenticate using either username/password (`withElasticsearchCredentials()`) or service account tokens (`withElasticsearchServiceAccountToken()`). + ## Adding this module to your project dependencies Add the following dependency to your `pom.xml`/`build.gradle` file: 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 54f1a4c17f8..2080d21649a 100644 --- a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java +++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/ElasticsearchContainer.java @@ -209,10 +209,99 @@ public ElasticsearchContainer withCertPath(String certPath) { return this; } + String getCertPath() { + return certPath; + } + public String getHttpHostAddress() { return getHost() + ":" + getMappedPort(ELASTICSEARCH_DEFAULT_PORT); } + /** + * Checks env first if this implies HTTP/HTTPS. + * Otherwise, detects the scheme used by Elasticsearch using curl + * + * @return "http" or "https" + */ + String getHttpScheme() { + String securityEnabled = getEnvMap().get("xpack.security.enabled"); + String httpSslEnabled = getEnvMap().get("xpack.security.http.ssl.enabled"); + + // Respect explicit user config + if ("false".equalsIgnoreCase(securityEnabled) || "false".equalsIgnoreCase(httpSslEnabled)) { + return "http"; + } + if ("true".equalsIgnoreCase(httpSslEnabled)) { + return "https"; + } + + if (!isRunning()) { + throw new IllegalStateException( + "Cannot determine HTTP scheme: environment variables are not set and container is not running for curl probe" + ); + } + + ExecResult httpsResult = null; + ExecResult httpResult = null; + try { + // HTTPS probe: any HTTP response (200/401/403/...) => scheme is HTTPS. + // http_code == 000 means we didn't get an HTTP response (TLS/connect failure/timeout). + httpsResult = + execInContainer( + "curl", + "-sS", + "-k", + "--connect-timeout", + "2", + "--max-time", + "4", + "-o", + "/dev/null", + "-w", + "%{http_code}", + "https://localhost:" + ELASTICSEARCH_DEFAULT_PORT + "/" + ); + if (httpsResult.getExitCode() == 0 && !"000".equals(httpsResult.getStdout().trim())) { + return "https"; + } + + // HTTP probe + httpResult = + execInContainer( + "curl", + "-sS", + "--connect-timeout", + "2", + "--max-time", + "4", + "-o", + "/dev/null", + "-w", + "%{http_code}", + "http://localhost:" + ELASTICSEARCH_DEFAULT_PORT + "/" + ); + if (httpResult.getExitCode() == 0 && !"000".equals(httpResult.getStdout().trim())) { + return "http"; + } + } catch (Exception e) { + throw new RuntimeException("Failed to detect protocol via curl", e); + } + + throw new RuntimeException( + String.format( + "Failed to detect protocol via curl. Both HTTPS and HTTP probes failed. " + + "HTTPS probe - exit code: %d, stdout: %s, stderr: %s; " + + "HTTP probe - exit code: %d, stdout: %s, stderr: %s", + httpsResult.getExitCode(), + httpsResult.getStdout(), + httpsResult.getStderr(), + httpResult.getExitCode(), + httpResult.getStdout(), + httpResult.getStderr() + ) + ); + } + // The TransportClient will be removed in Elasticsearch 8. No need to expose this port anymore in the future. @Deprecated public InetSocketAddress getTcpHost() { diff --git a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java new file mode 100644 index 00000000000..a7214f0618d --- /dev/null +++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java @@ -0,0 +1,613 @@ +package org.testcontainers.elasticsearch; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.github.dockerjava.api.command.InspectContainerResponse; +import com.github.dockerjava.api.model.ContainerNetwork; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.rnorth.ducttape.unreliables.Unreliables; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testcontainers.DockerClientFactory; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.containers.Network; +import org.testcontainers.containers.wait.strategy.HttpWaitStrategy; +import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.Base58; +import org.testcontainers.utility.ComparableVersion; +import org.testcontainers.utility.DockerImageName; + +import java.time.Duration; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * Testcontainers implementation for Kibana. + * Minimum supported version: {@value MINIMUM_SUPPORTED_VERSION} + *

      + * Supports two modes: + *

        + *
      • Managed mode: Kibana automatically connects to an {@link ElasticsearchContainer}. + * See KibanaContainerTest#managedModeCanStartAndReachElasticsearchInSameExplicitNetwork()
      • + *
      • External mode: Kibana connects to an external Elasticsearch instance via URL. + * See KibanaContainerTest#externalModeCanWorkWithUsernamePassword()
      • + *
      + *

      + */ +public class KibanaContainer extends GenericContainer { + + private static final String ES_CA_CERT_PATH = "/usr/share/kibana/config/certs/es-ca.crt"; + + private static final Logger log = LoggerFactory.getLogger(KibanaContainer.class); + + private static final int KIBANA_DEFAULT_PORT = 5601; + + private static final String KIBANA_SYSTEM_USER = "kibana_system"; + + private static final String MINIMUM_SUPPORTED_VERSION = "8.0.0"; + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("docker.elastic.co/kibana/kibana"); + + private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private ElasticsearchContainer elasticsearch; + + private String elasticsearchUrl; + + private String elasticsearchUsername; + + private String elasticsearchPassword; + + private String elasticsearchServiceAccountToken; + + private byte[] elasticsearchCaCertificate; + + private Duration startupTimeout = Duration.ofSeconds(120); + + /** + * If KibanaContainer creates an ad-hoc shared network (managed mode, neither container has an explicit network), + * it owns closing it. + */ + private Network createdSharedNetwork; + + /** + * Creates a KibanaContainer in managed mode. + * Kibana automatically connects to the provided Elasticsearch container. + * + * @param elasticsearch the Elasticsearch container to connect to + */ + public KibanaContainer(ElasticsearchContainer elasticsearch) { + this(buildDockerImageName(elasticsearch)); + this.elasticsearch = elasticsearch; + dependsOn(elasticsearch); + } + + /** + * Creates a KibanaContainer in external mode. + * Use {@link #withElasticsearchUrl(String)} to configure the Elasticsearch connection. Use other methods to provide security credentials and such. + * + * @param dockerImageName the Docker image name + */ + public KibanaContainer(String dockerImageName) { + this(DockerImageName.parse(dockerImageName)); + } + + /** + * Creates a KibanaContainer in external mode. + * Use {@link #withElasticsearchUrl(String)} to configure the Elasticsearch connection. Use other methods to provide security credentials and such. + * + * @param dockerImageName the Docker image name + */ + public KibanaContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + ensureCompatibleVersion(dockerImageName.getVersionPart()); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + + withExposedPorts(KIBANA_DEFAULT_PORT); + //we have to explicitly set wait the strategy later on in configure, once we know the security configuration + setWaitStrategy(null); + } + + /** + * Configures the Elasticsearch URL for external mode. + * + * @param elasticsearchUrl the Elasticsearch URL (e.g., "https://my.fancy.setup.elastic.cloud:9200") + * @return this container instance + * @throws IllegalStateException if already using managed mode + */ + public KibanaContainer withElasticsearchUrl(String elasticsearchUrl) { + if (elasticsearch != null) { + throw new IllegalStateException("Cannot set Elasticsearch URL when using Elasticsearch container"); + } + this.elasticsearchUrl = elasticsearchUrl; + return this; + } + + /** + * Configures Kibana to authenticate using the kibana_system user. + * + * @param password the password for the kibana_system user + * @return this container instance + */ + public KibanaContainer withKibanaSystemPassword(String password) { + return withKibanaUsernameAndPassword(KIBANA_SYSTEM_USER, password); + } + + /** + * Configures credentials Kibana will use for authentication. + * + * @param username the Elasticsearch username (cannot be 'elastic') + * @param password the password + * @return this container instance + * @throws IllegalStateException if a service account token is already configured + * @throws IllegalArgumentException if credentials are invalid + */ + public KibanaContainer withKibanaUsernameAndPassword(String username, String password) { + if (elasticsearchServiceAccountToken != null) { + throw new IllegalStateException( + "Conflicting Elasticsearch credentials: provide either a service account token " + + "or a username/password pair, not both." + ); + } + if (StringUtils.isAnyBlank(username, password)) { + throw new IllegalArgumentException("Kibana credentials cannot be blank"); + } + if (!username.equals(username.trim()) || !password.equals(password.trim())) { + throw new IllegalArgumentException("Kibana credentials cannot have leading or trailing whitespace"); + } + if ("elastic".equals(username)) { + throw new IllegalArgumentException("Username 'elastic' is reserved for internal use by Elasticsearch"); + } + + this.elasticsearchUsername = username; + this.elasticsearchPassword = password; + return this; + } + + /** + * Configures a service account token for Elasticsearch authentication. + * + * @param token the service account token + * @return this container instance + * @throws IllegalStateException if username/password credentials are already configured + * @throws IllegalArgumentException if token is blank + */ + public KibanaContainer withElasticsearchServiceAccountToken(String token) { + if (elasticsearchUsername != null) { + throw new IllegalStateException( + "Conflicting Elasticsearch credentials: provide either a service account token " + + "or a username/password pair, not both." + ); + } + if (StringUtils.isBlank(token)) { + throw new IllegalArgumentException("Service account token cannot be empty"); + } + + if (!token.equals(token.trim())) { + throw new IllegalArgumentException("Service token cannot have leading or trailing whitespace"); + } + this.elasticsearchServiceAccountToken = token; + return this; + } + + /** + * Configures the Elasticsearch CA certificate for HTTPS connections. + * + * @param caCertificate the CA certificate in PEM format + * @return this container instance + * @throws IllegalArgumentException if certificate is empty + */ + public KibanaContainer withElasticsearchCaCertificate(byte[] caCertificate) { + if (caCertificate == null || caCertificate.length == 0) { + throw new IllegalArgumentException("Elasticsearch CA certificate cannot be empty"); + } + this.elasticsearchCaCertificate = caCertificate; + return this; + } + + @Override + protected void configure() { + super.configure(); + + addEnv("XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY", generateRandomKey(32)); + addEnv("SERVER_NAME", "kibana"); + + if (elasticsearchCaCertificate != null) { + withCopyToContainer(Transferable.of(elasticsearchCaCertificate), ES_CA_CERT_PATH); + addEnv("ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES", ES_CA_CERT_PATH); + } + if (elasticsearch != null) { + configureManagedElasticsearch(); + } else if (elasticsearchUrl != null) { + configureExternalElasticsearch(); + } else { + throw new IllegalStateException( + "Elasticsearch must be configured either via constructor KibanaContainer(elasticsearch) " + + "or via .withElasticsearchUrl() for external Elasticsearch" + ); + } + //wait strategy is set in configure, because we don't know the security configuration before + configureWaitStrategy(); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + super.containerIsStarted(containerInfo); + log.info("Kibana is now ready, it can be accessed at http://{}", getHttpHostAddress()); + } + + @Override + public void stop() { + super.stop(); + if (createdSharedNetwork != null) { + try { + createdSharedNetwork.close(); + } catch (Exception e) { + log.debug("Failed to close shared network", e); + } finally { + createdSharedNetwork = null; + } + } + } + + @Override + public KibanaContainer withStartupTimeout(Duration startupTimeout) { + this.startupTimeout = startupTimeout; + return this; + } + + private static DockerImageName buildDockerImageName(ElasticsearchContainer elasticsearch) { + String esVersion = DockerImageName.parse(elasticsearch.getDockerImageName()).getVersionPart(); + ensureCompatibleVersion(esVersion); + return DEFAULT_IMAGE_NAME.withTag(esVersion); + } + + private void configureExternalElasticsearch() { + addEnv("ELASTICSEARCH_HOSTS", elasticsearchUrl); + if (elasticsearchServiceAccountToken != null) { + addEnv("ELASTICSEARCH_SERVICEACCOUNTTOKEN", elasticsearchServiceAccountToken); + } else if (elasticsearchUsername != null && elasticsearchPassword != null) { + addEnv("ELASTICSEARCH_USERNAME", elasticsearchUsername); + addEnv("ELASTICSEARCH_PASSWORD", elasticsearchPassword); + } else { + log.info( + "No Elasticsearch credentials provided for external mode; Kibana will attempt to connect anonymously" + ); + } + } + + private void configureManagedElasticsearch() { + ensureCorrectNetworkSetupForManagedMode(); + + if (getNetwork() == null) { + createAdHocNetwork(); + } + + String protocol = elasticsearch.getHttpScheme(); + + String hosts = protocol + "://" + resolveExistingEsDnsNameOnNetwork(getNetwork()) + ":9200"; + addEnv("ELASTICSEARCH_HOSTS", hosts); + + if ("https".equals(protocol)) { + // In managed mode, if Elasticsearch uses HTTPS we must configure Kibana with the ES CA, unless provided by user + if (this.elasticsearchCaCertificate == null) { + byte[] ca = copyElasticsearchHttpCaCertificateOrThrow(); + + withCopyToContainer(Transferable.of(ca), ES_CA_CERT_PATH); + addEnv("ELASTICSEARCH_SSL_CERTIFICATEAUTHORITIES", ES_CA_CERT_PATH); + } + if (elasticsearch != null && !getEnvMap().containsKey("ELASTICSEARCH_SSL_VERIFICATIONMODE")) { + addEnv("ELASTICSEARCH_SSL_VERIFICATIONMODE", "certificate"); + } + } + + // Elasticsearch 8.x+ has the security enabled by default, so lack of the env var set to false means security is enabled + boolean securityDisabled = "false".equalsIgnoreCase(elasticsearch.getEnvMap().get("xpack.security.enabled")); + + if (!securityDisabled) { + // Managed mode: authenticate Kibana -> Elasticsearch using a Kibana service account token. + // This avoids any password lifecycle management for kibana_system. + String token = createKibanaServiceAccountToken(protocol); + addEnv("ELASTICSEARCH_SERVICEACCOUNTTOKEN", token); + } + } + + private byte[] copyElasticsearchHttpCaCertificateOrThrow() { + try { + return elasticsearch.copyFileFromContainer(elasticsearch.getCertPath(), IOUtils::toByteArray); + } catch (Exception e) { + throw new IllegalStateException( + "Failed to copy Elasticsearch HTTP CA certificate from '" + + elasticsearch.getCertPath() + + "'. " + + "In managed HTTPS mode, KibanaContainer requires access to the Elasticsearch HTTP CA.", + e + ); + } + } + + private void ensureCorrectNetworkSetupForManagedMode() { + Network esNetwork = elasticsearch.getNetwork(); + Network kbNetwork = this.getNetwork(); + + if ((esNetwork == null) != (kbNetwork == null)) { + throw new IllegalStateException( + "Managed mode requires either both containers share the same explicit network, " + + "or neither specifies a network (KibanaContainer will create one). " + ); + } + + // Both explicit: must be same + if (esNetwork != kbNetwork) { + throw new IllegalStateException( + "Elasticsearch and Kibana have different networks configured. " + + "In managed mode both containers must share the same explicit network instance, " + + "or neither must define a network." + ); + } + } + + private void createAdHocNetwork() { + // Fully managed: create ad-hoc network and own it. + createdSharedNetwork = Network.newNetwork(); + withNetwork(createdSharedNetwork); + + // Managed-mode safety rule: by the time Kibana is configuring itself, Elasticsearch must already be + // started (via dependsOn) + String esId = requireElasticsearchContainerId(); + + // Elasticsearch is already created/started. Attach it to the ad-hoc network. + // We don't need to provide an explicit alias - we'll use the container name for DNS resolution. + // Equivalent of https://docs.docker.com/reference/cli/docker/network/connect/ + connectRunningContainerToNetwork(esId, createdSharedNetwork); + } + + private String resolveExistingEsDnsNameOnNetwork(Network network) { + String esId = requireElasticsearchContainerId(); + + InspectContainerResponse info = DockerClientFactory.instance().client().inspectContainerCmd(esId).exec(); + + Map networks = info.getNetworkSettings().getNetworks(); + if (networks == null) { + throw new IllegalStateException("Elasticsearch container has no network configuration"); + } + + // Try to find the network endpoint - Docker may key by network name or ID + ContainerNetwork endpoint = findNetworkEndpoint(networks, network); + if (endpoint == null) { + throw new IllegalStateException( + "Elasticsearch container is not connected to the expected network. " + + "Ensure both containers use the same Network instance." + ); + } + + // Prefer user-defined network aliases (skip Testcontainers auto-generated tc-* aliases) + if (endpoint.getAliases() != null && !endpoint.getAliases().isEmpty()) { + for (String alias : endpoint.getAliases()) { + if (StringUtils.isNotBlank(alias)) { + String cleaned = alias.trim(); + // Skip Testcontainers auto-generated aliases (tc-*), prefer user-defined ones + if (!cleaned.startsWith("tc-")) { + log.info("Using Elasticsearch network alias: {}", cleaned); + return cleaned; + } + } + } + } + + // Fallback: use container name + String containerName = info.getName(); + if (containerName != null && !containerName.trim().isEmpty()) { + String dnsName = containerName.replaceFirst("^/", "").trim(); + log.info("No user-defined network alias found, using Elasticsearch container name: {}", dnsName); + return dnsName; + } + + throw new IllegalStateException( + "Cannot determine Elasticsearch DNS name. " + + "When using a custom network, set a network alias on the Elasticsearch container." + ); + } + + private ContainerNetwork findNetworkEndpoint(Map networks, Network network) { + // Try network ID first + ContainerNetwork endpoint = networks.get(network.getId()); + if (endpoint != null) { + return endpoint; + } + + // Try network name as fallback (Docker may key by name instead of ID) + try { + String networkName = DockerClientFactory + .instance() + .client() + .inspectNetworkCmd() + .withNetworkId(network.getId()) + .exec() + .getName(); + if (networkName != null) { + return networks.get(networkName); + } + } catch (Exception e) { + // Ignore and return null + } + + return null; + } + + private String requireElasticsearchContainerId() { + String id = elasticsearch.getContainerId(); + if (StringUtils.isBlank(id)) { + throw new IllegalStateException( + "Elasticsearch containerId is not available. In managed mode, Elasticsearch must be started via dependsOn(elasticsearch) " + + "before KibanaContainer is started." + ); + } + return id.trim(); + } + + private void connectRunningContainerToNetwork(String containerId, Network network) { + String networkId = network.getId(); + + try { + DockerClientFactory + .instance() + .client() + .connectToNetworkCmd() + .withContainerId(containerId) + .withNetworkId(networkId) + .exec(); + } catch (Exception e) { + throw new IllegalStateException("Failed to connect Elasticsearch container to ad-hoc shared network", e); + } + } + + private static void ensureCompatibleVersion(String esVersion) { + ComparableVersion comparableVersion = new ComparableVersion(esVersion); + if (comparableVersion.isLessThan(MINIMUM_SUPPORTED_VERSION)) { + throw new IllegalArgumentException( + String.format( + "Kibana version %s is not supported. Minimum version is %s", + comparableVersion, + MINIMUM_SUPPORTED_VERSION + ) + ); + } + } + + private String createKibanaServiceAccountToken(String protocol) { + if (elasticsearch == null) { + throw new IllegalStateException("Cannot create service account token in external mode"); + } + + String elasticPassword = elasticsearch + .getEnvMap() + .getOrDefault("ELASTIC_PASSWORD", ElasticsearchContainer.ELASTICSEARCH_DEFAULT_PASSWORD); + + // Create a unique token name to avoid collisions if the same ES container is reused. + String tokenName = "tc-kibana-" + Base58.randomString(12); + + String endpoint = protocol + "://localhost:9200/_security/service/elastic/kibana/credential/token/" + tokenName; + + return Unreliables.retryUntilSuccess( + 45, + TimeUnit.SECONDS, + () -> { + String curlTlsArgs = ""; + if ("https".equals(protocol)) { + // In managed HTTPS mode, use the Elasticsearch HTTP CA for curl. + curlTlsArgs = " --cacert '" + elasticsearch.getCertPath() + "'"; + } + + String curlCommand = String.format( + "curl -sS%s -u \"elastic:$1\" -H 'Content-Type: application/json' -X POST '%s'", + curlTlsArgs, + endpoint + ); + + Container.ExecResult result = elasticsearch.execInContainer( + "/bin/sh", + "-c", + curlCommand, + "sh", + elasticPassword + ); + + String stdout = (result.getStdout() == null) ? "" : result.getStdout(); + String stderr = (result.getStderr() == null) ? "" : result.getStderr(); + + if (result.getExitCode() != 0) { + throw new RuntimeException( + "Failed to create Kibana service account token. Exit code: " + + result.getExitCode() + + ", stdout: " + + stdout + + ", stderr: " + + stderr + ); + } + + JsonNode json = OBJECT_MAPPER.readTree(stdout); + JsonNode value = json.path("token").path("value"); + if (value.isTextual() && !value.asText().trim().isEmpty()) { + return value.asText().trim(); + } + + throw new RuntimeException("Service account token response did not contain token.value: " + stdout); + } + ); + } + + private String generateRandomKey(int length) { + return Base58.randomString(length); + } + + /** + * Returns the HTTP host address for accessing Kibana. + * + * @return the host address in the format "host:port" + */ + public String getHttpHostAddress() { + return getHost() + ":" + getMappedPort(KIBANA_DEFAULT_PORT); + } + + private void configureWaitStrategy() { + if (this.getWaitStrategy() != null) { + // the user might have set a custom wait strategy + return; + } + HttpWaitStrategy strategy = Wait + .forHttp("/api/status") + .forPort(KIBANA_DEFAULT_PORT) + .forStatusCode(200) + .forResponsePredicate(this::isKibanaReady); + + // Add authentication if we have Elasticsearch credentials available + String serviceToken = getEnvMap().get("ELASTICSEARCH_SERVICEACCOUNTTOKEN"); + String username = getEnvMap().get("ELASTICSEARCH_USERNAME"); + String password = getEnvMap().get("ELASTICSEARCH_PASSWORD"); + + if (serviceToken != null) { + strategy = strategy.withHeader("Authorization", "Bearer " + serviceToken); + } else if (username != null && password != null) { + strategy = strategy.withBasicCredentials(username, password); + } + + setWaitStrategy(strategy.withStartupTimeout(this.startupTimeout)); + } + + private boolean isKibanaReady(String body) { + try { + JsonNode json = OBJECT_MAPPER.readTree(body); + JsonNode status = json.path("status"); + + String overallLevel = status.path("overall").path("level").asText(null); + String elasticsearchLevel = status.path("core").path("elasticsearch").path("level").asText(null); + String savedObjectsLevel = status.path("core").path("savedObjects").path("level").asText(null); + + boolean overallAvailable = "available".equalsIgnoreCase(overallLevel); + boolean elasticsearchAvailable = "available".equalsIgnoreCase(elasticsearchLevel); + boolean savedObjectsAvailable = "available".equalsIgnoreCase(savedObjectsLevel); + + boolean isReady = overallAvailable && elasticsearchAvailable && savedObjectsAvailable; + + if (log.isDebugEnabled()) { + log.debug( + "Kibana status check: READY={} (overall={}, elasticsearch={}, savedObjects={})", + isReady, + overallLevel, + elasticsearchLevel, + savedObjectsLevel + ); + } + + return isReady; + } catch (Exception e) { + log.debug("Kibana status check: FAILED to parse response - {}", e.getMessage()); + return false; + } + } +} 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 f0219713751..52cd78b4a34 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/ElasticsearchContainerTest.java @@ -602,4 +602,37 @@ private void assertClusterHealthResponse(ElasticsearchContainer container) throw assertThat(response.getStatusLine().getStatusCode()).isEqualTo(200); assertThat(EntityUtils.toString(response.getEntity())).contains("cluster_name"); } + + @Test + void testGetHttpSchemeForElasticsearch7ReturnsHttp() { + try (ElasticsearchContainer container = new ElasticsearchContainer(ELASTICSEARCH_IMAGE)) { + container.start(); + assertThat(container.getHttpScheme()).isEqualTo("http"); + } + } + + @Test + void testGetHttpSchemeForElasticsearch8ReturnsHttps() { + try ( + ElasticsearchContainer container = new ElasticsearchContainer( + "docker.elastic.co/elasticsearch/elasticsearch:8.1.2" + ) + ) { + container.start(); + assertThat(container.getHttpScheme()).isEqualTo("https"); + } + } + + @Test + void testGetHttpSchemeForElasticsearch8WithSslDisabledReturnsHttp() { + try ( + ElasticsearchContainer container = new ElasticsearchContainer( + "docker.elastic.co/elasticsearch/elasticsearch:8.1.2" + ) + .withEnv("xpack.security.http.ssl.enabled", "false") + ) { + container.start(); + assertThat(container.getHttpScheme()).isEqualTo("http"); + } + } } diff --git a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java new file mode 100644 index 00000000000..a6b9466690a --- /dev/null +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java @@ -0,0 +1,461 @@ +package org.testcontainers.elasticsearch; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpResponse; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; +import org.testcontainers.containers.Container; +import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.Network; +import org.testcontainers.images.builder.Transferable; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +class KibanaContainerTest { + + public static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + + private static final String ES_IMAGE = "docker.elastic.co/elasticsearch/elasticsearch:9.2.4"; + + @Test + void cannotCreateKibanaContainerForVersionLessThan8() { + Assertions + .assertThatThrownBy(() -> new KibanaContainer("docker.elastic.co/kibana/kibana:7.17.29")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("is not supported"); + } + + @Test + void managedModeCanStartAndReachElasticsearchInSameExplicitNetwork() throws IOException { + // managedModeCanStartAndReachElasticsearchInSameExplicitNetwork { + try ( + Network network = Network.newNetwork(); + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE).withNetwork(network); + KibanaContainer kibana = new KibanaContainer(es).withNetwork(network) + ) { + es.start(); + kibana.start(); + + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + // } + } + + @Test + void managedModeCannotStartWithOnlyESNetworkExplicit() { + Network network = Network.newNetwork(); + try ( + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE).withNetwork(network); + KibanaContainer kibana = new KibanaContainer(es) + ) { + Assertions + .assertThatThrownBy(kibana::start) + .isInstanceOf(ContainerLaunchException.class) + .satisfies(ex -> { + Assertions + .assertThat(ex.getCause()) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("explicit network"); + }); + } + } + + @Test + void managedModeCannotStartWithDifferentExplicitNetworks() { + try ( + Network esNetwork = Network.newNetwork(); + Network kibanaNetwork = Network.newNetwork(); + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE).withNetwork(esNetwork); + KibanaContainer kibana = new KibanaContainer(es).withNetwork(kibanaNetwork) + ) { + Assertions + .assertThatThrownBy(kibana::start) + .isInstanceOf(ContainerLaunchException.class) + .satisfies(ex -> { + Assertions + .assertThat(ex.getCause()) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("different networks"); + }); + } + } + + @Test + void managedModeUsesCustomNetworkAliasInExplicitNetwork() throws Exception { + final String customEsAlias = "my-custom-es-alias"; + + try ( + Network network = Network.newNetwork(); + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE) + .withNetwork(network) + .withNetworkAliases(customEsAlias); + KibanaContainer kibana = new KibanaContainer(es).withNetwork(network) + ) { + kibana.start(); + + Assertions.assertThat(kibana.isRunning()).isTrue(); + + // Verify Kibana uses the custom alias (not auto-generated tc-* alias) + Container.ExecResult result = kibana.execInContainer("sh", "-c", "env | grep ELASTICSEARCH_HOSTS"); + + Assertions.assertThat(result.getStdout()).contains(customEsAlias).contains(":9200"); + } + } + + @Test + void managedModeCanStartAndReachElasticsearchWithoutExplicitNetwork() throws IOException { + try ( + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE); + KibanaContainer kibana = new KibanaContainer(es) + ) { + kibana.start(); + + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + } + + @Test + void managedModeCanStartWithoutElasticsearchSecurity() throws IOException { + try ( + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE).withEnv("xpack.security.enabled", "false"); + KibanaContainer kibana = new KibanaContainer(es) + ) { + kibana.start(); + + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + } + + @Test + void managedModeCanStartWithoutElasticsearchHttps() throws IOException { + try ( + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE) + .withEnv("xpack.security.enabled", "true") + .withEnv("xpack.security.http.ssl.enabled", "false"); + KibanaContainer kibana = new KibanaContainer(es) + ) { + es.start(); + kibana.start(); + + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + } + + @Test + void externalModeFailsWithConflictingCredentials() { + Assertions + .assertThatThrownBy(() -> { + new KibanaContainer("docker.elastic.co/kibana/kibana:8.0.0") + .withKibanaUsernameAndPassword("user", "pass") + .withElasticsearchServiceAccountToken("token"); + }) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Conflicting Elasticsearch credentials"); + } + + @Test + void managedModeFailsWhenSettingElasticsearchUrl() { + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE); + Assertions + .assertThatThrownBy(() -> { + new KibanaContainer(es).withElasticsearchUrl("http://somewhere.over.the.rainbow:9200"); + }) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Cannot set Elasticsearch URL when using Elasticsearch container"); + } + + @Test + void failsWhenNoElasticsearchConfigured() { + try (KibanaContainer kibana = new KibanaContainer("docker.elastic.co/kibana/kibana:8.0.0")) { + Assertions + .assertThatThrownBy(kibana::start) + .isInstanceOf(ContainerLaunchException.class) + .satisfies(ex -> { + Assertions + .assertThat(ex.getCause()) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("Elasticsearch must be configured"); + }); + } + } + + @Test + void externalModeCanWorkWithUsernamePassword() throws IOException, InterruptedException { + final String esHostname = "elasticsearch"; + + // externalModeCanWorkWithUsernamePassword { + try ( + Network network = Network.newNetwork(); + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE) + .withNetwork(network) + .withNetworkAliases(esHostname) + .withEnv("xpack.security.http.ssl.enabled", "false") + ) { + es.start(); + String kibanaSystemPassword = setKibanaSystemPassword(es); + + try ( + KibanaContainer kibana = new KibanaContainer("docker.elastic.co/kibana/kibana:9.2.2") //this minor version is intentionally below ES version + .withNetwork(network) + .withElasticsearchUrl("http://" + esHostname + ":9200") + .withKibanaSystemPassword(kibanaSystemPassword) + ) { + kibana.start(); + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + } + // } + } + + @Test + void externalModeCanWorkWithoutCredentials() throws IOException { + final String esHostname = "elasticsearch"; + + try ( + Network network = Network.newNetwork(); + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE) + .withNetwork(network) + .withNetworkAliases(esHostname) + .withEnv("xpack.security.enabled", "false") + .withEnv("xpack.security.http.ssl.enabled", "false"); + KibanaContainer kibana = new KibanaContainer("docker.elastic.co/kibana/kibana:9.2.4") + .withNetwork(network) + .withElasticsearchUrl("http://" + esHostname + ":9200") + ) { + es.start(); + kibana.start(); + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + } + + @Test + void externalModeCanStartAndReachElasticsearchWithCertAndServiceToken() throws Exception { + byte[] caCrt; + byte[] nodeCrt; + byte[] nodeKey; + + String esHostname = "elasticsearch"; + + String instancesYml = + "instances:\n" + + " - name: es01\n" + + " dns: [ \"localhost\", \"" + + esHostname + + "\", \"es01\" ]\n" + + " ip: [ \"127.0.0.1\" ]\n"; + + try ( + ElasticsearchContainer setup = new ElasticsearchContainer(ES_IMAGE) + .withEnv("discovery.type", "single-node") + .withCopyToContainer( + Transferable.of(instancesYml.getBytes(StandardCharsets.UTF_8), 0644), + "/tmp/instances.yml" + ) + ) { + setup.start(); + + // Run certutil inside the running container and write outputs inside the container FS + Container.ExecResult execResult = setup.execInContainer( + "bash", + "-lc", + "set -euo pipefail && " + + "mkdir -p /tmp/out && " + + "cd /usr/share/elasticsearch && " + + "bin/elasticsearch-certutil ca --silent --pem --out /tmp/out/ca.zip && " + + "unzip -o /tmp/out/ca.zip -d /tmp/out && " + + "bin/elasticsearch-certutil cert --silent --pem --in /tmp/instances.yml --ca-cert /tmp/out/ca/ca.crt --ca-key /tmp/out/ca/ca.key --out /tmp/out/certs.zip && " + + "unzip -o /tmp/out/certs.zip -d /tmp/out" + ); + Assertions.assertThat(execResult.getExitCode()).isEqualTo(0); + + // copy the certificates and key from the container, so we can use them later + caCrt = setup.copyFileFromContainer("/tmp/out/ca/ca.crt", IOUtils::toByteArray); + nodeCrt = setup.copyFileFromContainer("/tmp/out/es01/es01.crt", IOUtils::toByteArray); + nodeKey = setup.copyFileFromContainer("/tmp/out/es01/es01.key", IOUtils::toByteArray); + } + + try ( + Network network = Network.newNetwork(); + ElasticsearchContainer es = new ElasticsearchContainer( + "docker.elastic.co/elasticsearch/elasticsearch:9.2.4" + ) + .withNetwork(network) + .withNetworkAliases(esHostname) + ) { + applyTls(es, caCrt, nodeCrt, nodeKey); + es.start(); + String kibanaServiceAccountToken = createKibanaServiceAccountToken(es); + + try ( + KibanaContainer kibana = new KibanaContainer("docker.elastic.co/kibana/kibana:9.2.4") + // network is needed only because the ES we try to access via explicit mode is operated by non-public Docker + .withNetwork(network) + .withElasticsearchUrl("https://" + esHostname + ":9200") + .withElasticsearchServiceAccountToken(kibanaServiceAccountToken) + .withElasticsearchCaCertificate(es.caCertAsBytes().get()) + ) { + kibana.start(); + String status = getKibanaStatus(kibana); + Assertions.assertThat(status).isEqualTo("available"); + } + } + } + + private static String setKibanaSystemPassword(ElasticsearchContainer elasticsearch) throws IOException { + String kibanaPassword = "kibana-system-" + System.currentTimeMillis(); + + try (CloseableHttpClient httpClient = createHttpClient(elasticsearch)) { + String url = String.format( + "%s://%s/_security/user/kibana_system/_password", + elasticsearch.getHttpScheme(), + elasticsearch.getHttpHostAddress() + ); + HttpPost request = new HttpPost(url); + request.setHeader("Content-Type", "application/json"); + request.setEntity(new StringEntity("{\"password\":\"" + kibanaPassword + "\"}")); + + HttpResponse response = httpClient.execute(request); + int statusCode = response.getStatusLine().getStatusCode(); + String body = EntityUtils.toString(response.getEntity()); + + if (statusCode != 200) { + throw new IllegalStateException( + "Failed to set kibana_system password. HTTP " + statusCode + ", body=" + body + ); + } + + // ES 9.x returns {} on success; older versions may return {"acknowledged":true} + // Just validate that the body is valid JSON. + try { + OBJECT_MAPPER.readTree(body.isEmpty() ? "{}" : body); + } catch (IOException e) { + throw new IllegalStateException("Non-JSON response body: " + body, e); + } + + return kibanaPassword; + } + } + + private static String createKibanaServiceAccountToken(ElasticsearchContainer elasticsearch) throws IOException { + String tokenName = "kibana-token-" + System.currentTimeMillis(); + + try (CloseableHttpClient httpClient = createHttpClient(elasticsearch)) { + String url = String.format( + "%s://%s/_security/service/elastic/kibana/credential/token/%s", + elasticsearch.getHttpScheme(), + elasticsearch.getHttpHostAddress(), + tokenName + ); + HttpPost request = new HttpPost(url); + request.setHeader("Content-Type", "application/json"); + + HttpResponse response = httpClient.execute(request); + int statusCode = response.getStatusLine().getStatusCode(); + String body = EntityUtils.toString(response.getEntity()); + + if (statusCode != 200) { + throw new IllegalStateException( + "Failed to create Kibana service account token. HTTP " + statusCode + ", body=" + body + ); + } + + // Expected JSON: + // {"created":true,"token":{"name":"...","value":"AAEAA..."}} + try { + JsonNode root = OBJECT_MAPPER.readTree(body); + JsonNode tokenValue = root.path("token").path("value"); + + if (tokenValue.isMissingNode() || tokenValue.isNull()) { + throw new IllegalStateException("Token value not found in response: " + body); + } + + return tokenValue.asText(); + } catch (IOException e) { + throw new IllegalStateException("Failed to parse token response: " + body, e); + } + } + } + + private static CloseableHttpClient createHttpClient(ElasticsearchContainer elasticsearch) { + String elasticPassword = elasticsearch.getEnvMap().get("ELASTIC_PASSWORD"); + HttpClientBuilder clientBuilder = HttpClientBuilder.create(); + + if (StringUtils.isNotBlank(elasticPassword)) { + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials( + AuthScope.ANY, + new UsernamePasswordCredentials("elastic", elasticPassword) + ); + clientBuilder.setDefaultCredentialsProvider(credentialsProvider); + } + + String scheme = elasticsearch.getHttpScheme(); + if ("https".equals(scheme)) { + SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory( + elasticsearch.createSslContextFromCa() + ); + clientBuilder.setSSLSocketFactory(sslSocketFactory); + } + + return clientBuilder.build(); + } + + private static String getKibanaStatus(KibanaContainer kibana) throws IOException { + try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) { + String url = "http://" + kibana.getHttpHostAddress() + "/api/status"; + HttpResponse response = httpClient.execute(new org.apache.http.client.methods.HttpGet(url)); + int statusCode = response.getStatusLine().getStatusCode(); + String body = EntityUtils.toString(response.getEntity()); + + if (statusCode != 200) { + throw new IllegalStateException("Failed to get Kibana status. HTTP " + statusCode + ", body=" + body); + } + + JsonNode json = OBJECT_MAPPER.readTree(body); + String status = json.path("status").path("overall").path("level").asText(null); + if (status == null) { + throw new IllegalStateException("Kibana status response missing 'status.overall.level' field: " + body); + } + return status; + } + } + + private static void applyTls(ElasticsearchContainer c, byte[] caCrt, byte[] nodeCrt, byte[] nodeKey) { + final String certDir = "/usr/share/elasticsearch/config/certs"; + + // Copy provided materials + c.withCopyToContainer(Transferable.of(caCrt, 0644), certDir + "/http_ca.crt"); + c.withCopyToContainer(Transferable.of(nodeCrt, 0644), certDir + "/http.crt"); + c.withCopyToContainer(Transferable.of(nodeKey, 0644), certDir + "/http.key"); + + // Disable ES bootstrap TLS autoconfiguration + c.withEnv("xpack.security.autoconfiguration.enabled", "false"); + c.withEnv("xpack.security.enabled", "true"); + + // Configure ONLY HTTP TLS using exactly the provided files + c.withEnv("xpack.security.http.ssl.enabled", "true"); + c.withEnv("xpack.security.http.ssl.certificate_authorities", "certs/http_ca.crt"); + c.withEnv("xpack.security.http.ssl.certificate", "certs/http.crt"); + c.withEnv("xpack.security.http.ssl.key", "certs/http.key"); + } +} From 905a445ad8b701e4c531aa652e42179072a88d01 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Tue, 2 Jun 2026 09:57:24 +0200 Subject: [PATCH 1171/1224] docs: remove bounty policy in favor of governance funding docs (#11789) The issue bounty program described in docs/bounty.md was never run in practice. Remove the bounty policy page and its navigation entry, and update the CONTRIBUTING sponsorship section to point to the current funding and governance documents in the testcontainers/.github repo, which describe how sponsorship money is raised and distributed. Co-authored-by: Claude Opus 4.8 --- CONTRIBUTING.md | 4 ++-- docs/bounty.md | 51 ------------------------------------------------- mkdocs.yml | 1 - 3 files changed, 2 insertions(+), 54 deletions(-) delete mode 100644 docs/bounty.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 93a87222781..27a2ce70f7a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,6 +8,6 @@ There are additional docs describing [contributing documentation changes](./docs Testcontainers is [in the GitHub Sponsors program](https://github.com/sponsors/testcontainers)! -This repository is supported by our sponsors, meaning that issues are eligible to have a 'bounty' attached to them by sponsors. +This repository is supported by our sponsors. If you'd like to support the project, please consider sponsoring us via [GitHub Sponsors](https://github.com/sponsors/testcontainers) or [Open Collective](https://opencollective.com/testcontainers). -Please see [the bounty policy page](https://www.testcontainers.org/bounty) if you are interested, either as a sponsor or as a contributor. +To learn how funds are raised and distributed, see the [Testcontainers project funding policy](https://github.com/testcontainers/.github/blob/main/FUNDING.md). Financial matters are overseen by the Testcontainers Steering Committee, as described in the [project governance document](https://github.com/testcontainers/.github/blob/main/GOVERNANCE.md). diff --git a/docs/bounty.md b/docs/bounty.md deleted file mode 100644 index 56ee501062c..00000000000 --- a/docs/bounty.md +++ /dev/null @@ -1,51 +0,0 @@ -# Testcontainers issue bounty policy - -## General - -We want to use issue bounties to encourage contributions in areas that are important to our sponsors, or tricky to solve. -This includes bug fixes and new features. -We hope that this will provide incentives to tackle issues, and gives sponsors a way to influence where development time is expended. -We also want to reward our contributors, some of whom make huge efforts to improve Testcontainers and help their fellow developers! - -!!! note - It's early days for our use of sponsorship, so we expect to evolve this policy over time, possibly without notice. In the event of any ambiguity or dispute, the [Testcontainers org core maintainers](#organisation-core-maintainers) have the final say. - - If you'd like to suggest an improvement to this policy, we'd be grateful for your input - please raise a pull request! - -## For Sponsors - -Sponsors will be able to create a number of 'bounties' per month, varying according to sponsorship tier. - -As a sponsor, the process for creating a bounty is as follows: - -* Raise an issue, or find an existing issue that describes the bug or feature. -* Start a discussion with the [Testcontainers org core maintainers](#organisation-core-maintainers) to agree that the issue is suitable for a bounty, and how much the reward amount should be. -* Once agreed, we will assign a label to the issue so that interested developers can find it. - -Sponsors can create up to 1 or 3 bounties (according to tier) _per calendar month_ - i.e. the counter resets on the 1st of each month. -If a sponsor does not use their full quota of bounty credits in a calendar month, they cannot be rolled over to the next month. - -Bounties will expire 90 days after creation - after this time, if they have not been resolved we will close them. - -## For Contributors - -As a contributor, the process for working on an issue with a bounty attached is: - -* Find an issue with a bounty attached to it and no assignee, clarify the requirements if necessary, and consider how you would approach working on it. -* Start a discussion with the [Testcontainers org core maintainers](#organisation-core-maintainers) and the bounty owner. To avoid unpleasant surprises at review time, we'll try to confirm that we're happy with your proposed solution. -* If we're happy with your proposed solution, we will assign the ticket to you. -* Once work is complete, we will go through the PR process as usual and merge the work when finished. -* To receive the bounty reward, [raise an invoice](https://opencollective.com/testcontainers/expenses/new) on Open Collective, following the expenses policy on that page. - -Note that a 20% cut of the bounty amount will normally be assigned to project maintainers for PR review work. -We believe this reflects that PR review can often be a significant amount of work for some issues - and also gives maintainers an incentive to complete the review and unlock the bounty reward! -Some pull requests are so well done that very little review is necessary. If that happens, the maintainers may choose not to take a cut of the bounty, and instead release the full amount to the contributor. - -## Organisation core maintainers - -The organisation core maintainers are: - -* Richard North (@rnorth) -* Sergei Egorov (@bsideup) -* Kevin Wittek (@kiview) - diff --git a/mkdocs.yml b/mkdocs.yml index ad75b0b2f22..ae447212912 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -137,7 +137,6 @@ nav: - Contributing: - contributing.md - contributing_docs.md - - bounty.md edit_uri: edit/main/docs/ extra: latest_version: 2.0.5 From ca487b3af3a613ff4c875ee5ca061734e2f92442 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:17:58 +0000 Subject: [PATCH 1172/1224] Bump com.orientechnologies:orientdb-client in /modules/orientdb Bumps [com.orientechnologies:orientdb-client](https://github.com/orientechnologies/orientdb) from 3.2.51 to 3.2.53. - [Release notes](https://github.com/orientechnologies/orientdb/releases) - [Changelog](https://github.com/orientechnologies/orientdb/blob/3.2.53/history.txt) - [Commits](https://github.com/orientechnologies/orientdb/compare/3.2.51...3.2.53) --- updated-dependencies: - dependency-name: com.orientechnologies:orientdb-client dependency-version: 3.2.53 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/orientdb/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/orientdb/build.gradle b/modules/orientdb/build.gradle index 39b15e5a420..6d691b407ce 100644 --- a/modules/orientdb/build.gradle +++ b/modules/orientdb/build.gradle @@ -3,8 +3,8 @@ description = "Testcontainers :: Orientdb" dependencies { api project(":testcontainers") - api "com.orientechnologies:orientdb-client:3.2.51" + api "com.orientechnologies:orientdb-client:3.2.53" testImplementation 'org.apache.tinkerpop:gremlin-driver:3.8.1' - testImplementation "com.orientechnologies:orientdb-gremlin:3.2.51" + testImplementation "com.orientechnologies:orientdb-gremlin:3.2.53" } From 14f85658f57e5825f752a0fca73a9ac2a5f421cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:20:59 +0000 Subject: [PATCH 1173/1224] Bump com.solacesystems:sol-jcsmp in /modules/solace Bumps [com.solacesystems:sol-jcsmp](https://github.com/SolaceDev/solsuite) from 10.29.1 to 10.30.1. - [Commits](https://github.com/SolaceDev/solsuite/commits) --- updated-dependencies: - dependency-name: com.solacesystems:sol-jcsmp dependency-version: 10.30.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solace/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solace/build.gradle b/modules/solace/build.gradle index 9172fbe878f..1a6d2ed5a65 100644 --- a/modules/solace/build.gradle +++ b/modules/solace/build.gradle @@ -5,7 +5,7 @@ dependencies { shaded 'org.awaitility:awaitility:4.3.0' - testImplementation 'com.solacesystems:sol-jcsmp:10.29.1' + testImplementation 'com.solacesystems:sol-jcsmp:10.30.1' testImplementation 'org.apache.qpid:qpid-jms-client:0.61.0' testImplementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.5' testImplementation 'org.apache.httpcomponents:fluent-hc:4.5.14' From 7e188cfcd17309e6e64d8e05951ee2438cd58059 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:23:38 +0000 Subject: [PATCH 1174/1224] Bump com.oracle.database.jdbc:ojdbc11 in /modules/oracle-free Bumps com.oracle.database.jdbc:ojdbc11 from 23.26.1.0.0 to 23.26.2.0.0. --- updated-dependencies: - dependency-name: com.oracle.database.jdbc:ojdbc11 dependency-version: 23.26.2.0.0 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/oracle-free/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/oracle-free/build.gradle b/modules/oracle-free/build.gradle index bcbf7739123..935fe701f6f 100644 --- a/modules/oracle-free/build.gradle +++ b/modules/oracle-free/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'com.oracle.database.r2dbc:oracle-r2dbc:1.3.0' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.1.0.0' + testImplementation 'com.oracle.database.jdbc:ojdbc11:23.26.2.0.0' compileOnly 'org.jetbrains:annotations:26.1.0' From 8d55dd42ec358e9b3bb06ad9a70e031572decf86 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Jun 2026 12:37:03 +0000 Subject: [PATCH 1175/1224] Bump dev.openfga:openfga-sdk from 0.9.7 to 0.9.9 in /modules/openfga Bumps [dev.openfga:openfga-sdk](https://github.com/openfga/java-sdk) from 0.9.7 to 0.9.9. - [Release notes](https://github.com/openfga/java-sdk/releases) - [Changelog](https://github.com/openfga/java-sdk/blob/main/CHANGELOG.md) - [Commits](https://github.com/openfga/java-sdk/compare/v0.9.7...v0.9.9) --- updated-dependencies: - dependency-name: dev.openfga:openfga-sdk dependency-version: 0.9.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/openfga/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/openfga/build.gradle b/modules/openfga/build.gradle index 983c42f2efd..b6bf9ff8e70 100644 --- a/modules/openfga/build.gradle +++ b/modules/openfga/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: OpenFGA" dependencies { api project(':testcontainers') - testImplementation 'dev.openfga:openfga-sdk:0.9.7' + testImplementation 'dev.openfga:openfga-sdk:0.9.9' } test { From fb3fed43420d854bcbd57a5348d1b11c40642d90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20de=20la=20Pe=C3=B1a?= Date: Wed, 17 Jun 2026 02:09:46 +0200 Subject: [PATCH 1176/1224] Update testcontainers/sshd image from 1.3.0 to 1.4.0 (#11843) --- .../org/testcontainers/containers/PortForwardingContainer.java | 2 +- docs/features/configuration.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java index a5f7c29a8b4..dd4b6e94c97 100644 --- a/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java +++ b/core/src/main/java/org/testcontainers/containers/PortForwardingContainer.java @@ -24,7 +24,7 @@ public enum PortForwardingContainer { private static ContainerDef DEFINITION = new ContainerDef() { { - setImage(DockerImageName.parse("testcontainers/sshd:1.3.0")); + setImage(DockerImageName.parse("testcontainers/sshd:1.4.0")); addExposedTcpPort(22); addEnvVar("PASSWORD", PASSWORD); } diff --git a/docs/features/configuration.md b/docs/features/configuration.md index c13c0a659e3..389936cb89f 100644 --- a/docs/features/configuration.md +++ b/docs/features/configuration.md @@ -52,7 +52,7 @@ Some companies disallow the usage of Docker Hub, but you can override `*.image` > **tinyimage.container.image = alpine:3.17** > Used to check whether images can be pulled at startup, and always required (unless [startup checks are disabled](#disabling-the-startup-checks)) -> **sshd.container.image = testcontainers/sshd:1.1.0** +> **sshd.container.image = testcontainers/sshd:1.4.0** > Required if [exposing host ports to containers](./networking.md#exposing-host-ports-to-the-container) > **vncrecorder.container.image = testcontainers/vnc-recorder:1.3.0** From deb78e1e6e47675f56e8d7b3f4747093d66f1baa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Prinet?= Date: Mon, 22 Jun 2026 18:56:04 +0200 Subject: [PATCH 1177/1224] Migrate to OSS Community Develocity Instance (#11845) --- .github/workflows/ci-windows.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/moby-latest.yml | 2 +- README.md | 2 +- settings.gradle | 15 +++++++++------ 5 files changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/ci-windows.yml b/.github/workflows/ci-windows.yml index 1f4ea75b27f..dbc1e78aa32 100644 --- a/.github/workflows/ci-windows.yml +++ b/.github/workflows/ci-windows.yml @@ -43,7 +43,7 @@ permissions: contents: read env: - DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} + DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }} jobs: main: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc128acb50c..a3b19e81823 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -43,7 +43,7 @@ permissions: env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} + DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }} jobs: core: diff --git a/.github/workflows/moby-latest.yml b/.github/workflows/moby-latest.yml index 91058a25f6a..3c4cc949f11 100644 --- a/.github/workflows/moby-latest.yml +++ b/.github/workflows/moby-latest.yml @@ -13,7 +13,7 @@ on: - cron: '59 23 * * *' env: - DEVELOCITY_ACCESS_KEY: ${{ secrets.GRADLE_ENTERPRISE_ACCESS_KEY }} + DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }} jobs: test_docker: diff --git a/README.md b/README.md index 2cd203a0335..26f45f451e1 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=33816473&machine=standardLinux32gb&devcontainer_path=.devcontainer%2Fdevcontainer.json&location=EastUs) -[![Revved up by Develocity](https://img.shields.io/badge/Revved%20up%20by-Develocity-06A0CE?logo=Gradle&labelColor=02303A)](https://ge.testcontainers.org/scans) +[![Revved up by Develocity](https://img.shields.io/badge/Revved%20up%20by-Develocity-06A0CE?logo=Gradle&labelColor=02303A)](https://community.develocity.cloud/scans?search.rootProjectNames=testcontainers-java) > Testcontainers is a Java library that supports JUnit tests, providing lightweight, throwaway instances of common databases, Selenium web browsers, or anything else that can run in a Docker container. diff --git a/settings.gradle b/settings.gradle index d59d26df2df..374dbbb00dc 100644 --- a/settings.gradle +++ b/settings.gradle @@ -5,8 +5,8 @@ buildscript { } } dependencies { - classpath "com.gradle.enterprise:com.gradle.enterprise.gradle.plugin:3.19.2" - classpath "com.gradle:common-custom-user-data-gradle-plugin:2.5.0" + classpath "com.gradle:develocity-gradle-plugin:4.4.1" + classpath "com.gradle:common-custom-user-data-gradle-plugin:2.6.0" classpath "org.gradle.toolchains:foojay-resolver:0.8.0" } } @@ -39,19 +39,22 @@ buildCache { enabled = !isCI } remote(develocity.buildCache) { - push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("DEVELOCITY_ACCESS_KEY") enabled = true + // Check access key presence to avoid build cache errors on PR builds when access key is not present + push = isCI && !System.getenv("READ_ONLY_REMOTE_GRADLE_CACHE") && System.getenv("DEVELOCITY_ACCESS_KEY") != null } } develocity { + server = "https://community.develocity.cloud" + projectId = "testcontainers" buildScan { - server = "https://ge.testcontainers.org/" publishing.onlyIf { it.authenticated } uploadInBackground = !isCI - capture.fileFingerprints = true + obfuscation { + ipAddresses { it.collect { "0.0.0.0" } } + } } - } From a7981f138841c62294300a548d29aed6797f6ec9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:06 +0000 Subject: [PATCH 1178/1224] Bump org.postgresql:postgresql in /modules/postgresql Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12. - [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.7.10...REL42.7.12) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 14faa32c728..db7382f34d3 100644 --- a/modules/postgresql/build.gradle +++ b/modules/postgresql/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'org.postgresql:postgresql:42.7.10' + testRuntimeOnly 'org.postgresql:postgresql:42.7.12' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' From 226b760bc660774966a2d2c501078c312874f6c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:12 +0000 Subject: [PATCH 1179/1224] Bump software.amazon.awssdk:bom in /modules/localstack Bumps software.amazon.awssdk:bom from 2.42.33 to 2.46.20. --- updated-dependencies: - dependency-name: software.amazon.awssdk:bom dependency-version: 2.46.20 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 3af7b5cee55..eca4aeaa27a 100644 --- a/modules/localstack/build.gradle +++ b/modules/localstack/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Localstack" dependencies { api project(':testcontainers') - testImplementation platform("software.amazon.awssdk:bom:2.42.33") + testImplementation platform("software.amazon.awssdk:bom:2.46.20") testImplementation 'software.amazon.awssdk:s3' testImplementation 'software.amazon.awssdk:sqs' testImplementation 'software.amazon.awssdk:cloudwatchlogs' From 922fe06a7732451767674e84995e3cc13cd32dab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:12 +0000 Subject: [PATCH 1180/1224] Bump org.postgresql:postgresql in /modules/junit-jupiter Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12. - [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.7.10...REL42.7.12) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 7f4d55e9bd3..d42096ad54f 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -14,6 +14,6 @@ dependencies { exclude(module: 'hamcrest-core') } - testRuntimeOnly 'org.postgresql:postgresql:42.7.10' + testRuntimeOnly 'org.postgresql:postgresql:42.7.12' testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' } From 106842608ecabb931f37ee69d2f51bf6c9124529 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:14 +0000 Subject: [PATCH 1181/1224] Bump org.apache.kafka:kafka-clients in /modules/kafka Bumps org.apache.kafka:kafka-clients from 3.8.0 to 4.3.1. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-version: 4.3.1 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- 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 4e89be9a32e..aabad9553b0 100644 --- a/modules/kafka/build.gradle +++ b/modules/kafka/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Kafka" dependencies { api project(':testcontainers') - testImplementation 'org.apache.kafka:kafka-clients:3.8.0' + testImplementation 'org.apache.kafka:kafka-clients:4.3.1' testImplementation 'com.google.guava:guava:23.0' testImplementation 'org.awaitility:awaitility:4.3.0' } From 538b9d6855b56af229faa43001573f15ae22941b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:15 +0000 Subject: [PATCH 1182/1224] Bump org.mariadb.jdbc:mariadb-java-client in /modules/mariadb Bumps [org.mariadb.jdbc:mariadb-java-client](https://github.com/mariadb-corporation/mariadb-connector-j) from 3.5.8 to 3.5.9. - [Release notes](https://github.com/mariadb-corporation/mariadb-connector-j/releases) - [Changelog](https://github.com/mariadb-corporation/mariadb-connector-j/blob/main/CHANGELOG.md) - [Commits](https://github.com/mariadb-corporation/mariadb-connector-j/compare/3.5.8...3.5.9) --- updated-dependencies: - dependency-name: org.mariadb.jdbc:mariadb-java-client dependency-version: 3.5.9 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 fd8569f6c36..10086b4e058 100644 --- a/modules/mariadb/build.gradle +++ b/modules/mariadb/build.gradle @@ -7,7 +7,7 @@ dependencies { compileOnly 'org.mariadb:r2dbc-mariadb:1.0.3' testImplementation project(':testcontainers-jdbc-test') - testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.8' + testImplementation 'org.mariadb.jdbc:mariadb-java-client:3.5.9' testImplementation testFixtures(project(':testcontainers-r2dbc')) testRuntimeOnly 'org.mariadb:r2dbc-mariadb:1.0.3' From 647439f1330553145d1d452033ed21bceb8aca2a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:21 +0000 Subject: [PATCH 1183/1224] Bump redis.clients:jedis from 7.4.1 to 7.5.3 in /modules/junit-jupiter Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 7.4.1 to 7.5.3. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v7.4.1...v7.5.3) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.5.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 7f4d55e9bd3..efa731c1cb8 100644 --- a/modules/junit-jupiter/build.gradle +++ b/modules/junit-jupiter/build.gradle @@ -8,7 +8,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') testImplementation 'com.zaxxer:HikariCP:7.0.2' - testImplementation 'redis.clients:jedis:7.4.1' + testImplementation 'redis.clients:jedis:7.5.3' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation ('org.mockito:mockito-core:4.11.0') { exclude(module: 'hamcrest-core') From f369d44581b0f3bccef2a301b550ec03da79cb6c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:23 +0000 Subject: [PATCH 1184/1224] Bump org.apache.tomcat:tomcat-jdbc in /modules/jdbc-test Bumps org.apache.tomcat:tomcat-jdbc from 11.0.21 to 11.0.23. --- updated-dependencies: - dependency-name: org.apache.tomcat:tomcat-jdbc dependency-version: 11.0.23 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 cbf94737eed..44fe705a255 100644 --- a/modules/jdbc-test/build.gradle +++ b/modules/jdbc-test/build.gradle @@ -8,7 +8,7 @@ dependencies { api 'org.assertj:assertj-core:3.27.7' - api 'org.apache.tomcat:tomcat-jdbc:11.0.21' + api 'org.apache.tomcat:tomcat-jdbc:11.0.23' api 'org.vibur:vibur-dbcp:26.0' api 'com.mysql:mysql-connector-j:9.6.0' api 'org.junit.jupiter:junit-jupiter:5.14.3' From efa5ea2ff9f9f976f952fff43564b788ae6775fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:26 +0000 Subject: [PATCH 1185/1224] Bump org.elasticsearch.client:elasticsearch-rest-client Bumps [org.elasticsearch.client:elasticsearch-rest-client](https://github.com/elastic/elasticsearch) from 9.3.3 to 9.4.3. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Changelog](https://github.com/elastic/elasticsearch/blob/main/docs/changelog.yml) - [Commits](https://github.com/elastic/elasticsearch/compare/v9.3.3...v9.4.3) --- updated-dependencies: - dependency-name: org.elasticsearch.client:elasticsearch-rest-client dependency-version: 9.4.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 114a07ffe85..7f57916e991 100644 --- a/modules/elasticsearch/build.gradle +++ b/modules/elasticsearch/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: elasticsearch" dependencies { api project(':testcontainers') - testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.3.3" + testImplementation "org.elasticsearch.client:elasticsearch-rest-client:9.4.3" testImplementation "org.elasticsearch.client:transport:7.17.29" } From 232db0d97a148c8eaf08e1695cda3e6c53253373 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:31 +0000 Subject: [PATCH 1186/1224] Bump redis.clients:jedis from 7.4.1 to 7.5.3 in /modules/toxiproxy Bumps [redis.clients:jedis](https://github.com/redis/jedis) from 7.4.1 to 7.5.3. - [Release notes](https://github.com/redis/jedis/releases) - [Commits](https://github.com/redis/jedis/compare/v7.4.1...v7.5.3) --- updated-dependencies: - dependency-name: redis.clients:jedis dependency-version: 7.5.3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/toxiproxy/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/toxiproxy/build.gradle b/modules/toxiproxy/build.gradle index 205147293fd..3e3a63a1fca 100644 --- a/modules/toxiproxy/build.gradle +++ b/modules/toxiproxy/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') api 'eu.rekawek.toxiproxy:toxiproxy-java:2.1.11' - testImplementation 'redis.clients:jedis:7.4.1' + testImplementation 'redis.clients:jedis:7.5.3' } From c3442a67d235d22ebfdf0ae8be97dc4e7c5dd16c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:33 +0000 Subject: [PATCH 1187/1224] Bump org.postgresql:postgresql from 42.7.10 to 42.7.12 in /modules/spock Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12. - [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.7.10...REL42.7.12) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 acea4c64eeb..bd378b4c4c9 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation 'com.zaxxer:HikariCP:7.0.2' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' - testRuntimeOnly 'org.postgresql:postgresql:42.7.10' + testRuntimeOnly 'org.postgresql:postgresql:42.7.12' testRuntimeOnly 'com.mysql:mysql-connector-j:9.6.0' testRuntimeOnly platform('org.junit:junit-bom:5.14.3') testRuntimeOnly 'org.junit.platform:junit-platform-launcher' From 4deee263885ae8db3278985a4fb1758540c43eab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:33 +0000 Subject: [PATCH 1188/1224] Bump io.r2dbc:r2dbc-mssql in /modules/mssqlserver Bumps [io.r2dbc:r2dbc-mssql](https://github.com/r2dbc/r2dbc-mssql) from 1.0.4.RELEASE to 1.0.5.RELEASE. - [Release notes](https://github.com/r2dbc/r2dbc-mssql/releases) - [Changelog](https://github.com/r2dbc/r2dbc-mssql/blob/main/CHANGELOG) - [Commits](https://github.com/r2dbc/r2dbc-mssql/compare/v1.0.4.RELEASE...v1.0.5.RELEASE) --- updated-dependencies: - dependency-name: io.r2dbc:r2dbc-mssql dependency-version: 1.0.5.RELEASE dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- 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 a03534cf147..cb3e7a5b55e 100644 --- a/modules/mssqlserver/build.gradle +++ b/modules/mssqlserver/build.gradle @@ -4,13 +4,13 @@ dependencies { api project(':testcontainers-jdbc') compileOnly project(':testcontainers-r2dbc') - compileOnly 'io.r2dbc:r2dbc-mssql:1.0.4.RELEASE' + compileOnly 'io.r2dbc:r2dbc-mssql:1.0.5.RELEASE' testImplementation project(':testcontainers-jdbc-test') testImplementation 'com.microsoft.sqlserver:mssql-jdbc:13.4.0.jre11' testImplementation project(':testcontainers-r2dbc') - testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.4.RELEASE' + testRuntimeOnly 'io.r2dbc:r2dbc-mssql:1.0.5.RELEASE' // MSSQL's wait strategy requires the JDBC driver testImplementation testFixtures(project(':testcontainers-r2dbc')) From c9977230f831b7c043adf9b318ce709bda231191 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:35 +0000 Subject: [PATCH 1189/1224] Bump com.zaxxer:HikariCP from 7.0.2 to 7.1.0 in /modules/spock Bumps [com.zaxxer:HikariCP](https://github.com/brettwooldridge/HikariCP) from 7.0.2 to 7.1.0. - [Changelog](https://github.com/brettwooldridge/HikariCP/blob/dev/CHANGES) - [Commits](https://github.com/brettwooldridge/HikariCP/compare/HikariCP-7.0.2...HikariCP-7.1.0) --- updated-dependencies: - dependency-name: com.zaxxer:HikariCP dependency-version: 7.1.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 acea4c64eeb..91f35bca959 100644 --- a/modules/spock/build.gradle +++ b/modules/spock/build.gradle @@ -12,7 +12,7 @@ dependencies { testImplementation project(':testcontainers-mysql') testImplementation project(':testcontainers-postgresql') - testImplementation 'com.zaxxer:HikariCP:7.0.2' + testImplementation 'com.zaxxer:HikariCP:7.1.0' testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testRuntimeOnly 'org.postgresql:postgresql:42.7.10' From 0150976437c66be5369dc444f5b074d50f565d2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:37 +0000 Subject: [PATCH 1190/1224] Bump com.squareup.okhttp3:okhttp from 5.3.2 to 5.4.0 in /modules/azure Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 5.3.2 to 5.4.0. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-5.3.2...parent-5.4.0) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/azure/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/azure/build.gradle b/modules/azure/build.gradle index faabca60be9..167c0c26f1a 100644 --- a/modules/azure/build.gradle +++ b/modules/azure/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':testcontainers-mssqlserver') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:5.3.2' + shaded 'com.squareup.okhttp3:okhttp:5.4.0' testImplementation platform("com.azure:azure-sdk-bom:1.2.32") testImplementation 'com.azure:azure-cosmos' From 42eb0ebc2065843888da59bc09e0d6aec8687e2b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:22:39 +0000 Subject: [PATCH 1191/1224] Bump com.google.cloud:libraries-bom in /modules/gcloud Bumps [com.google.cloud:libraries-bom](https://github.com/googleapis/java-cloud-bom) from 26.79.0 to 26.84.0. - [Release notes](https://github.com/googleapis/java-cloud-bom/releases) - [Commits](https://github.com/googleapis/java-cloud-bom/compare/v26.79.0...v26.84.0) --- updated-dependencies: - dependency-name: com.google.cloud:libraries-bom dependency-version: 26.84.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/gcloud/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 08fb09887dd..3a020bdb759 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: GCloud" dependencies { api project(':testcontainers') - testImplementation platform("com.google.cloud:libraries-bom:26.79.0") + testImplementation platform("com.google.cloud:libraries-bom:26.84.0") testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' From 3d41f9807d66565660a62c1ee9a3f82ca53bd99e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:44:03 +0000 Subject: [PATCH 1192/1224] Bump io.projectreactor:reactor-core in /modules/r2dbc Bumps [io.projectreactor:reactor-core](https://github.com/reactor/reactor-core) from 3.8.4 to 3.8.6. - [Release notes](https://github.com/reactor/reactor-core/releases) - [Commits](https://github.com/reactor/reactor-core/compare/v3.8.4...v3.8.6) --- updated-dependencies: - dependency-name: io.projectreactor:reactor-core dependency-version: 3.8.6 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/r2dbc/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/r2dbc/build.gradle b/modules/r2dbc/build.gradle index afad9a553ef..9c93885fd6f 100644 --- a/modules/r2dbc/build.gradle +++ b/modules/r2dbc/build.gradle @@ -11,7 +11,7 @@ dependencies { testImplementation 'io.r2dbc:r2dbc-postgresql:0.8.13.RELEASE' testImplementation project(':testcontainers-postgresql') - testFixturesImplementation 'io.projectreactor:reactor-core:3.8.4' + testFixturesImplementation 'io.projectreactor:reactor-core:3.8.6' testFixturesImplementation 'org.assertj:assertj-core:3.27.7' testFixturesImplementation 'org.junit.jupiter:junit-jupiter:5.14.3' } From 039ee532d6701b7a398cff664355d1f2bb3a8f2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:45:45 +0000 Subject: [PATCH 1193/1224] Bump com.ibm.db2:jcc from 12.1.4.0 to 12.1.5.0 in /modules/db2 Bumps com.ibm.db2:jcc from 12.1.4.0 to 12.1.5.0. --- updated-dependencies: - dependency-name: com.ibm.db2:jcc dependency-version: 12.1.5.0 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/db2/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db2/build.gradle b/modules/db2/build.gradle index 5546fdb6c65..afae0bfd751 100644 --- a/modules/db2/build.gradle +++ b/modules/db2/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'com.ibm.db2:jcc:12.1.4.0' + testRuntimeOnly 'com.ibm.db2:jcc:12.1.5.0' } From 4e64025cd8b80ac40d277f9389cb1875ec375cbd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:46:09 +0000 Subject: [PATCH 1194/1224] Bump com.squareup.okhttp3:okhttp from 5.3.2 to 5.4.0 in /modules/solr Bumps [com.squareup.okhttp3:okhttp](https://github.com/square/okhttp) from 5.3.2 to 5.4.0. - [Changelog](https://github.com/square/okhttp/blob/master/CHANGELOG.md) - [Commits](https://github.com/square/okhttp/compare/parent-5.3.2...parent-5.4.0) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/solr/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/build.gradle b/modules/solr/build.gradle index ca44d695421..509bce7c66f 100644 --- a/modules/solr/build.gradle +++ b/modules/solr/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Solr" dependencies { api project(':testcontainers') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:5.3.2' + shaded 'com.squareup.okhttp3:okhttp:5.4.0' testImplementation 'org.apache.solr:solr-solrj:8.11.4' } From ac2d4f0a78cbff6b8dfde02d7e990c0dee6ae9ca Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:47:36 +0000 Subject: [PATCH 1195/1224] Bump io.fabric8:kubernetes-client from 7.6.1 to 7.8.0 in /modules/k3s Bumps [io.fabric8:kubernetes-client](https://github.com/fabric8io/kubernetes-client) from 7.6.1 to 7.8.0. - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v7.6.1...v7.8.0) --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-version: 7.8.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/k3s/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/k3s/build.gradle b/modules/k3s/build.gradle index 645dfd8e68d..0a8d628b469 100644 --- a/modules/k3s/build.gradle +++ b/modules/k3s/build.gradle @@ -6,6 +6,6 @@ dependencies { // Synchronize with the jackson version, must match major and minor version shaded 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.4' - testImplementation 'io.fabric8:kubernetes-client:7.6.1' + testImplementation 'io.fabric8:kubernetes-client:7.8.0' testImplementation 'io.kubernetes:client-java:25.0.0-legacy' } From 911b4d43a9882fbfa5aa15296c5c954f4de145cd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:47:45 +0000 Subject: [PATCH 1196/1224] Bump com.rabbitmq:amqp-client from 5.29.0 to 5.33.0 in /modules/rabbitmq Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.29.0 to 5.33.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.29.0...v5.33.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-version: 5.33.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/rabbitmq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/rabbitmq/build.gradle b/modules/rabbitmq/build.gradle index 441ff2ddb22..1b9cd99168b 100644 --- a/modules/rabbitmq/build.gradle +++ b/modules/rabbitmq/build.gradle @@ -3,6 +3,6 @@ description = "Testcontainers :: RabbitMQ" dependencies { api project(":testcontainers") - testImplementation 'com.rabbitmq:amqp-client:5.29.0' + testImplementation 'com.rabbitmq:amqp-client:5.33.0' compileOnly 'org.jetbrains:annotations:26.1.0' } From d497ded698321a45f41bd744f403f77d4ce9fa7a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:48:04 +0000 Subject: [PATCH 1197/1224] Bump org.apache.kafka:kafka-clients in /modules/redpanda Bumps org.apache.kafka:kafka-clients from 4.2.0 to 4.3.1. --- updated-dependencies: - dependency-name: org.apache.kafka:kafka-clients dependency-version: 4.3.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/redpanda/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/redpanda/build.gradle b/modules/redpanda/build.gradle index dc544fd394b..40c88ea347e 100644 --- a/modules/redpanda/build.gradle +++ b/modules/redpanda/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') shaded 'org.freemarker:freemarker:2.3.34' - testImplementation 'org.apache.kafka:kafka-clients:4.2.0' + testImplementation 'org.apache.kafka:kafka-clients:4.3.1' testImplementation 'io.rest-assured:rest-assured:5.5.7' testImplementation 'org.awaitility:awaitility:4.3.0' } From e1b5ff02f9ea7210d8ddf79f4f0a347bb57c8640 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:48:06 +0000 Subject: [PATCH 1198/1224] Bump org.javassist:javassist in /modules/hivemq Bumps [org.javassist:javassist](https://github.com/jboss-javassist/javassist) from 3.30.2-GA to 3.32.0-GA. - [Release notes](https://github.com/jboss-javassist/javassist/releases) - [Changelog](https://github.com/jboss-javassist/javassist/blob/master/Changes.md) - [Commits](https://github.com/jboss-javassist/javassist/commits) --- updated-dependencies: - dependency-name: org.javassist:javassist dependency-version: 3.32.0-GA dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 6750c495421..ec67188ba44 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -6,7 +6,7 @@ dependencies { shaded("org.apache.commons:commons-lang3:3.20.0") shaded("commons-io:commons-io:2.21.0") - shaded("org.javassist:javassist:3.30.2-GA") + shaded("org.javassist:javassist:3.32.0-GA") shaded("org.jboss.shrinkwrap:shrinkwrap-api:1.2.6") shaded("org.jboss.shrinkwrap:shrinkwrap-impl-base:1.2.6") shaded("net.lingala.zip4j:zip4j:2.11.6") From b81a28aecac928e3d01ff6e47a18cd5ec710e414 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:48:10 +0000 Subject: [PATCH 1199/1224] Bump ch.qos.logback:logback-classic in /modules/hivemq Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.5.32 to 1.5.37. - [Release notes](https://github.com/qos-ch/logback/releases) - [Commits](https://github.com/qos-ch/logback/compare/v_1.5.32...v_1.5.37) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-version: 1.5.37 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 6750c495421..52006afb0c3 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -15,7 +15,7 @@ dependencies { testImplementation("com.hivemq:hivemq-extension-sdk:4.50.0") testImplementation("com.hivemq:hivemq-mqtt-client:1.3.13") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") - testImplementation("ch.qos.logback:logback-classic:1.5.32") + testImplementation("ch.qos.logback:logback-classic:1.5.37") } test { From bd1ec01824dd1914af664b17b1c8e53464efed06 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:48:17 +0000 Subject: [PATCH 1200/1224] Bump com.hivemq:hivemq-mqtt-client in /modules/hivemq Bumps [com.hivemq:hivemq-mqtt-client](https://github.com/hivemq/hivemq-mqtt-client) from 1.3.13 to 1.3.15. - [Release notes](https://github.com/hivemq/hivemq-mqtt-client/releases) - [Changelog](https://github.com/hivemq/hivemq-mqtt-client/blob/master/RELEASE.md) - [Commits](https://github.com/hivemq/hivemq-mqtt-client/compare/v1.3.13...v1.3.15) --- updated-dependencies: - dependency-name: com.hivemq:hivemq-mqtt-client dependency-version: 1.3.15 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/hivemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/hivemq/build.gradle b/modules/hivemq/build.gradle index 6750c495421..f8e820f14d9 100644 --- a/modules/hivemq/build.gradle +++ b/modules/hivemq/build.gradle @@ -13,7 +13,7 @@ dependencies { testImplementation(project(":testcontainers-junit-jupiter")) testImplementation("com.hivemq:hivemq-extension-sdk:4.50.0") - testImplementation("com.hivemq:hivemq-mqtt-client:1.3.13") + testImplementation("com.hivemq:hivemq-mqtt-client:1.3.15") testImplementation("org.apache.httpcomponents:httpclient:4.5.14") testImplementation("ch.qos.logback:logback-classic:1.5.32") } From 473942d350079dcf6b76cf308c37d78524659cc2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:48:46 +0000 Subject: [PATCH 1201/1224] Bump org.postgresql:postgresql in /modules/questdb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12. - [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.7.10...REL42.7.12) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/questdb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/questdb/build.gradle b/modules/questdb/build.gradle index 5e9da5686d8..04b714ff783 100644 --- a/modules/questdb/build.gradle +++ b/modules/questdb/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.10' + testRuntimeOnly 'org.postgresql:postgresql:42.7.12' testImplementation project(':testcontainers-jdbc-test') testImplementation 'org.questdb:questdb:9.2.2' From ca2574ed8ea58fd8a92195965856ba30595e22cc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:48:58 +0000 Subject: [PATCH 1202/1224] Bump org.postgresql:postgresql in /modules/cratedb Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.10 to 42.7.12. - [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.7.10...REL42.7.12) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-version: 42.7.12 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/cratedb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cratedb/build.gradle b/modules/cratedb/build.gradle index 7b6a3468e03..62405d559b2 100644 --- a/modules/cratedb/build.gradle +++ b/modules/cratedb/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: JDBC :: CrateDB" dependencies { api project(':testcontainers-jdbc') - testRuntimeOnly 'org.postgresql:postgresql:42.7.10' + testRuntimeOnly 'org.postgresql:postgresql:42.7.12' testImplementation project(':testcontainers-jdbc-test') From 8af83431709d5eb76551c5735d94d58be1eaa391 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:49:21 +0000 Subject: [PATCH 1203/1224] Bump io.minio:minio from 9.0.0 to 9.0.3 in /modules/minio Bumps [io.minio:minio](https://github.com/minio/minio-java) from 9.0.0 to 9.0.3. - [Release notes](https://github.com/minio/minio-java/releases) - [Commits](https://github.com/minio/minio-java/compare/9.0.0...9.0.3) --- updated-dependencies: - dependency-name: io.minio:minio dependency-version: 9.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/minio/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/minio/build.gradle b/modules/minio/build.gradle index bca68abc4d6..ce592fced2d 100644 --- a/modules/minio/build.gradle +++ b/modules/minio/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: MinIO" dependencies { api project(':testcontainers') - testImplementation("io.minio:minio:9.0.0") + testImplementation("io.minio:minio:9.0.3") } From 22a6778a1ea12e03ef2037e6d35cc23a599c4619 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:50:38 +0000 Subject: [PATCH 1204/1224] Bump org.apache.activemq:artemis-jakarta-client in /modules/activemq Bumps org.apache.activemq:artemis-jakarta-client from 2.53.0 to 2.55.0. --- updated-dependencies: - dependency-name: org.apache.activemq:artemis-jakarta-client dependency-version: 2.55.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/activemq/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/activemq/build.gradle b/modules/activemq/build.gradle index d88c0053379..c77b386698f 100644 --- a/modules/activemq/build.gradle +++ b/modules/activemq/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(':testcontainers') testImplementation "org.apache.activemq:activemq-client:6.2.4" - testImplementation "org.apache.activemq:artemis-jakarta-client:2.53.0" + testImplementation "org.apache.activemq:artemis-jakarta-client:2.55.0" } From 5022d0095fbd977c374ec7cd546ce6caaaedf38f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:51:46 +0000 Subject: [PATCH 1205/1224] Bump io.weaviate:client6 from 6.1.0 to 6.3.0 in /modules/weaviate Bumps [io.weaviate:client6](https://github.com/weaviate/java-client) from 6.1.0 to 6.3.0. - [Release notes](https://github.com/weaviate/java-client/releases) - [Commits](https://github.com/weaviate/java-client/compare/6.1.0...6.3.0) --- updated-dependencies: - dependency-name: io.weaviate:client6 dependency-version: 6.3.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/weaviate/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/weaviate/build.gradle b/modules/weaviate/build.gradle index 5392b585b71..404329b161f 100644 --- a/modules/weaviate/build.gradle +++ b/modules/weaviate/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Weaviate" dependencies { api project(':testcontainers') - testImplementation 'io.weaviate:client6:6.1.0' + testImplementation 'io.weaviate:client6:6.3.0' } test { From 325a51286706eea0aef9c527516d6db020fabe97 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:53:49 +0000 Subject: [PATCH 1206/1224] Bump io.micrometer:micrometer-registry-otlp in /modules/grafana Bumps [io.micrometer:micrometer-registry-otlp](https://github.com/micrometer-metrics/micrometer) from 1.16.5 to 1.17.0. - [Release notes](https://github.com/micrometer-metrics/micrometer/releases) - [Commits](https://github.com/micrometer-metrics/micrometer/compare/v1.16.5...v1.17.0) --- updated-dependencies: - dependency-name: io.micrometer:micrometer-registry-otlp dependency-version: 1.17.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index c6ee3eaa010..2a00b28ee33 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -4,7 +4,7 @@ dependencies { api project(':testcontainers') testImplementation 'io.rest-assured:rest-assured:5.5.7' - testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.5' + testImplementation 'io.micrometer:micrometer-registry-otlp:1.17.0' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' testImplementation platform('io.opentelemetry:opentelemetry-bom:1.61.0') From f629137a9cc22fd6a9b6fd3c54f9b8491223d9eb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 22:59:46 +0000 Subject: [PATCH 1207/1224] Bump software.amazon.awssdk:dynamodb in /modules/scylladb Bumps software.amazon.awssdk:dynamodb from 2.42.34 to 2.46.20. --- updated-dependencies: - dependency-name: software.amazon.awssdk:dynamodb dependency-version: 2.46.20 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/scylladb/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/scylladb/build.gradle b/modules/scylladb/build.gradle index c3fe0927d6a..480d1958609 100644 --- a/modules/scylladb/build.gradle +++ b/modules/scylladb/build.gradle @@ -4,5 +4,5 @@ dependencies { api project(":testcontainers") testImplementation 'com.scylladb:java-driver-core:4.19.0.8' - testImplementation 'software.amazon.awssdk:dynamodb:2.42.34' + testImplementation 'software.amazon.awssdk:dynamodb:2.46.20' } From 2ab2c1619ecfea9c26e47144f5712dfee8f4e69d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 23:00:21 +0000 Subject: [PATCH 1208/1224] Bump com.unboundid:unboundid-ldapsdk in /modules/ldap Bumps [com.unboundid:unboundid-ldapsdk](https://github.com/pingidentity/ldapsdk) from 7.0.4 to 7.0.5. - [Release notes](https://github.com/pingidentity/ldapsdk/releases) - [Changelog](https://github.com/pingidentity/ldapsdk/blob/master/docs/release-notes.html) - [Commits](https://github.com/pingidentity/ldapsdk/compare/7.0.4...7.0.5) --- updated-dependencies: - dependency-name: com.unboundid:unboundid-ldapsdk dependency-version: 7.0.5 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- modules/ldap/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ldap/build.gradle b/modules/ldap/build.gradle index d357bb9996c..7e79be920c8 100644 --- a/modules/ldap/build.gradle +++ b/modules/ldap/build.gradle @@ -3,5 +3,5 @@ description = "Testcontainers :: LDAP" dependencies { api project(':testcontainers') - testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.4' + testImplementation 'com.unboundid:unboundid-ldapsdk:7.0.5' } From 8ef856798a44854628d6e54e41205ea96d87cf8e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 22:22:21 +0000 Subject: [PATCH 1209/1224] bump com.google.cloud.tools:jib-core from 0.28.1 to 0.28.2 in /core Bumps [com.google.cloud.tools:jib-core](https://github.com/GoogleContainerTools/jib) from 0.28.1 to 0.28.2. - [Release notes](https://github.com/GoogleContainerTools/jib/releases) - [Commits](https://github.com/GoogleContainerTools/jib/commits) --- updated-dependencies: - dependency-name: com.google.cloud.tools:jib-core dependency-version: 0.28.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- core/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/build.gradle b/core/build.gradle index 66f9fe7dcc0..d7e496f8d4a 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -70,7 +70,7 @@ dependencies { exclude(group: 'org.jetbrains', module: 'annotations') } - provided('com.google.cloud.tools:jib-core:0.28.1') { + provided('com.google.cloud.tools:jib-core:0.28.2') { exclude group: 'com.google.guava', module: 'guava' exclude group: 'com.fasterxml.jackson.datatype', module: 'jackson-datatype-jsr310' exclude group: 'com.fasterxml.jackson.core', module: 'jackson-core' @@ -101,7 +101,7 @@ dependencies { testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.14.3' testImplementation 'org.junit.jupiter:junit-jupiter:5.13.4' - testImplementation('com.google.cloud.tools:jib-core:0.28.1') { + testImplementation('com.google.cloud.tools:jib-core:0.28.2') { exclude group: 'com.google.guava', module: 'guava' } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' From e1956662651183c11245526ec5065355be08d6d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Jul 2026 22:22:26 +0000 Subject: [PATCH 1210/1224] bump org.zeroturnaround:zt-exec from 1.12 to 1.13.0 in /core Bumps [org.zeroturnaround:zt-exec](https://github.com/zeroturnaround/zt-exec) from 1.12 to 1.13.0. - [Release notes](https://github.com/zeroturnaround/zt-exec/releases) - [Changelog](https://github.com/zeroturnaround/zt-exec/blob/main/CHANGELOG.md) - [Commits](https://github.com/zeroturnaround/zt-exec/compare/zt-exec-1.12...v1.13.0) --- updated-dependencies: - dependency-name: org.zeroturnaround:zt-exec dependency-version: 1.13.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 66f9fe7dcc0..00d227869ff 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -96,7 +96,7 @@ dependencies { shaded 'org.glassfish.main.external:trilead-ssh2-repackaged:4.1.2' - shaded 'org.zeroturnaround:zt-exec:1.12' + shaded 'org.zeroturnaround:zt-exec:1.13.0' testRuntimeOnly 'org.junit.platform:junit-platform-launcher:1.14.3' From 2ac3c9773ca52381266463c3709c37155e190b68 Mon Sep 17 00:00:00 2001 From: "Alex \"Blex\" B" <45384811+AB-xdev@users.noreply.github.com> Date: Fri, 17 Jul 2026 08:49:53 +0200 Subject: [PATCH 1211/1224] Call `getLogs` only once and re-use existing variable (#11927) --- .../java/org/testcontainers/containers/GenericContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index fa5711807e7..4d3778c63d1 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -541,7 +541,7 @@ private void tryStart() { final String containerLogs = getLogs(); if (containerLogs.length() > 0) { - logger().error("Log output from the failed container:\n{}", getLogs()); + logger().error("Log output from the failed container:\n{}", containerLogs); } else { logger().error("There are no stdout/stderr logs available for the failed container"); } From 944454cd054e6ed004395e0b07f294ff8dbb9ca9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 Jul 2026 22:24:01 +0000 Subject: [PATCH 1212/1224] Bump release-drafter/release-drafter in /.github/workflows Bumps [release-drafter/release-drafter](https://github.com/release-drafter/release-drafter) from 6.1.0 to 7.6.0. - [Release notes](https://github.com/release-drafter/release-drafter/releases) - [Commits](https://github.com/release-drafter/release-drafter/compare/b1476f6e6eb133afa41ed8589daba6dc69b4d3f5...eada3c96a64734dd381cfbda23511034e328ddb0) --- updated-dependencies: - dependency-name: release-drafter/release-drafter dependency-version: 7.6.0 dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .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 d57159f44ca..727bcc94c01 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -18,6 +18,6 @@ jobs: if: github.repository == 'testcontainers/testcontainers-java' runs-on: ubuntu-latest steps: - - uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v5.19.0 + - uses: release-drafter/release-drafter@eada3c96a64734dd381cfbda23511034e328ddb0 # v5.19.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 3a621f5cc964668fe0bdfda3fff33d23b23c25c6 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Sat, 15 Aug 2026 21:31:12 +0300 Subject: [PATCH 1213/1224] Remove duplicated word in HttpWaitStrategyTest Javadoc (#11971) --- .../junit/wait/strategy/HttpWaitStrategyTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java b/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java index 89a12ec3aea..eb9169fd1ac 100644 --- a/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java +++ b/core/src/test/java/org/testcontainers/junit/wait/strategy/HttpWaitStrategyTest.java @@ -109,7 +109,7 @@ void testWaitUntilReadyWithManyStatusCodes() { /** * Expects that the WaitStrategy returns successfully after receiving an HTTP 401 response from the container. - * This 401 response is checked with with many status codes using {@link HttpWaitStrategy#forStatusCode(int)} + * This 401 response is checked with many status codes using {@link HttpWaitStrategy#forStatusCode(int)} * and a lambda using {@link HttpWaitStrategy#forStatusCodeMatching(Predicate)} */ @Test From ed2c487edeb94a042d86f0d54f86324a0f78eda3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Kalayc=C4=B1?= Date: Sun, 23 Aug 2026 15:26:45 +0300 Subject: [PATCH 1214/1224] Allow extra Azurite command line options (#11970) AzuriteContainer.configure() rebuilds the process command, so withCommand() cannot add flags. Expose withCommandOptions() like K6Container.withCmdOptions() so users can pass --skipApiVersionCheck and other Azurite flags. Fixes #11966 Signed-off-by: Burak KALAYCI --- docs/modules/azure.md | 6 ++ .../azure/AzuriteContainer.java | 23 +++++++ .../azure/AzuriteContainerCommandTest.java | 62 +++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerCommandTest.java diff --git a/docs/modules/azure.md b/docs/modules/azure.md index 1b3242551c1..461fcc9f679 100644 --- a/docs/modules/azure.md +++ b/docs/modules/azure.md @@ -27,6 +27,12 @@ Start Azurite Emulator during a test: !!! note SSL configuration is possible using the `withSsl(MountableFile, String)` and `withSsl(MountableFile, MountableFile)` methods. +Newer Azure Storage SDK versions can send API versions that Azurite does not support. Use `withCommandOptions(...)` to append extra Azurite flags such as `--skipApiVersionCheck`. `AzuriteContainer` rebuilds its process command in `configure()`, so `.withCommand(...)` cannot be used for extra flags. + + +[Pass extra Azurite command options](../../modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerCommandTest.java) inside_block:commandOptions + + If the tested application needs to use more than one set of credentials, the container can be configured to use custom credentials. Please see some examples below. diff --git a/modules/azure/src/main/java/org/testcontainers/azure/AzuriteContainer.java b/modules/azure/src/main/java/org/testcontainers/azure/AzuriteContainer.java index 56c58df1f1d..11e34237740 100644 --- a/modules/azure/src/main/java/org/testcontainers/azure/AzuriteContainer.java +++ b/modules/azure/src/main/java/org/testcontainers/azure/AzuriteContainer.java @@ -4,6 +4,10 @@ import org.testcontainers.utility.DockerImageName; import org.testcontainers.utility.MountableFile; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * Testcontainers implementation for Azurite Emulator. *

      @@ -52,6 +56,8 @@ public class AzuriteContainer extends GenericContainer { private String pwd = null; + private final List commandOptions = new ArrayList<>(); + /** * @param dockerImageName specified docker image name to run */ @@ -96,6 +102,20 @@ public AzuriteContainer withSsl(final MountableFile pemCert, final MountableFile return this; } + /** + * Append extra Azurite command line flags after the default host and SSL arguments. + *

      + * {@link #withCommand(String...)} cannot be used for this: {@link #configure()} always + * rebuilds the process command and overwrites any previously set command. + * + * @param options additional Azurite flags, for example {@code --skipApiVersionCheck} + * @return this + */ + public AzuriteContainer withCommandOptions(String... options) { + this.commandOptions.addAll(Arrays.asList(options)); + return this; + } + @Override protected void configure() { withCommand(getCommandLine()); @@ -160,6 +180,9 @@ String getCommandLine() { args.append(" --key ").append("/key.pem"); } } + for (String option : this.commandOptions) { + args.append(" ").append(option); + } final String cmd = args.toString(); logger().debug("Using command line: '{}'", cmd); return cmd; diff --git a/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerCommandTest.java b/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerCommandTest.java new file mode 100644 index 00000000000..c12e77ed69a --- /dev/null +++ b/modules/azure/src/test/java/org/testcontainers/azure/AzuriteContainerCommandTest.java @@ -0,0 +1,62 @@ +package org.testcontainers.azure; + +import org.junit.jupiter.api.Test; +import org.testcontainers.utility.MountableFile; + +import static org.assertj.core.api.Assertions.assertThat; + +class AzuriteContainerCommandTest { + + private static final String IMAGE = "mcr.microsoft.com/azure-storage/azurite:3.33.0"; + + @Test + void commandLineOmitsExtraOptionsByDefault() { + AzuriteContainer emulator = new AzuriteContainer(IMAGE); + + assertThat(emulator.getCommandLine()).doesNotContain("--skipApiVersionCheck"); + } + + @Test + void commandLineIncludesExtraOptions() { + // commandOptions { + AzuriteContainer emulator = new AzuriteContainer("mcr.microsoft.com/azure-storage/azurite:3.33.0") + .withCommandOptions("--skipApiVersionCheck"); + // } + + assertThat(emulator.getCommandLine()) + .startsWith("azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0") + .endsWith("--skipApiVersionCheck"); + } + + @Test + void commandLineAppendsMultipleOptions() { + AzuriteContainer emulator = new AzuriteContainer(IMAGE) + .withCommandOptions("--skipApiVersionCheck", "--disableProductStyleUrl"); + + assertThat(emulator.getCommandLine()).endsWith("--skipApiVersionCheck --disableProductStyleUrl"); + } + + @Test + void commandLineKeepsExtraOptionsTogetherWithSsl() { + AzuriteContainer emulator = new AzuriteContainer(IMAGE) + .withSsl(MountableFile.forClasspathResource("/keystore.pfx"), "changeit") + .withCommandOptions("--skipApiVersionCheck"); + + assertThat(emulator.getCommandLine()) + .contains("--cert /cert.pfx") + .endsWith("--pwd changeit --skipApiVersionCheck"); + } + + @Test + void configureAppliesCommandOptionsEvenIfWithCommandWasUsed() { + AzuriteContainer emulator = new AzuriteContainer(IMAGE) + .withCommand("azurite --ignored") + .withCommandOptions("--skipApiVersionCheck"); + + emulator.configure(); + + assertThat(String.join(" ", emulator.getCommandParts())) + .isEqualTo("azurite --blobHost 0.0.0.0 --queueHost 0.0.0.0 --tableHost 0.0.0.0 --skipApiVersionCheck"); + assertThat(emulator.getCommandLine()).contains("--blobHost 0.0.0.0").contains("--skipApiVersionCheck"); + } +} From c49980f5a6719b263e25eb7f4f75733a0975f2d6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:12:31 +0000 Subject: [PATCH 1215/1224] Bump actions/labeler from 6 to 7 in /.github/workflows Bumps [actions/labeler](https://github.com/actions/labeler) from 6 to 7. - [Release notes](https://github.com/actions/labeler/releases) - [Commits](https://github.com/actions/labeler/compare/v6...v7) --- updated-dependencies: - dependency-name: actions/labeler dependency-version: '7' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/labeler.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/labeler.yml b/.github/workflows/labeler.yml index 178ba299670..336f0c7e650 100644 --- a/.github/workflows/labeler.yml +++ b/.github/workflows/labeler.yml @@ -9,6 +9,6 @@ jobs: pull-requests: write runs-on: ubuntu-latest steps: - - uses: actions/labeler@v6 + - uses: actions/labeler@v7 with: repo-token: "${{ secrets.GITHUB_TOKEN }}" From 4cd29d7db5853b9bc3364288a92745062b2532c9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:12:36 +0000 Subject: [PATCH 1216/1224] Bump com.rabbitmq:amqp-client from 5.26.0 to 5.35.0 in /core Bumps [com.rabbitmq:amqp-client](https://github.com/rabbitmq/rabbitmq-java-client) from 5.26.0 to 5.35.0. - [Release notes](https://github.com/rabbitmq/rabbitmq-java-client/releases) - [Commits](https://github.com/rabbitmq/rabbitmq-java-client/compare/v5.26.0...v5.35.0) --- updated-dependencies: - dependency-name: com.rabbitmq:amqp-client dependency-version: 5.34.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 66f9fe7dcc0..201b579e278 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -106,7 +106,7 @@ dependencies { } testImplementation 'org.apache.httpcomponents:httpclient:4.5.14' testImplementation 'redis.clients:jedis:7.4.1' - testImplementation 'com.rabbitmq:amqp-client:5.26.0' + testImplementation 'com.rabbitmq:amqp-client:5.35.0' testImplementation 'org.mongodb:mongo-java-driver:3.12.14' testImplementation ('org.mockito:mockito-core:4.11.0') { From 0f6fa9fd3a92253de03b37deff9d858b7611cb32 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:12:39 +0000 Subject: [PATCH 1217/1224] Bump io.trino:trino-jdbc from 480 to 483 in /modules/trino Bumps io.trino:trino-jdbc from 480 to 483. --- updated-dependencies: - dependency-name: io.trino:trino-jdbc dependency-version: '482' dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- modules/trino/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/trino/build.gradle b/modules/trino/build.gradle index e6a9b32e85b..12d3d05f56b 100644 --- a/modules/trino/build.gradle +++ b/modules/trino/build.gradle @@ -4,6 +4,6 @@ dependencies { api project(':testcontainers-jdbc') testImplementation project(':testcontainers-jdbc-test') - testRuntimeOnly 'io.trino:trino-jdbc:480' + testRuntimeOnly 'io.trino:trino-jdbc:483' compileOnly 'org.jetbrains:annotations:26.1.0' } From 6c8350b9c34853b4dbaaa727258a29185702f4bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:12:41 +0000 Subject: [PATCH 1218/1224] Bump com.squareup.okhttp3:okhttp in /modules/couchbase Bumps [com.squareup.okhttp3:okhttp](https://github.com/lysine-dev/okhttp) from 5.3.2 to 5.5.0. - [Changelog](https://github.com/lysine-dev/okhttp/blob/main/CHANGELOG.md) - [Commits](https://github.com/lysine-dev/okhttp/compare/parent-5.3.2...parent-5.5.0) --- updated-dependencies: - dependency-name: com.squareup.okhttp3:okhttp dependency-version: 5.4.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- 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 707a559290a..068e334e2f1 100644 --- a/modules/couchbase/build.gradle +++ b/modules/couchbase/build.gradle @@ -3,7 +3,7 @@ description = "Testcontainers :: Couchbase" dependencies { api project(':testcontainers') // TODO use JDK's HTTP client and/or Apache HttpClient5 - shaded 'com.squareup.okhttp3:okhttp:5.3.2' + shaded 'com.squareup.okhttp3:okhttp:5.5.0' testImplementation 'com.couchbase.client:java-client:3.11.2' testImplementation 'org.awaitility:awaitility:4.3.0' From fd1ddc6f54bb36947756458c1e3d46a56fb47bc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 24 Aug 2026 20:12:45 +0000 Subject: [PATCH 1219/1224] Bump io.opentelemetry:opentelemetry-bom in /modules/grafana Bumps [io.opentelemetry:opentelemetry-bom](https://github.com/open-telemetry/opentelemetry-java) from 1.61.0 to 1.65.0. - [Release notes](https://github.com/open-telemetry/opentelemetry-java/releases) - [Changelog](https://github.com/open-telemetry/opentelemetry-java/blob/main/CHANGELOG.md) - [Commits](https://github.com/open-telemetry/opentelemetry-java/compare/v1.61.0...v1.65.0) --- updated-dependencies: - dependency-name: io.opentelemetry:opentelemetry-bom dependency-version: 1.63.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- modules/grafana/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index c6ee3eaa010..ea3cad72193 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -7,7 +7,7 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.16.5' testImplementation 'uk.org.webcompere:system-stubs-jupiter:2.1.8' - testImplementation platform('io.opentelemetry:opentelemetry-bom:1.61.0') + testImplementation platform('io.opentelemetry:opentelemetry-bom:1.65.0') testImplementation 'io.opentelemetry:opentelemetry-api' testImplementation 'io.opentelemetry:opentelemetry-sdk' testImplementation 'io.opentelemetry:opentelemetry-exporter-otlp' From 2f4475a2ca5282de343bfeb30abaf3b6c05058b8 Mon Sep 17 00:00:00 2001 From: Konstantinos Gkilas Date: Wed, 26 Aug 2026 12:58:51 +0300 Subject: [PATCH 1220/1224] Fix DockerImageName compatibility check when digest is present (#11629) Parse tagged digest references without folding the tag into the repository name. Preserve the tag for version checks and canonical names while exposing the digest separately and using it for image pulls. Validate stored tags and include them in equality. Reject malformed tags and keep differently tagged references distinct. Fixes #10527 Co-authored-by: Kevin Wittek --- .../images/RemoteDockerImage.java | 3 +- .../utility/DockerImageName.java | 37 +++++++++- .../testcontainers/utility/Versioning.java | 14 ++++ .../DockerImageNameCompatibilityTest.java | 29 ++++++++ .../utility/DockerImageNameTest.java | 71 +++++++++++++++++++ 5 files changed, 150 insertions(+), 4 deletions(-) diff --git a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java index 9d669e46b07..fdd7279f86b 100644 --- a/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java +++ b/core/src/main/java/org/testcontainers/images/RemoteDockerImage.java @@ -89,9 +89,10 @@ protected final String resolve() { final Instant startedAt = Instant.now(); final Instant lastRetryAllowed = Instant.now().plus(PULL_RETRY_TIME_LIMIT); final AtomicReference lastFailure = new AtomicReference<>(); + String pullTag = imageName.getDigest() != null ? imageName.getDigest() : imageName.getVersionPart(); final PullImageCmd pullImageCmd = dockerClient .pullImageCmd(imageName.getUnversionedPart()) - .withTag(imageName.getVersionPart()); + .withTag(pullTag); final AtomicReference dockerImageName = new AtomicReference<>(); // The following poll interval in ms: 50, 100, 200, 400, 800.... diff --git a/core/src/main/java/org/testcontainers/utility/DockerImageName.java b/core/src/main/java/org/testcontainers/utility/DockerImageName.java index e3a35855bf8..b3babc29c91 100644 --- a/core/src/main/java/org/testcontainers/utility/DockerImageName.java +++ b/core/src/main/java/org/testcontainers/utility/DockerImageName.java @@ -87,8 +87,15 @@ public DockerImageName(String fullImageName) { } if (remoteName.contains("@sha256:")) { - repository = remoteName.split("@sha256:")[0]; - versioning = new Sha256Versioning(remoteName.split("@sha256:")[1]); + String beforeDigest = remoteName.split("@sha256:")[0]; + if (beforeDigest.contains(":")) { + repository = beforeDigest.split(":")[0]; + String tag = beforeDigest.split(":", 2)[1]; + versioning = new Sha256Versioning(remoteName.split("@sha256:")[1], tag); + } else { + repository = beforeDigest; + versioning = new Sha256Versioning(remoteName.split("@sha256:")[1]); + } } else if (remoteName.contains(":")) { repository = remoteName.split(":")[0]; versioning = new TagVersioning(remoteName.split(":")[1]); @@ -155,16 +162,40 @@ public String getUnversionedPart() { } /** - * @return the versioned part of this name (tag or sha256) + * @return the versioned part of this name (tag or sha256). When both tag and digest are present, + * the tag is returned. */ public String getVersionPart() { + if (versioning instanceof Sha256Versioning) { + String tag = ((Sha256Versioning) versioning).getTag(); + if (tag != null) { + return tag; + } + } return versioning.toString(); } + /** + * @return the sha256 digest if present, or null + */ + @Nullable + public String getDigest() { + if (versioning instanceof Sha256Versioning) { + return versioning.toString(); + } + return null; + } + /** * @return canonical name for the image */ public String asCanonicalNameString() { + if (versioning instanceof Sha256Versioning) { + String tag = ((Sha256Versioning) versioning).getTag(); + if (tag != null) { + return getUnversionedPart() + ":" + tag + "@" + versioning; + } + } return getUnversionedPart() + versioning.getSeparator() + getVersionPart(); } diff --git a/core/src/main/java/org/testcontainers/utility/Versioning.java b/core/src/main/java/org/testcontainers/utility/Versioning.java index 372a105518f..707c2b91820 100644 --- a/core/src/main/java/org/testcontainers/utility/Versioning.java +++ b/core/src/main/java/org/testcontainers/utility/Versioning.java @@ -79,12 +79,26 @@ class Sha256Versioning implements Versioning { private final String hash; + private final String tag; + Sha256Versioning(String hash) { + this(hash, null); + } + + Sha256Versioning(String hash, String tag) { this.hash = hash; + this.tag = tag; + } + + String getTag() { + return tag; } @Override public boolean isValid() { + if (tag != null && !tag.matches(TagVersioning.TAG_REGEX)) { + return false; + } return hash.matches(HASH_REGEX); } diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java index dc7bf9ba1ab..ce0759fec47 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameCompatibilityTest.java @@ -85,6 +85,35 @@ void testImageWithClaimedCompatibilityForVersion() { .isFalse(); } + @Test + void testDigestOnlyImageIsCompatible() { + DockerImageName subject = DockerImageName.parse("postgres@sha256:1234abcd1234abcd1234abcd1234abcd"); + + assertThat(subject.isCompatibleWith(DockerImageName.parse("postgres"))) + .as("postgres@sha256:... ~= postgres") + .isTrue(); + } + + @Test + void testTagAndDigestImageIsCompatible() { + DockerImageName subject = DockerImageName.parse("postgres:16.8@sha256:1234abcd1234abcd1234abcd1234abcd"); + + assertThat(subject.isCompatibleWith(DockerImageName.parse("postgres"))) + .as("postgres:16.8@sha256:... ~= postgres") + .isTrue(); + } + + @Test + void testTagAndDigestImageWithRegistryIsCompatible() { + DockerImageName subject = DockerImageName.parse( + "registry.foo.com/repo:tag@sha256:1234abcd1234abcd1234abcd1234abcd" + ); + + assertThat(subject.isCompatibleWith(DockerImageName.parse("registry.foo.com/repo"))) + .as("registry.foo.com/repo:tag@sha256:... ~= registry.foo.com/repo") + .isTrue(); + } + @Test void testAssertMethodAcceptsCompatible() { DockerImageName subject = DockerImageName.parse("foo").asCompatibleSubstituteFor("bar"); diff --git a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java index 7d6f8cd2633..5b42322d678 100644 --- a/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java +++ b/core/src/test/java/org/testcontainers/utility/DockerImageNameTest.java @@ -1,6 +1,7 @@ package org.testcontainers.utility; import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -24,6 +25,8 @@ public static String[] getNames() { "registry.foo.com:1234/repo_here/my-name:1.0", "registry.foo.com:1234/repo-here/my-name@sha256:1234abcd1234abcd1234abcd1234abcd", "registry.foo.com:1234/my-name@sha256:1234abcd1234abcd1234abcd1234abcd", + "myname:latest@sha256:1234abcd1234abcd1234abcd1234abcd", + "registry.foo.com:1234/repo-here/my-name:1.0@sha256:1234abcd1234abcd1234abcd1234abcd", "1.2.3.4/my-name:1.0", "1.2.3.4:1234/my-name:1.0", "1.2.3.4/repo-here/my-name:1.0", @@ -147,4 +150,72 @@ void testParsing( } } } + + @Nested + class TagAndDigestParsing { + + @Test + void testTagAndDigestStripsTagFromRepository() { + DockerImageName imageName = DockerImageName.parse("myname:latest@sha256:1234abcd1234abcd1234abcd1234abcd"); + + assertThat(imageName.getRegistry()).isEqualTo(""); + assertThat(imageName.getUnversionedPart()).isEqualTo("myname"); + assertThat(imageName.getVersionPart()).isEqualTo("latest"); + assertThat(imageName.getDigest()).isEqualTo("sha256:1234abcd1234abcd1234abcd1234abcd"); + assertThat(imageName.asCanonicalNameString()) + .isEqualTo("myname:latest@sha256:1234abcd1234abcd1234abcd1234abcd"); + } + + @Test + void testTagAndDigestWithRepoPath() { + DockerImageName imageName = DockerImageName.parse( + "repo/myname:1.0@sha256:1234abcd1234abcd1234abcd1234abcd" + ); + + assertThat(imageName.getRegistry()).isEqualTo(""); + assertThat(imageName.getUnversionedPart()).isEqualTo("repo/myname"); + assertThat(imageName.getVersionPart()).isEqualTo("1.0"); + assertThat(imageName.getDigest()).isEqualTo("sha256:1234abcd1234abcd1234abcd1234abcd"); + assertThat(imageName.asCanonicalNameString()) + .isEqualTo("repo/myname:1.0@sha256:1234abcd1234abcd1234abcd1234abcd"); + } + + @Test + void testTagAndDigestWithRegistry() { + DockerImageName imageName = DockerImageName.parse( + "registry.foo.com:1234/repo-here/my-name:1.0@sha256:1234abcd1234abcd1234abcd1234abcd" + ); + + assertThat(imageName.getRegistry()).isEqualTo("registry.foo.com:1234"); + assertThat(imageName.getUnversionedPart()).isEqualTo("registry.foo.com:1234/repo-here/my-name"); + assertThat(imageName.getVersionPart()).isEqualTo("1.0"); + assertThat(imageName.getDigest()).isEqualTo("sha256:1234abcd1234abcd1234abcd1234abcd"); + assertThat(imageName.asCanonicalNameString()) + .isEqualTo("registry.foo.com:1234/repo-here/my-name:1.0@sha256:1234abcd1234abcd1234abcd1234abcd"); + } + + @Test + void testMalformedTagWithExtraColonIsRejected() { + assertThatThrownBy(() -> { + DockerImageName.parse("repo/image:tag:extra@sha256:1234abcd1234abcd1234abcd1234abcd").assertValid(); + }) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void testDifferentTagsSameDigestAreNotEqual() { + DockerImageName a = DockerImageName.parse("repo/image:1.0@sha256:1234abcd1234abcd1234abcd1234abcd"); + DockerImageName b = DockerImageName.parse("repo/image:latest@sha256:1234abcd1234abcd1234abcd1234abcd"); + + assertThat(a).isNotEqualTo(b); + } + + @Test + void testDigestOnlyHasNoTag() { + DockerImageName imageName = DockerImageName.parse("myname@sha256:1234abcd1234abcd1234abcd1234abcd"); + + assertThat(imageName.getVersionPart()).isEqualTo("sha256:1234abcd1234abcd1234abcd1234abcd"); + assertThat(imageName.getDigest()).isEqualTo("sha256:1234abcd1234abcd1234abcd1234abcd"); + } + } } From d984b8baba0a86dc1cca504d4f4a2e35043dac96 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Wed, 26 Aug 2026 16:42:29 +0200 Subject: [PATCH 1221/1224] Add CodeRabbit badge (#11985) Add badge to README --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 26f45f451e1..2482154c7be 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ ![Maven Central Version](https://img.shields.io/maven-central/v/org.testcontainers/testcontainers) +[![CodeRabbit Pull Request Reviews](https://img.shields.io/coderabbit/prs/github/testcontainers/testcontainers-java?utm_source=oss&utm_medium=github&utm_campaign=testcontainers%2Ftestcontainers-java&labelColor=171717&color=FF570A&label=CodeRabbit+Reviews)](https://coderabbit.ai) + [![Netlify Status](https://api.netlify.com/api/v1/badges/189f28a2-7faa-42ff-b03c-738142079cc9/deploy-status)](https://app.netlify.com/sites/testcontainers/deploys) [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://github.com/codespaces/new?hide_repo_select=true&ref=main&repo=33816473&machine=standardLinux32gb&devcontainer_path=.devcontainer%2Fdevcontainer.json&location=EastUs) From ca657f110f4761f56654586f9a1f8679fbd363c5 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Wed, 26 Aug 2026 16:44:52 +0200 Subject: [PATCH 1222/1224] Fix Gradle matrix failure propagation (#11984) Enable pipefail for the filtered matrix-generation pipelines so a failing Gradle invocation cannot be masked by jq. Valid empty matrices remain supported. --- .github/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3b19e81823..62dd2acc4ef 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -96,6 +96,7 @@ jobs: # we should not push empty results to the cache READ_ONLY_REMOTE_GRADLE_CACHE: true run: | + set -o pipefail TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'del(.[] | select(. == ":testcontainers:check" or startswith(":docs:")))' --compact-output) echo $TASKS echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT @@ -164,6 +165,7 @@ jobs: # we should not push empty results to the cache READ_ONLY_REMOTE_GRADLE_CACHE: true run: | + set -o pipefail TASKS=$(./gradlew --no-daemon --parallel -q testMatrix | jq 'map(select(startswith(":docs:")))' --compact-output) echo $TASKS echo "matrix={\"gradle_args\":$TASKS}" >> $GITHUB_OUTPUT From b2c0d1b85d852a4f13f8314b3e7ccacabbcadad6 Mon Sep 17 00:00:00 2001 From: Kevin Wittek Date: Thu, 27 Aug 2026 15:38:39 +0200 Subject: [PATCH 1223/1224] Fix Release Drafter version comment --- .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 727bcc94c01..863b8d979a9 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -18,6 +18,6 @@ jobs: if: github.repository == 'testcontainers/testcontainers-java' runs-on: ubuntu-latest steps: - - uses: release-drafter/release-drafter@eada3c96a64734dd381cfbda23511034e328ddb0 # v5.19.0 + - uses: release-drafter/release-drafter@eada3c96a64734dd381cfbda23511034e328ddb0 # v7.6.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 675771e41174fe01f54df69812671773f5e9c57a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Przyby=C5=82?= <23506256+pioorg@users.noreply.github.com> Date: Thu, 27 Aug 2026 16:57:04 +0200 Subject: [PATCH 1224/1224] Fix KibanaContainer reusability for external mode (#11986) Fixed KibanaContainer reusability for external mode. --- .../elasticsearch/KibanaContainer.java | 62 ++++++++++++++++++- .../elasticsearch/KibanaContainerTest.java | 54 ++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) diff --git a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java index a7214f0618d..ee8ce714854 100644 --- a/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java +++ b/modules/elasticsearch/src/main/java/org/testcontainers/elasticsearch/KibanaContainer.java @@ -20,8 +20,10 @@ import org.testcontainers.utility.ComparableVersion; import org.testcontainers.utility.DockerImageName; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.Map; +import java.util.UUID; import java.util.concurrent.TimeUnit; /** @@ -53,6 +55,8 @@ public class KibanaContainer extends GenericContainer { private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); + private String encryptionKey; + private ElasticsearchContainer elasticsearch; private String elasticsearchUrl; @@ -105,12 +109,58 @@ public KibanaContainer(final DockerImageName dockerImageName) { super(dockerImageName); ensureCompatibleVersion(dockerImageName.getVersionPart()); dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + this.encryptionKey = stableConfigKey(dockerImageName); withExposedPorts(KIBANA_DEFAULT_PORT); //we have to explicitly set wait the strategy later on in configure, once we know the security configuration setWaitStrategy(null); } + /** + * Sets the encryption key used for Kibana's encrypted saved objects. + * The key must be at least 32 characters. When not set, a deterministic default derived from + * the image name is used, which is required for {@link #withReuse(boolean)} to work correctly. + * + * @param encryptionKey the encryption key + * @return this container instance + */ + public KibanaContainer withEncryptionKey(String encryptionKey) { + if (encryptionKey == null || encryptionKey.length() < 32) { + throw new IllegalArgumentException("Kibana encryption key must be at least 32 characters long"); + } + this.encryptionKey = encryptionKey; + return this; + } + + /** + * Enables or disables container reuse across JVM runs. + * + *

      Supported in external mode only. When Kibana is configured via + * {@link #withElasticsearchUrl(String)}, the container configuration is fully deterministic + * and TC can reliably locate the running container on subsequent runs. + * + *

      Reuse is not supported in managed mode (i.e. when this container was created with + * an {@link ElasticsearchContainer}). Managed mode introduces several non-deterministic inputs + * into the container hash on every run (ad-hoc network ID, random network alias, fresh service + * account token), so TC always sees a different hash and starts a fresh container instead of + * reusing the existing one. This is a framework-level characteristic that affects any container + * connected via {@code withNetwork()} — not specific to {@code KibanaContainer}. + * + * @param reusable whether to enable container reuse + * @return this container instance + * @throws IllegalStateException if {@code reusable} is {@code true} and managed mode is active + */ + @Override + public KibanaContainer withReuse(boolean reusable) { + if (reusable && elasticsearch != null) { + throw new IllegalStateException( + "withReuse(true) is not supported for KibanaContainer in managed mode. " + + "Use external mode (withElasticsearchUrl) to enable reuse." + ); + } + return super.withReuse(reusable); + } + /** * Configures the Elasticsearch URL for external mode. * @@ -212,7 +262,7 @@ public KibanaContainer withElasticsearchCaCertificate(byte[] caCertificate) { protected void configure() { super.configure(); - addEnv("XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY", generateRandomKey(32)); + addEnv("XPACK_ENCRYPTEDSAVEDOBJECTS_ENCRYPTIONKEY", encryptionKey); addEnv("SERVER_NAME", "kibana"); if (elasticsearchCaCertificate != null) { @@ -541,8 +591,14 @@ private String createKibanaServiceAccountToken(String protocol) { ); } - private String generateRandomKey(int length) { - return Base58.randomString(length); + private static String stableConfigKey(DockerImageName imageName) { + // UUID v3 (name-based) gives a deterministic 32-character string from the image name, + // keeping xpack.encryptedSavedObjects.encryptionKey identical across JVM runs — + // a prerequisite for container reuse. Call withEncryptionKey() for real secret management. + return UUID + .nameUUIDFromBytes(imageName.asCanonicalNameString().getBytes(StandardCharsets.UTF_8)) + .toString() + .replace("-", ""); } /** diff --git a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java index a6b9466690a..0099b5613ca 100644 --- a/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java +++ b/modules/elasticsearch/src/test/java/org/testcontainers/elasticsearch/KibanaContainerTest.java @@ -16,11 +16,15 @@ import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.assertj.core.api.Assertions; +import org.assertj.core.api.Assumptions; import org.junit.jupiter.api.Test; +import org.testcontainers.Testcontainers; import org.testcontainers.containers.Container; import org.testcontainers.containers.ContainerLaunchException; +import org.testcontainers.containers.GenericContainer; import org.testcontainers.containers.Network; import org.testcontainers.images.builder.Transferable; +import org.testcontainers.utility.TestcontainersConfiguration; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -440,6 +444,56 @@ private static String getKibanaStatus(KibanaContainer kibana) throws IOException } } + @Test + void withReuseShouldReuseTheSameContainer() { + Assumptions + .assumeThat(TestcontainersConfiguration.getInstance().environmentSupportsReuse()) + .as("testcontainers.reuse.enable must be true") + .isTrue(); + + final String kibanaImage = "docker.elastic.co/kibana/kibana:9.2.4"; + + // Testcontainers.exposeHostPorts + host.testcontainers.internal lets Kibana reach ES + // from inside the container on any platform (Linux Docker Engine included). + // No withNetwork() on Kibana keeps the hash fully deterministic: + // - no dynamic network ID + // - the random tc-* alias added by GenericContainer's constructor is only serialised + // into the CreateContainerCmd when withNetwork() has been called, so it is absent here + // The host.testcontainers.internal extra-host IP is the same for kibana1 and kibana2 + // because they start in the same JVM (same PortForwardingContainer instance). + // The first Kibana container must stay running while the second one starts, because + // withReuse(true) only skips JVM-shutdown cleanup — an explicit stop() still removes the + // container, so there would be nothing to find. + try ( + ElasticsearchContainer es = new ElasticsearchContainer(ES_IMAGE) + .withEnv("xpack.security.enabled", "false") + .withEnv("xpack.security.http.ssl.enabled", "false") + ) { + es.start(); + int esMappedPort = es.getMappedPort(9200); + Testcontainers.exposeHostPorts(esMappedPort); + String esUrl = "http://" + GenericContainer.INTERNAL_HOST_HOSTNAME + ":" + esMappedPort; + + KibanaContainer kibana1 = new KibanaContainer(kibanaImage).withElasticsearchUrl(esUrl).withReuse(true); + KibanaContainer kibana2 = new KibanaContainer(kibanaImage).withElasticsearchUrl(esUrl).withReuse(true); + + try { + kibana1.start(); + // kibana2 is started while kibana1 is still running; the reuse mechanism should + // find kibana1's container by hash and return the same container ID. + kibana2.start(); + + Assertions + .assertThat(kibana2.getContainerId()) + .as("KibanaContainer with withReuse(true) should reuse the same container on subsequent starts") + .isEqualTo(kibana1.getContainerId()); + } finally { + kibana1.stop(); + kibana2.stop(); + } + } + } + private static void applyTls(ElasticsearchContainer c, byte[] caCrt, byte[] nodeCrt, byte[] nodeKey) { final String certDir = "/usr/share/elasticsearch/config/certs";

    * Exposed ports: 8000 */ +@Slf4j public class ChromaDBContainer extends GenericContainer { private static final DockerImageName DEFAULT_DOCKER_IMAGE = DockerImageName.parse("chromadb/chroma"); @@ -22,13 +25,32 @@ public ChromaDBContainer(String dockerImageName) { } public ChromaDBContainer(DockerImageName dockerImageName) { + this(dockerImageName, isVersion2(dockerImageName.getVersionPart())); + } + + public ChromaDBContainer(DockerImageName dockerImageName, boolean isVersion2) { super(dockerImageName); + String apiPath = isVersion2 ? "/api/v2/heartbeat" : "/api/v1/heartbeat"; dockerImageName.assertCompatibleWith(DEFAULT_DOCKER_IMAGE, GHCR_DOCKER_IMAGE); withExposedPorts(8000); - waitingFor(Wait.forHttp("/api/v1/heartbeat")); + waitingFor(Wait.forHttp(apiPath)); } public String getEndpoint() { return "http://" + getHost() + ":" + getFirstMappedPort(); } + + private static boolean isVersion2(String version) { + if (version.equals("latest")) { + return true; + } + + ComparableVersion comparableVersion = new ComparableVersion(version); + if (comparableVersion.isGreaterThanOrEqualTo("1.0.0")) { + return true; + } + + log.warn("Version {} is less than 1.0.0 or not a semantic version.", version); + return false; + } } diff --git a/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java b/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java index 6cc01ac4d59..0ec6b00601c 100644 --- a/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java +++ b/modules/chromadb/src/test/java/org/testcontainers/chromadb/ChromaDBContainerTest.java @@ -27,4 +27,22 @@ public void test() { given().baseUri(chroma.getEndpoint()).when().get("/api/v1/databases/test").then().statusCode(200); } } + + @Test + public void testVersion2() { + try (ChromaDBContainer chroma = new ChromaDBContainer("chromadb/chroma:1.0.0")) { + chroma.start(); + + given() + .baseUri(chroma.getEndpoint()) + .when() + .body("{\"name\": \"test\"}") + .contentType(ContentType.JSON) + .post("/api/v2/tenants") + .then() + .statusCode(200); + + given().baseUri(chroma.getEndpoint()).when().get("/api/v2/tenants/test").then().statusCode(200); + } + } } From c970a05c71f58558e80334b41ce0c1bfa910682e Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Mon, 7 Apr 2025 12:54:53 -0400 Subject: [PATCH 0444/1224] Remove incubator note from Solr docs (#10173) --- docs/modules/solr.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/modules/solr.md b/docs/modules/solr.md index 44be46c1a1a..f4030c300d6 100644 --- a/docs/modules/solr.md +++ b/docs/modules/solr.md @@ -1,9 +1,5 @@ # 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/). From c5bcaab0a32a3d863efe3e1ff3e80f8c273c4673 Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Mon, 7 Apr 2025 12:58:59 -0400 Subject: [PATCH 0445/1224] Fix Apache Solr link (#10171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- docs/modules/solr.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/modules/solr.md b/docs/modules/solr.md index f4030c300d6..a332c7cbcbe 100644 --- a/docs/modules/solr.md +++ b/docs/modules/solr.md @@ -1,6 +1,6 @@ # Solr Container -This module helps running [solr](https://lucene.apache.org/solr/) using Testcontainers. +This module helps running [solr](https://solr.apache.org/) using Testcontainers. Note that it's based on the [official Docker image](https://hub.docker.com/_/solr/). From e8bb83fc753f7bfdde283780afb268918561a47f Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Mon, 7 Apr 2025 18:37:02 -0400 Subject: [PATCH 0446/1224] [solr] Replace "create_core" with "create" command (#10172) --- .../main/java/org/testcontainers/containers/SolrContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java index 6463fa60743..2c3e1b5c634 100644 --- a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java +++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java @@ -143,7 +143,7 @@ protected void waitUntilContainerStarted() { @SneakyThrows protected void containerIsStarted(InspectContainerResponse containerInfo) { if (!configuration.isZookeeper()) { - ExecResult result = execInContainer("solr", "create_core", "-c", configuration.getCollectionName()); + ExecResult result = execInContainer("solr", "create", "-c", configuration.getCollectionName()); if (result.getExitCode() != 0) { throw new IllegalStateException( "Unable to create solr core:\nStdout: " + result.getStdout() + "\nStderr:" + result.getStderr() From 80ae5d7b1b7abca38657d037a3bba91c0f3e9250 Mon Sep 17 00:00:00 2001 From: Eric Pugh Date: Mon, 7 Apr 2025 19:42:05 -0400 Subject: [PATCH 0447/1224] Pass start command required in Solr 10 (#10174) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez Gonzales --- .../main/java/org/testcontainers/containers/SolrContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java index 2c3e1b5c634..b5d8d6abf8d 100644 --- a/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java +++ b/modules/solr/src/main/java/org/testcontainers/containers/SolrContainer.java @@ -111,7 +111,7 @@ protected void configure() { throw new IllegalStateException("Solr needs to have a configuration if you want to use a schema"); } // Generate Command Builder - String command = "solr -f"; + String command = "solr start -f"; // Add Default Ports this.addExposedPort(SOLR_PORT); From e730674537dfa297a60311a7c13b953b8b82a67d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Fri, 11 Apr 2025 17:11:50 -0600 Subject: [PATCH 0448/1224] Allow spock tests to be skipped when Docker is unavailable (#10180) Fixes #10178 --- .../spock/DockerAvailableDetector.groovy | 15 +++++++ .../spock/Testcontainers.groovy | 7 ++++ .../spock/TestcontainersExtension.groovy | 15 +++++++ .../spock/TestcontainersExtensionTest.groovy | 39 +++++++++++++++++++ 4 files changed, 76 insertions(+) create mode 100644 modules/spock/src/main/groovy/org/testcontainers/spock/DockerAvailableDetector.groovy create mode 100644 modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersExtensionTest.groovy diff --git a/modules/spock/src/main/groovy/org/testcontainers/spock/DockerAvailableDetector.groovy b/modules/spock/src/main/groovy/org/testcontainers/spock/DockerAvailableDetector.groovy new file mode 100644 index 00000000000..b64299ffa87 --- /dev/null +++ b/modules/spock/src/main/groovy/org/testcontainers/spock/DockerAvailableDetector.groovy @@ -0,0 +1,15 @@ +package org.testcontainers.spock + +import org.testcontainers.DockerClientFactory + +class DockerAvailableDetector { + + boolean isDockerAvailable() { + try { + DockerClientFactory.instance().client(); + return true; + } catch (Throwable ex) { + return false; + } + } +} diff --git a/modules/spock/src/main/groovy/org/testcontainers/spock/Testcontainers.groovy b/modules/spock/src/main/groovy/org/testcontainers/spock/Testcontainers.groovy index 632b129ec7a..98c2223904b 100644 --- a/modules/spock/src/main/groovy/org/testcontainers/spock/Testcontainers.groovy +++ b/modules/spock/src/main/groovy/org/testcontainers/spock/Testcontainers.groovy @@ -54,4 +54,11 @@ import java.lang.annotation.Target @Target([ElementType.TYPE, ElementType.METHOD]) @ExtensionAnnotation(TestcontainersExtension) @interface Testcontainers { + + /** + * Whether tests should be disabled (rather than failing) when Docker is not available. Defaults to + * {@code false}. + * @return if the tests should be disabled when Docker is not available + */ + boolean disabledWithoutDocker() default false; } diff --git a/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersExtension.groovy b/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersExtension.groovy index 40392210f3a..2654408e901 100644 --- a/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersExtension.groovy +++ b/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersExtension.groovy @@ -7,8 +7,23 @@ import org.spockframework.runtime.model.SpecInfo class TestcontainersExtension extends AbstractAnnotationDrivenExtension { + private final DockerAvailableDetector dockerDetector + + TestcontainersExtension() { + this(new DockerAvailableDetector()) + } + + TestcontainersExtension(DockerAvailableDetector dockerDetector) { + this.dockerDetector = dockerDetector + } + @Override void visitSpecAnnotation(Testcontainers annotation, SpecInfo spec) { + if (annotation.disabledWithoutDocker()) { + if (!dockerDetector.isDockerAvailable()) { + spec.skip("disabledWithoutDocker is true and Docker is not available") + } + } def listener = new ErrorListener() def interceptor = new TestcontainersMethodInterceptor(spec, listener) spec.addSetupSpecInterceptor(interceptor) diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersExtensionTest.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersExtensionTest.groovy new file mode 100644 index 00000000000..d8cbdf2e497 --- /dev/null +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/TestcontainersExtensionTest.groovy @@ -0,0 +1,39 @@ +package org.testcontainers.spock + +import org.spockframework.runtime.model.SpecInfo +import spock.lang.Specification +import spock.lang.Unroll + +class TestcontainersExtensionTest extends Specification { + + @Unroll + def "should handle disabledWithoutDocker=#disabledWithoutDocker and dockerAvailable=#dockerAvailable correctly"() { + given: + def dockerDetector = Mock(DockerAvailableDetector) + dockerDetector.isDockerAvailable() >> dockerAvailable + def extension = new TestcontainersExtension(dockerDetector) + def specInfo = Mock(SpecInfo) + def annotation = disabledWithoutDocker ? + TestDisabledWithoutDocker.getAnnotation(Testcontainers) : + TestEnabledWithoutDocker.getAnnotation(Testcontainers) + + when: + extension.visitSpecAnnotation(annotation, specInfo) + + then: + skipCalls * specInfo.skip("disabledWithoutDocker is true and Docker is not available") + + where: + disabledWithoutDocker | dockerAvailable | skipCalls + true | true | 0 + true | false | 1 + false | true | 0 + false | false | 0 + } + + @Testcontainers(disabledWithoutDocker = true) + static class TestDisabledWithoutDocker {} + + @Testcontainers + static class TestEnabledWithoutDocker {} +} From 910e7f5d9e8476f8b0d39ac2b7faded3648e9746 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 21 Apr 2025 17:50:30 -0400 Subject: [PATCH 0449/1224] Fix typo in LGTM container method (#10189) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Eddú Meléndez --- modules/grafana/build.gradle | 6 ++++++ .../java/org/testcontainers/grafana/LgtmStackContainer.java | 2 +- .../org/testcontainers/grafana/LgtmStackContainerTest.java | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/grafana/build.gradle b/modules/grafana/build.gradle index 72082e4cfec..34a45cc404b 100644 --- a/modules/grafana/build.gradle +++ b/modules/grafana/build.gradle @@ -8,3 +8,9 @@ dependencies { testImplementation 'io.micrometer:micrometer-registry-otlp:1.13.4' testImplementation 'uk.org.webcompere:system-stubs-junit4:2.1.6' } + +tasks.japicmp { + methodExcludes = [ + "org.testcontainers.grafana.LgtmStackContainer#getPromehteusHttpUrl()" + ] +} diff --git a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java index 080be6d6eaf..595d016772a 100644 --- a/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java +++ b/modules/grafana/src/main/java/org/testcontainers/grafana/LgtmStackContainer.java @@ -58,7 +58,7 @@ public String getOtlpHttpUrl() { return "http://" + getHost() + ":" + getMappedPort(OTLP_HTTP_PORT); } - public String getPromehteusHttpUrl() { + public String getPrometheusHttpUrl() { return "http://" + getHost() + ":" + getMappedPort(PROMETHEUS_PORT); } diff --git a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java index cb5dbaa630b..f5efe628f3c 100644 --- a/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java +++ b/modules/grafana/src/test/java/org/testcontainers/grafana/LgtmStackContainerTest.java @@ -46,7 +46,7 @@ public void shouldPublishMetric() throws Exception { Response response = RestAssured .given() .queryParam("query", "test_counter_total{job=\"testcontainers\"}") - .get(String.format("%s/api/v1/query", lgtm.getPromehteusHttpUrl())) + .get(String.format("%s/api/v1/query", lgtm.getPrometheusHttpUrl())) .prettyPeek() .thenReturn(); assertThat(response.getStatusCode()).isEqualTo(200); From d6ff41c7dc7cd8573337830a1a2f1642c62be377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 21 Apr 2025 17:02:27 -0500 Subject: [PATCH 0450/1224] Fix ImageNameSubstitutionTest --- .../java/generic/support/TestSpecificImageNameSubstitutor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/junit4/generic/src/test/java/generic/support/TestSpecificImageNameSubstitutor.java b/docs/examples/junit4/generic/src/test/java/generic/support/TestSpecificImageNameSubstitutor.java index 6955d49454b..0850c7c7a50 100644 --- a/docs/examples/junit4/generic/src/test/java/generic/support/TestSpecificImageNameSubstitutor.java +++ b/docs/examples/junit4/generic/src/test/java/generic/support/TestSpecificImageNameSubstitutor.java @@ -13,7 +13,7 @@ public class TestSpecificImageNameSubstitutor extends ImageNameSubstitutor { @Override public DockerImageName apply(final DockerImageName original) { if (original.equals(DockerImageName.parse("registry.mycompany.com/mirror/mysql:8.0.36"))) { - return DockerImageName.parse("mysql"); + return DockerImageName.parse("mysql:8.0.36"); } else { return original; } From 57b340201007d327b878dda5c2302a274612301f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Apr 2025 21:57:13 -0600 Subject: [PATCH 0451/1224] Update Gradle Wrapper from undefined to 8.13 (#10033) * Update Gradle Wrapper from 8.9 to 8.13 Signed-off-by: gradle-update-robot * Update Gradle Wrapper from 8.9 to 8.13 Signed-off-by: gradle-update-robot * Update Gradle Wrapper from 8.9 to 8.13 Signed-off-by: gradle-update-robot --------- Signed-off-by: gradle-update-robot Co-authored-by: gradle-update-robot --- examples/gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 ++-- examples/gradlew | 5 ++--- gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43705 bytes gradle/wrapper/gradle-wrapper.properties | 4 ++-- gradlew | 5 ++--- smoke-test/gradle/wrapper/gradle-wrapper.jar | Bin 43504 -> 43705 bytes .../gradle/wrapper/gradle-wrapper.properties | 4 ++-- smoke-test/gradlew | 5 ++--- 9 files changed, 12 insertions(+), 15 deletions(-) diff --git a/examples/gradle/wrapper/gradle-wrapper.jar b/examples/gradle/wrapper/gradle-wrapper.jar index 2c3521197d7c4586c843d1d3e9090525f1898cde..9bbc975c742b298b441bfb90dbc124400a3751b9 100644 GIT binary patch delta 34884 zcmXuJV_+R@)3u$(Y~1X)v28cDZQE*`9qyPrXx!Mg8{4+s*nWFo&-eX5|IMtKbslT3 z<{(=aAZzeZfy=9lI!r-0aXh8xKdlGq)X)o#ON+mC6t7t0WtgR!HN%?__cvdWdtQC< zrFQ;?l@%CxY55`8y(t7?1P_O7(6pv~(~l!kHB;z2evtUsGHzEDL+y4*no%g#AsI~i zJ%SFMv{j__Yaxnn2NtDK+!1XZX`CB}DGMIT{#8(iAk*`?VagyHx&|p8npkmz=-n!f z3D+^yIjP`D&Lfz500rpq#dJE`vM|-N7=`uN0z86BpiMcCOCS^;6CUG4o1I)W{q6Gv z1vZB6+|7An``GNoG7D!xJGJd_Qv(M-kdVdsIJ?CrXFEH^@Ts83}QX}1%P6KQFNz^-=) z<|qo#qmR!Nonr$p*Uu1Jo2c~KLTrvc*Yw%L+`IL}y|kd+t{NCrXaP=7C00CO?=pgp z!fyr#XFfFXO6z2TP5P1W{H_`$PKzUiGtJd!U52%yAJf}~tgXF`1#}@y`cZl9y{J-A zyUA&-X)+^N?W=2Fm_ce2w$C6>YWp7MgXa{7=kwwy9guBx26=MnPpuSt zB4}vo3{qxa+*{^oHxe7;JMNMp>F`iNv>0!MsFtnb+5eEZ$WI z0M9}rA&cgQ^Q8t_ojofiHaKuhvIB{B9I}3`Dsy3vW8ibigX}Kc912|UZ1uhH?RuHU=i&ePe2w%65)nBkHr7Bx5WwMZj%1B53sUEj0bxI( zEbS%WOUw)3-B0`-m0!{mk7Q%={B#7C^Si>C04@P|qm7$Oxn3ki)G_oNQBTh6CN6d_kt@UKx1Ezdo5)J0Gdf@TcW|{ zdz1V?a>zldA7_5*Pjn6kDj|sbUqt-7X z5+oajeC}*6oi~vxZ#Ac&85cYcC$5OKUnYPv$Y~>H@)mnTtALo*>>5&=0QMr5{5?S; zCDF=RI@94n(!~sa`4Y{JLxgcvRqMM&T!}rRd~Kl#_X4Z&85;})o4W*g>?TaAVXSWB zeY#!8qz^hmC6FERsjTnC)1Xu1UPd7_LfuNvuVqF8(}Jfar=T-K9iChEuZi-FH(P%u zzLrjpq|?}8?g1Vnw^&{eqw~QY0f*9c71&*<5#9f5JlhJmG~IuV*8~nEBLr`KrvNW! zlLH&oZ58K?u>1{vAU0CtT>Il<I{Q8#A!lO7#73V&iN13;oV?Hl?N5xDK63)Rp3%5reb&3n5OQ|9H zDpYEI%JQXcrs^o*SCFY~iYf-VM<`7Tl@+kQS3tfR-fyH_JDaz5SYEMU-bTCLQ=JVG ze?ZPcj95Tci|bVvSZk3^enqQ?pIcZn24V=YT{cf-L|P&{-%%^ql$)^Vu~)Ida=h$bZAMQEi$MM|&b zY8;D;aEba_`W^=VdKfttW)h_zjRA&0A^T*tF*%+}TZQCOvFqKUu=xf1Bx@T?&~S(J zopXniA?s%}Q4p9~F(Ty{8wt$l4oHeT(#U6sAu4>Q+~a;}I>0>??v*wfke}0TwPaeE zj3gWtfNlD{jRgy7;S9PS?su5pnobi%Zoe0LVpw%`<)V=yT~Ht_UUXIna4YUa;p=-T4df6^;bz%;@|$F zK;s9#K@9hqZCST!66N0uPB+FT*kq22%ow2HirV3rE%hcX^!(Lz;3?kCZ@Ak*MThjTOKU&t+uJdN*6t$;DDmh zFStdHO>r)8L@qO}K@H~7Z);#f6WU{@Icn7Tc^|IZ`;K^ek9eCWdync`kWCt2s%D-k zE$wyPCui$@gJJ9Q`CtixbMF(GiCCbm`ut(~ce-G|Ji|PZ3~DHlG`Asn;skVhnu0r_ zgGbdmfl|er`87x@uYmd8A+!-3V95GE4&_^9N@hp4SC4 zeFU+Z3Ou&G! zlvZy|iHIIX3X2-Yb7YJ#{SYE9lCoixO+}(|u+H@Z6Rz-l1eZ7{I;vk+Y7kP7ev>hG zv|(I<4?N{EXMSvRgUhbQhDoP1&A;SEUGGep8*!@4u)fNbl3%cts<&=m5<5pi7M-HQ zPS#svbXWu2n&m*K6jL#@xm3VSMJxnxve5J6w1qGv`2>5<6F!uzGVHP1A(_xI7CWlX zm6*wpT@dmQ&pAlm`r~T;)>m5HK^H^cM`pCSoh{;-CE43rMkg<;HnZaCHfMq1LoN0S z%%7|$y~&k6wpiY@rsdCY9ZDh%9W6Pf=2^p=;iv-Ah^ACxwK3VmI}SMNneTa9n%biL z#GoojRHxa}R2zOo!G@<8M-B6vNp?)@_>#mYku#pe{O~t?~}1 zE8`)=BstIRk5W*xZw@2=89@ds?eQ~mxzkrA`y<$oR8bmaUw=rE%lFmzHY&aY8?<-N zp1|bb$(XrOMmiYy{pH#)D1GOmv5aj_?waU~*h~s{VZ&H_PhoXYz`C8Pss{ymY_hPG zt{NY&nPMH#FRvwR+T0(Xo2#T6;=oFmRgA9b-HVY72d|~YF+6v$F%sY0 zS#^LF7sTj>Itvyi!~){Hit*~3imOG*Xh51qLz+!W~`vUBVeZZ5&k34SD%Ha%5#aclSzMfoGWjiq9#rl}j zOf*8NY>VN(`W!DxaBgjBzj3oUAVlLY{R}tiZZ0o>K$vwr?+eggZ!q74m2t?lkvm9z zAmL2=W$jQJL>SSrbIOibe734A(K^B8`M@uao!`E$p+9D!rBea8Oxb|p5r3o4##G8K zMr0I9y&`21{@m=Bi+4tTJ-xy(DB_mG$kYv+qw&VBM(A9^wP9;Yo*6{#5tMpfa;m2FC+%l@ zk_cKXg-d&YUIj3(x{)aNwYGYjSHiOQK2K#yWt$vQomhbnF;Qhkxl`+;i{&+t{PrY` zp5r28&|UvmUK|&Jlv>oX4>XE87Zns?fiE6c;VP7BixT*6n}Zsbv$wd{gXyrE&Sd zhRlv!-{%~xv6yNvx@3^@JEa$={&giRpqZG>`{93 zEjM}YI1i6JSx$DJa&NWcl0M;igxX;est*nz=W16zMfJ0#+s{>Eo>bxmCi)m*43hU1 z;FL43I}nWszjSS%*F1UYt^)4?D6&pDEt1(atK(DKY1pAkNMG`a>_ec;KiT z^xMBBZ9i=;!_hNGlYp^uR0FW^lcBrs_c3ZvhcctW4*T^-DD^OU{{hK8yHahyGyCK& zL0>f0XW|wvi4f`bNTfO+P*Ao^L@8~ezagtl%l z{(2uo71sT3rKTQ-L#Y5Rsy#x)Eo+HQranZmk;r_Hf7WWkRq&QmP{?}do0X=;3U_UYspffJl7v*Y&GnW;M7$C-5ZlL*MU|q*6`Lvx$g^ z6>MRgOZ>~=OyR3>WL0pgh2_ znG)RNd_;ufNwgQ9L6U@`!5=xjzpK_UfYftHOJ)|hrycrpgn-sCKdQ{BY&OEV3`roT|=4I#PT@q`6Lx=Lem2M&k4ghOSjXPH5<%cDd>`!rE} z5;hyRQ|6o>*}@SFEzb7b%5iY}9vOMRGpIQqt%%m)iSpQ@iSAU+A{CmB^&-04fQlV9 z14~oE=?j{b{xE*X^1H)eezKTE27;-=UfNvQZ0kZ+m76{6xqAyTrEB&Oe`Mx{4N;}5 zXp%ojp}JYx6PE}Z`IBO3qWsZEfVPa4EEz0vnsFNkQ!kG8tcec&)k$+s&XmPErROoNxeTh9fATBk)w1g|9*~&S!%r0u6+FTn}dK-qa7cfK~tkJlV zMi{BX!>lQsZhSQUWAf(M6+McPrv>)j<*T&hC!*?qq{@ABJWX z@!~2Y1rhy*Z|x`DZUBuyayz}Kv5Pzrh}1wiHT{9|fh`Wl%ao=lRSwEFl*wy6BZ%vo zrt9Ocbicd1q$a{F6`4#ZQ6vJa@`}IGz+xUr*=6TF^GR?`u{1to&gqJpwf$LN0?G&! zsLNiG+}M+c{*j-Q4I zO!=lj&~{29Os}hgEv`iJ1tU)dx}=ob>DHSHKX|FVu2Y#pO|SsigHRgg4?!FX2>b3W z`m}xI<#_02adGka0TuAIg89kS?>*lKyI)T)Pa)|12XfH;k9}#=dzH6TiciCNO->e9m>!W)l&4B zd74@>_LL9OuJ&v5e0)l7ME@xW)9K@*LUd1RY}Vs_${3YC%+LfSR^H+I=(7Szh2nKB z_8bMoty|M+k9A|hGURVePvMf0XY9NYOiC@h^MLs-X@(8PV4zI7A155!RnZrBE9R1> zuI4E`=JTxyJ#d`!(9_s?T2jxEM*E`){wGI`DBFIz%ouW`Y0cKDfXAGN{};aMpLRvZ zu`PZ-3(+Tsh?UKAr)TQQ;2Jz(kv8{R#!c9Tyeev55@5@Ng*c4-ZQ6vC?o#5>6{;?gVfAIr-+^g>3b$}13U^~?gce6s6k-4ulnzWlFpq}*)2 zd0!wP{2>3U+zYiPaNr+-6O`J;M2Cb`H5hjDXw(1oKK!?dN#Y~ygl{H2|9$( zVg7`gf9*O%Db^Bm6_d808Q!r%K;IUSa(r^hW`w)~)m<)kJ(>{IbCs-LkKJ5Qk~Ujv z|5`OBU>lb7(1IAMvx%~sj+&>%6+_-Pj&OOMzMrkXW}gMmCPOw5zddR}{r9blK&1(w z^6?`m=qMI=B*p~LklFLvlX{LflRXecS#lV$LVwi$+9F8zyE29LgL> zW6R-6z&3x-zL({$nMnbhu|plRO8S_EavN?EKrr+c&Tt;Mk)NC0e|cvyXk%VKb5VIc z;|DN^5)t^}tr&-2q)SbwrF>=k$moYK;yA{Q1!I940KmPvg_Ogb81w$_)i3FgFWG+MS?k=BpkVGk-bRhBF;xJ}wnGN{)?gbry^3=P1@$k^#z9*@tmmB+TZ|L@3#3Z+x z8hJE({GEeEWj#+MnUSN^~c!=G+yW^j=cfN_0!}%(J-f1`G}w^}xi!T8BJDOCri{mGBU? zsKXxeN*=L#<-p_aj6cHtYWMJ+;F`HLeW5cpmeVAhFfy+Y=0rIqqyJ-NRIu-aE*Mvr zVnC-RDR`d1nnQu|^S79I>%9=bPNx1JLOJnB**Y`2WCq zctq<)Cq2^Z%=$*&;QxX30;642;y+=mlMLec6{KA208FQ~_S&tiFQW zp2{C3nyrmgkh+HRmG+$_y19m~0z~b`Mo+m6)Qq82p5)Z6ePn&B=!*twk7Rz%zzm-R z>Qj!PE3XMBY)N-xO(=VpO6=Cky5kpl}fQztM7QzvG#a}5$>2$f5w|}b8=3E)cNQw<%e1xAEwaRHu zhHCGB4Uzs6x3A=7uUBC0({&iNH{!7JgQHVa+ zKfQItwD}sd;587x?M_hzpR|TKtTH^4{`G7*87o_wJrFlmrEjk=jvA z6xBPKYjFB9{0Sj0rBL-z9BuBY_3c||UjVgv2kqw2m<@4#>zfx&8Uhq8u+)q68y+P~ zLT;>P#tv|UD62Nvl`H+UVUXPoFG3>Wt-!sX*=4{XxV|GSC+alg10pP~VaA>^}sRr1I4~ zffa2?H+84k=_w8oc8CQ4Ak-bhjCJIsbX{NQ1Xsi*Ad{!x=^8D6kYup?i~Kr;o`d=$ z*xal=(NL$A?w8d;U8P=`Q;4mh?g@>aqpU}kg5rnx7TExzfX4E=ozb0kFcyc?>p6P# z5=t~3MDR*d{BLI~7ZZG&APgBa4B&r^(9lJO!tI|27=ng?Py&aN;erj&h`@1lu;5r` zbfCU2rX-gC5HweRgOr*b{VC@H1|$g#7W$i2v=&YLcVT-m*{}@~?d89N8z?fB22Xcw zQ+tI54})t>I=}Br&)prpXL6=Lm3=JwG@q|d4E|1LdL51PT=Lvr5P!bi;Qc_gL7pNK zNIwRm)Z9J&(94MN802VI;gGw)Z2~5jEw_DdCzI>Z7mhN&C~ByiKHSh5h(R59 znZwSywxLnqSx6%B8^61Ew-qQxIJ>JpqK#9e1qbe~hxqUgiuWvRf>#tGS*)i%4l zJUu^EJTW2pV1^z+Wl{;MGDs`aBzSE#Y1d~ZN9MRa^meG>S%H6Z z_K^Ou^75p~sd0n})tc0uAO5~B+&LMO=7XT3AvQ2r6q5(ET!LEV1xouVCcUm0=Q@QM z%OS<5;FRhsgRwpa8ncwkWvkIemjAiXY@kE$$qLo$aO0ZXe!yaoOw?k%`dFoVo8mV$ zy7b8WSHMyWy?2D1J}zPeh5$MS&WWiWelH{KY#W$os)GU z9jhV;AR5J}*N5(H!SEC`)R}%p>_HdwIDbd z#xE(o3v7qF0|n}9pDx%Ig)Q7)T`0?bD)$~rCu zk2z7YG=iHqe119a zc3S*NEeNXTo91W~I+34oU2~8M)@B8yPE@krO0xWwh$z*jv^o-u| z^q->)=1hy-e#t9~(mtij`tjUcrs$u%Zfh&QugS2-?VG@89thaEDA~avqrz-Ix^zrr z9{u2T2w{oHASaEeEWclmGL{SIm#SR~F)xS54!Lu~_rODV9^mxLHHR@w{0&f(yjYp9 zV~Ci@MXp{Q89{Df269V%=B+JZkE;OgbcZ8e4WP{%E<_PvMW;!j`g+7(A2P{)h0!=; zs}$M97`^kY&ow`ew$b6MdnI4aCTPEG#Iuf;?b{^d?#RjPNN`0&i3oLmH&L+-cxRyr zFtbisl`#Z)yn6*m6pY;cwEj7s12tpjj60*rtwo?cn7gmY4Sa*z$L#evTi#pVGes4{ zPjRAudV-m^@`Z`Oky`9goDQ5+zcR#9g7Qn{Gsr>J<6eCs?2`FOaE=S#)xV?Vgg`9R z*Qmw3S|9RZDfJm%z@Duua!7;MjZkys_~9FB$MQs%v@7-f8@*UqA|1eB@YqrJZ>#>_ zJ^Y6V6Xyz37>OJv(^HC~)bA2}{(}U4ssz%r;SEn7nWM@^rIQrgTshs(?YBNTEODF0 zqc6I6Lf7@E@#d(IpZ{&uT(arc+J95c6#hStY=DLd{?3aIPUoNkuFc|kL#*jQr#DC? z;gy7qj4SY-n^8{6wHdXVJwtQ_bU-w>XxRUuPo`ti>k3Hi3cugt`C(EwuQ&d2lyfO` ze!0fi{eHhU1yN+o%J22|{prPvPOs1S?1eUuGUkR zmzMlCXZtW)ABWasAn53}?BqtPMJ*g>L1i6{$HmoEb@h(kILnMp(2!H!rG?MNH`1V0 zotb`;u#Yz0BZrT1ffVTCV!?{L^z8q11_21ptR0ITbOcaZ!mlWhC_AZb>?2IDV|b_y z9lVt3)0d@W=lNp1ArE;h_;DDQX^_;WtsSIO<;Ly&(#O~Xw$R0~W|xdQk*Y(b2=vLV zt8HX8=;#;$=y}!;Qku2HJbGEzF`2_~&i$&ogHUe5vhx}FLR}K_Mp)J{n*Va2<|pk$ z4tI(7v3A%Z7Z0|ZWw#7%$U#*=XTaPjlh^N(t63xFt_%*WoJ^oq!U0j+Bx`<>q!J&0sWy4&{@#*BOr-s ztZ68f;l0UT3wf@RRC}_ufMr6rQ69Woa@1sZ50Ww|{yfp8!7rMOh_POTE;|zamq+4OObJ-VeTK|D|h?mfR$^lA{E7pk8DRDz*j&r<&fR>GaG*d zYaJ*q5#n251XIpR6F1o-w>LZ)Cb6Ma^6tCfcOItn1o;$#H?^jqOd(PA)B3HaTlJK zw!~?nh-v-_WBi5*B=IuTZOX2sa{1I!#%VMd5eGe1VcL6 zQ!aDft}>TjlwzEJ9Kr6MWh1MoNNWr$5_?z9BJ=>^_M59+CGj=}Ln)NrZ;Fja%!0oU zAg07?Nw&^fIc9udtYSulVBb-USUpElN!VfpJc>kPV`>B3S$7`SO$B21eH8mymldT} zxRNhSd-uFb&1$^B)%$-O(C$#Ug&+KvM;E9xA=CE*?PIa5wDF_ibV2lMo(Zygl8QK5 zPgH1R(6)1XT9GZ6^ol$p>4UH@5-KV66NF$AH-qOb>-b~+*7)DYsUe&Is0yTx=pn8N zs&2Z4fZ1Wk=dz>AXIfd%>ad=rb-Womi{nVVTfd26+mCx`6ukuQ?gjAROtw&Tuo&w$|&=rEzNzwpuy0 zsqq)r5`=Mst4=HCtEV^^8%+Dv2x+_}4v7qEXSjKf%dOhGh~(FDkBW<~+z&*#4T>r@ z>i7SKwW?LDit0b0Q2`eIho4@kQNjE|U%{^VWI%USUDr7YtPf7k1e5W?yaF7DNF6Cs zlTv9JX6csnX%PV|=IOwjx|F55A2=Q!S@FihpC!N_ud6#f%*^&%ula!3e&(G-8;RKq zkICmrkB7|n%lk1P1pV(3=JnM!b>MD;*OgQOq2&rf+hiuDnY2)3YiwOZiW#AB3s&v6 z3^2ZSNS)z0Vmkqkd{q15Mk|7+n0OImvs#=-(#P6bP>Wl+`WT{iU+TbkQ{iqaSP|4aH3OAfinI2%1hWxH{qd@;gy&zJ=|IluB z@s5xreENf!S2g_G{qNS)ZJ|kl!8)b_Kgwc=`)_a{vIbF1FW5& zCw0Vr(EXsP^CmKX0)6wp_}TG8>V&<}fRjZQ+k8~^#7Zvnt>#$1P~7DAU=1JE3uydB zU3fdgXnR1D)yCMEZRFZhovm-%dA3>9 zXiJS2h-RaW;itowzZwn=j6QG`;%ZE?80^~DyA5{UI&Zd^FF0f!#@ak@U>39YPP;>^ za*p|=y{$&A)P|%C5t@}Gw6KgQ>SA;6VE@MnmN=NpzWlrA$o%g*ia|)}AM08Bf##=+ zAt$0DmFpYe69{h_T1E{S5~AcoTed25*Rd&=Npa@hU@Q6kAFCCbW}||JizRp}DKm{K zgL`1k_qv?OSn+ys{e&>W!H4Xws_sUq?iDMeSy65wE^}@nEaT6xCPT_vqaKs&Zy^(% z#ROxXka3W3+?yZvz1Ok>vzz*~@yuPmos5#Ltl^hzpjNo|0pIs#0kCgk5>SjIMXMM* z_No#``}|WTzAd-@mVg*5q7S_wG%MhgZ1FLeliVr3on0Y|05`IcVOZOGmqoR9WFe_? zHx6es$zbXXWLh}V^CoBXIC5+VvRDr^;ax+`U5?0QxaOwq6k zKmG04{Dw6b6YTS%V?#S$_-F9&XjSaUS$?>Gx@QqL%J9z@10;5J^`AA7i>w;cm|Cyh z(ABc_r=wpMq4B7EX_2S*PZoS&lo|T288ihZgIw!@Q3n}1(;{#imM zWcSRIbDvSLxPHYqwh_Y$Kb(*MM%V-}D>&@m2!r}RCQC1@095?nxg=TWKpidoz$NNp zYS2cN5jhG+myw(tGaeqhU#5a%GgN(j#>z?;;F;tDF?_E>ZtsWetw#`l0jC=XfR6c5AWezg%(`Hl_%N~q!n)2}KZrld z1tfA0N0Flfn_%@0=HctOJkVpQGju z)3MgIa!e_3%)?K^X52R+TU2#W+L4OvYf!GnXV^z4DzRqSuRe9q7|Tkm&r&~(ep&U0 z{3A6-k(~=b^e!}g@}s$|WQVh_L0%vE(cvCR z*l%5Spfk}eC%5jrtGO=7+LJnUEKs`{m#D2Q0!NQ`}z<3<#?KY-1G9+`Vi#WyxpgT7aPA9I)sEPt! zHlS?W%!srhu@F`j@!O)};UXehQPO>(xh7!fZwwu@ehq4!?3M7Puw#6TS3;NL4;uEc zg>_qh3wk;?TEqR&;@X3^%HlSQ9HG)OKpy+lNQ*H!@ygaEm6qmm_DqnAY}K$~v_*w! zkbGz`woRGu$w`TxcNC?tsPS!rGo_%07SPtipmDlCh7zN}?1zpkA@)V%)aPPO*5?XK z^w?Uay8#`6LFhRBL>7PYl((d#H`@)0-6!UmOrnt{2@MS*2le0PPs`O_`@dYZVNjv> z#WzLArlP$xda2zVl3)(=<g#7FFzL2Qk4-pX}#)Q27}U z6Dhv`wAX&bcjVgze7nD`hDf>M>GMD(s?fYlvv;sZ*y2o;FE^dc(3n1JCyHDD!*ma+ ztE2}+RJ>A}wnz=5D5tBaWWESJbP4mx{l)dFP&)KVp?P4XNgK5|>(x7YdUl(&d`pe? z)5|&`rPo8x5dP%lt2mqps9*g0w09-cX5<^x?FT#{coW&gI>PoJRJ93o8;#v>q8eRG ze0&v2sfJza!f|@tSD)Fb#pyHvQb0*YGTQ7!RxhWc$L%^5$^u={ zI7NB8+jN!zUF#w@%+cMrb0|da90XKlMBU}T@4a&!zK5Z@Xa1>(Z0`z;GpJJhulg2wd%~ z%L*zTSO-C|h-Ks_z3?e01OqHtZY{&iX_?N!E`Iigyt6)5p%;jKJ+S&QOnU~p!x^;1 z-%c_mMhlp8$tfL05HhXAZxY{sl!AiqI_1gu5tiHIG(@o{oVw+Xg)&vy7QA~*dG4oujd;fvgvLWIb8Ov_vuMII(XxEv$79@GVR zAK8S)s_s8lEL`nTvWlfsxEz@xNI5j<7(QQ?Fxn&U`#Dd_>HDy0y)!LbGT(SkJ;1&% z#9-@!kN*rs9J`B_=uqW9zDDb0!Ke(7;R4fFF_iCG9 zRuo?f?41}CO-8&6_Y@tQqHIBs<2D%Qvc9w1Fn~KEnppq1>Qh-iCFB48@q+S0$O3os z{G4H6%j#@>8RMr6{!BDVr6yaZ-DE?HCGSu2vjXUW!Ww7~7z(!a7yz!ZUF$QjqCCdV zX$-qlhmmmPMz88&oC8on%`On0a6fr|+7NmjGe7xuo3cT9XJ*Ai-n;F&E1SQC57KSVmWrdH8Z}}+H$CgAp6uHY4U7iq$3r* z$r5kf)eJ%%**?QJW5{l2VAKW3fh>PfbrwOdu0l11#VESBjxKnareT+TB!O!)D7SVu zh^uo~r)QO%tAbitru3T@{06-mkSp?#iIo6DQ%hDXgHM-gi7-wZ zwpGi(v_W>(XoiN&^vI_2@BD0qNssU>lkj6p-K=we6-9F6yC(+k5&xM?$8v1V;qQ6K z!c#o3X%X+8weteF5+!j6lIOxKuFVb~%DEhS5#5i~;jzR+NO3irc384Ttx z<(cSjpWE3=UO|FZcL^gUv@%IytAE+i=fOB?p|C(JdX?~s(s2OOyH z;CC(S^k2pKhUh6G6H;lcxy}%u4r0MSbMIsff5ST=lm9REc*Q?CI{cSX%%eN}Du_Cc$-U1VG>VQ>Tc;0X@$BBwY6MP_zUmcITyQXUJ&040VH#kmGQ@gc$= z*WhGC@R%Pv2WMD>+34tDB5Qs#8MdxiAB0PG>mA+Ma9s|Sa?R`lH;6>1jLL(M`0ViK zQqrxC)l?czAY*j%+gR4iDO!AD)ml4Vkf&w0K=MpotEv&QOOu&@g=pIr~b;eo^(8BT(?FunH$AF3j*ZiHB%C({8I)tTa3VRkn) z=9uW|9))}J#GUqRh<&w4yL15QpK%2bM)-YYq2tcqZmh#_)@tYAn7$!Z+6(FhAPs2p z^%a8A6xo5O-hgk)a=r7#iC9Sn=%vgrQsl}WCq)N+4q*=_VT+ac3I+*3lJQ&#epf@`!?G!7S(!aZGWqpGk8(*`ig}*V&iyhzH;xtxA$y_N z>tFo2YU_{OyO&-VeL&NZz`GG|UMNC?ekTaV#~9b%=yg!Ajug>jPa8u5Ln*m_z1#k& z!sFx7Y?AJVFhC9tQDO&L=Bpa*irKIJzUbr2g7m=&Ui;b_(mq1zZ<=m_4mt>B4ZDbX z+$CbV`11;I*ywC5F0ZsLUbjqC@zQj3Y_@wf%qE1;F6PtHVAo!dBPs+@NLuNR1+LPH8mI^6AA9-ln(yD1W@_tp1%vmN@3VWoRR)}c*_Q^C-% zj$ea)YC2{IKN)~Bx8xKL(#3rqF1(xvI}0!c=V??7hFv{ym{=pQl8`hn$bxi}?vXpY ztw&{<%0B6t1NH@6d_+=D1fnz9-%yFhT)rh<_TbQvmT~5x&NbGw{s3L@O#OT`=f4<8 zy}}-S@7g5nkw7qXXDm!{mK_f}2z_fS9tfklc2D@&GKvQdfNH0;Skdv68nvu4OlTH8 zBb#~Iin))Ptwv?hs}Hz;i!WfA>h*fuWNcM@+wbuxg;Bme%Vpg!O3orGrK=XK=2I%T zeY|eK+3G_DI1Ia6DKo$zjwMN|+gb(os>^H7F|5cHtGLzAQAjp8d&>+j-Fc|&yi;=_ zty1o9s0aazM8%TD*yXE<8Sy3;xupv~OpE*B@A~c z3YwmXFCuRZ*;0bUWUYVVvs7lu6UF%WZh`XpD<9)SOfi51<3sLIGI>SGd~`wGqW;|w z{7AD?ounMxmY`O_gRB1i6Ul6ToZyw~O`m*F$SU@mLt+0nM=b9Q_d+n#`Z4w+|KcqF zVJ=ukl^iHbb`EZ#4o+5WiO$V;K;%I7FlO_E##P88!8pn6sfWL3I=s5X?os5wxWh^9W5c+6f);gal&rcpAAxt>KI zt#>36b%#`+E4{ zxAQ;Z8j(J}eo|4g>`+a~OOVPleyYL7JqhW*pAoj>mo1urPwsr0A#ssSaZ zr=HX8%}@bGR9)^_T`Z7c(ABBdBrkcVcsU;B%GmSVtX1DE!|8L%^}-QnnaNcv?2ms| zA1}JvM6SF4!wEZud%_k75D>H&|K*Y&UN~TU4IUs0KsvY|y6}%E zN>L%XAjjOs+WGAJ=wAmEmK)JGoI&Uq$`1%&(sh$n^lmT{o9pDd>t(CQ;o9Sr;gFtdZ>-qZg7jbc*P~uh_&U$wOO;{P3h!F3|a}dH-WoGGsXGBvB2c7p<>_ zCnJAYP}_#gD0t)$$Is_In%83bCJkJDij^-Lbnh)JKexs8f3E|dDy=BUEES;}7{*+o zxV&iNODhNv#y<$}=-mY})V@*#j#N6^A*3qP8zE{!-_YomKdfYc%7HC5S^WslJbIYa zyh$BuB#+=sczSh4UhP(?WG6x{#9ux1I7BF9H89bivmbZkG!DCq!^iv{HX2isn%ei7d!X4M&l&Ix#C z`sIC(K6h|K_5T2hKy|;&o#A%*E-z=$Kj6W8U@Xh09 zJ)>xHkZoQg!{E*R zBSy?JCKOX7n%2$6-dzz8T10-8&ZG00yi<2%x`4@L8oj$ZXP|WgZ7E%-(h>@kqIJqt z!{ou4J@Anf#HcEwPSv)TmeUHAmeK2Am3|mkp+~W z?)6eVg;c7e2H48xBw;iPnvFX(a}Y+nn8^W#;6K4qA&N3hg$HYE=n|Dy)1^$6Gxud` z0!yZ0d*p;(03ud^y^hvb&{_%?^-|c8>2fAn_!5YCX`?Ov6`*x_BAqZdP7`m!E4|c0 zttvHBo2}NJT1HQse_rYk1e$5HO|)A}>0a7uufbmK{SDV?ndJ&?hXXVWWefy|nb5Ne zb%C#pK9tl%P-U{v%DOV=mf@tF5qHo|q4_JBR-PLXOPn6TUrQ#9e83Sw*iIvU^kn1C|EKWK_mS%Ah;Pks|+@@ zOxM8{T4o@Zf(mvI55b=nM5d)6kW5m_Lx%`#@%0J~At8s1=`iJf)}P0 zCE6_pa-@`H5WIHbP7t4>QJLNX9vAkd8^)UWbAP6$@LZXWxAVbOYkgCYh!Pi4lzTy z1%B>Pf9ZYnAH}3-*{;*nGg_ZWZvV-oB*dF(WQ0^x71UW+hk8Cp_g2sc=tD&+CHpen zk8FnaqFX;|TH%e*9ifj@(1+=xs1s>xxwM`XyvIu)rw0VwCz$GAQ(yL@$J9)4{viA{ zr49G#c+Z$S3LaiI8H1fq(Zeb|M4x7oLLr4te=>z$^SG9N2w2ERGL4D=I9HuNqS6>W z3ax}f`>ts|P^Zvm@RHI@6xXbm9v9ry(J7RMY_2a`aPR71XW4B1S$a}He-4?~NS8>v z_Z&;WYl>KnqBJ7-hpw*<(4p-DB;Erm4B z)LPDS{#kCnL(dCtzl#E4aVwa$czprcYdPwIDCcme_C!|1U))PSuuI$zk*W(Ap#uWp z$Ho58;-{sE*^$YJfcvRRKNF?1B4(sbe>9@m?fS5nel8lSJLrFy&YLbuYc7$Di~9RZ z6dwe@uT*+bv?gxRf2UDHLuJLEg$yM9E&WcA_+R7?)37(a^as(%yhwk9vCtzREf&@5 zr9ab0gl1l{v<@{6C3O?M!(VOl{tcWYFhcWyW`&qG3pOe@HR0(&Pf@bG-DEH=)i05VspTrF}nH!FPJEICoc z3S)q%V+;_aFop)lP;Po#SxD2ff0q4{T+T}wqs1MJ(W0uHR%OPB;l?2?$s`KN)Cwvp zIWi|N=M^e1V@wxwhcbE=o-@%8PA~qV;Cea8wH_!IqWp_Sb&NfdNz}9rhH)r2Br^t)MeQA%TY4kA4{q7j(jMtJ*xS>w>)_TMT^(L-L2JjGxOJj&ZV-)g zgVi{5yFFtT>@y74Jf{=@f2D8cEh09yg6#A&72XCLgRGuD?B$3Jh}mU9;ruBh4ewxD z7AzgZW*I&BN(>mhiz!$}F_R7^NNhzIC6VZOw|xa*NB`8Izi`@_wbT62%UAIpm3#SW zG=pW%ix>j~;()!P=|~#*s~lrgJ~te{KY{96l8>ex)n>uuGMb%`c#snwpktC*Tn4EfgILng z;xZ@8J7YPjGNU7ziy8fhkvX(Gk4luczopwj%<+s`80do~2D`Ae3vs%C2n@KP&f1Tw*W`gvc{0^aDj8k(= zqot>B`xmPR?nWM z%F_Tp@8f$^zMC-xxq5eR4y{vI3_c*+I&2E>TUd_fzE&@Pkna^rKrwaahT_Qipb*^G zDr(jJ{9!?Jf23IL(A^If6~w*;?}1Z(f$4(T18(_hnK5l-&KgXmo>nd-3e?K(mCc5>6~3tQ)BGjd zE37LV)Q^&pwQ#S)&+u1NlKHDJYC|%1Na3%+nyEu^jPYK6&d&RoKPnRF@-yfpj11b3 zZ`tb@e>%>eq_``WHjyW%v=QIIjMQf2l5wjwh-GwmTwut$YYW7S)B^oRCLq)v5C#Y+ zjB#TgxNhmo8p)ig+m?O7x>V%vtNgs^JCwARHbhpo8tiRe{t^FJ)aIYKNc@@Cy2(NO z%_oXe2h_a_mDEVtmb7j{8H0tCIim0{RsMyjf5xg%)u5J6>nIZ!1*crg#_ZLsWwQbZ zRQGHCjX?b^(~`4-%8a=}HZ#K!NGa0IY^23L=>CEKsPgamPfQ#BAATw`rjrHMokCmE z$m&;$>$>FdWOl&m)`l3}takOU{5O^V!Y`N18@mT#Hk8i4BUNORx;`YLf13b*mCvaB ze-8<>i!%lf^-2;U9Xu^Lie6DxK3T%#A{V~ncqJJ#j^vgU*fE*tQzR9Izl^818it9a zpbd#{E7lZ_VRf}Ec~xnS$S$5Fa)vkpeqLJ|acM0jlw*p5vTxcoxin9j54VyQ6lcuB zR|hLNBB)YOqvR9U!GXe8h=^BOD85uIf0M*0GA*2n7=9$tiDqrej<}AS5rg&?cv&o6 zpi1XUOT5%!|GH4fvaj?*$t>7b&`TGoQk8_MWDe?v2r}Dt(=V&+RUEinS|JRG@uWH{ zKKj7Hj+!Oxo*$h3JSiyE3UmxBOJT8wLQ9;~a_QJ0+H$+Y7xq%5dSM}87BbO_f7fWu z3%N;ZkQ#*^Fy;8l+=R>08U>@C^*y3XHwO(!x~UB1eKROeJu9R4i#yRqn*t8KOlnf8 zLRwpLV^InvOY4y&6Y0aoAta#nWk$@|ua--OGHHW!xhjPv3`wq-h()h-g$Rf$X%kb& zWa>o&%jl;Juf;h@ zYL`0DJV={S3<~|QxVKlNt>PnLnaimuw=2>%bOF+Krp5q#4}8Z1N3?_qAS?S%)arm{ zWw3y0Sj8X=>X^3NqTq|)7_lk>iEJQee_T8ouuaPZ`ZGo<5HsR>A7m?9YOlD%ISXt11#1V2EoPx>=owC%+R@3XD;+F; z=(T8c8;0RJTsm&wf4E6n@v_B&nSvZcHW#06QG>Wc4M@NZjXq_R6tyGE%uPgmQ2BjdC;x_^K7e<&Sro+Qon7}Z6i zj>=e%vr_NLQ=+o&BpJok>#>>@t9yzoIjkHJE78hf09L;KB)w^jj*Zi;(XexzZjXje z(A)F$&QZE+l#Y+n`=Vi2$nPAb_di1SF@@cJ_apQ%rsI6t?-IX1$@BzBhvht-IL`O` z<;uJelNOBA7;pvZfB49mXR!WQo}M^PexS)v&gcE|!8|>kr>}-xBWE7K{@1Mi2C+ZC zIZxkg5`fhJ{k9ES?Q&jg{rY^Kz9*250O|V{Qa~U%CqezPdlGEt!}O!OX%T>bVgb8H zsA8Oc79FMkJ{1BQAj1lz_A7b%#c`?Pf$=T5(=0B&}8~ zQNxNwRw*HCGxKs7Abuqb0wZTm!A@E!voDKNVzcs90B98$d1mpu$?pVH>>OjYdz|h7 z=c8OvnalIse-rG>^TJ7MQ)h{-eY_~oi=$1-J+wg3^YM~AU$kfB%yWKA6u<1KR)jRN z^V))`t?f_yozajua%E*q=!xg(Q{=;$gM(CgBtI%caf_ z(Rsq{@aD+#S}=pC86ka~*GGN4VU#aFW&hkLem=}?e|vn~F~*%Z>oir1(1J)V;P~B; zpF%#~KE~a%?9Q`RT%aOCGZYoCbw1uX$~|Kog$!cB?q~! zdDf0Qo*L&^G+IB-%c7$kALW4)e5h-jQveUupWrMkF~&y@j`9uT{Dx>3B5#~;1W8xj zD8D&0f6BK2KH7bPZxi%s6BzdKTl4((Xp?-8aO}B$ceSl^VLKn+QQT7@lRQFm{BB3J zY*{801(`8^XP)m0D?Wbj7{5On_W1Gh19`qL&mS4*kHL?eO-i0WS*?JlPt9MR=TBSi zCFAu3oJ*WezdvZZSy&eKQ%>+G2tl=09#H+Rf3Rl+Zi1CZ#ESIpy09nYSNtA9DI^G; z;Ll9Z5|JT@L8pS6=LDaMhSef9kKYv$QmRE_E9?E9x+#R7EG1O<>7Jl@f=`e0)6s|@ zlKP$XQ0bTR{H&FQqg^6St}cX+CEqrS#MdXVu^sKs^EdCN)gfU|nuEu;t&|cN=jWpW zf4BaikH05EkAG0a`{60><}kwSr&av3l#hRYOk3;XuMV} zFV=&DU*-9CmLvT++WizQMWlnqEBL#Bo<24v@d&Bg{c`sRFGPy!hJDXGw0(p%#G{63F z=LblwcdY3eAs2VmpQhd8QdM++1Q6AEX;GK+F4-R9ZGBt;ETo9?DCr zv0D+1IDFD2JwEADtgpk0jFnYAjJJ(@@>0vEgx;*>?T$KtwXGVHwg{EYV4k~Ae-(8M zq(-WYZ0p$a#PooH1&29;1t$_t9$S2(58GNS8Rj zOP4xdqRX7GP!mS(wXWr~Th0}t^{$I4?CPWqt{rr_D@Dz&!?e*gOjo$xOPgE|Qj5Ea zTHR}@&3zZOyYHqB_w%$_-a=dCx6@YnYt$*fK-=U$L01^rp)ZLX{|8V@2MEVi07E4e z007D}b)$q0 z%WLwQzAecs$;-NdASxmv2qLK4kS~#nq5^hlp^Wh%1BQZAKtXf}4pBfw6cmwp&P}qW zT{hR>FFo(vkMniU{hxF9eEi_U02Ygt0^2UTZ1s{$s=JNge?~JFs`gh0d#dZJgLbsf ziWrV%$9z#cWYT!tjF?8kq{&_*;S2Vf!HtPzG*RvEF(L`GzPc~$iyD1Ci)C~-H!lh< zZlbmECE5Kw$w-6-61|3R5wT`0Y{g77ZpFehy2*?uNEeMSX*jN7i7#Yss=ic(5YRg8 zWISlDv?8X!e+)YwZVbnbP{eHPj~jh`X1uXAmT-(nWZohL1p<>d7@Lg7h!G1np548{ z3_1!t0yE`k(y=0qK|2;q#^YwpX>6fwMt8(ipwh-oMr2;Z4jPg3t-iFjiEVP5Wj8W^ zl0Y%930Vneg%uYl%W`q6JIRq+8;=~^6f>R1wX0ice^UuBBdtAFI2o4_6~UJ^kg?F#!|#Yr2j}n9N@@1>7~fuMD#_D5w%BpwLtNrqnEG8-Ir6ou2E2f_VZH z!ltvzf8c{mpVs8;#;m70j=`}S=A%Yn>Zr&LhjZ?R7!(;@XXOpGy-LRkte_4{1m@;F z!7*B7==^LD=cSdPjHE!>@hvj2=j%8b%Xsz_e=^rfuoNB3(?h2TOd@BOcPH#f(lJ*V zPOpv?Y41)Ks62d1DEI_jNFx|D6O@q)DJR1``t~a28pcUU-Hbr2w4G3E7TSV_>3VOTsau3RY9(%sAca@`GltA}bxT)ik1H!5XYB ze?kY&r90kZSdnDhJd5IBgehf8^CirA2(Y&E2`TajRIr|su8#*Igb3yNQi%@vQ|Qug z0WPFt3=sf32k5POw*CcHVT&e?km<5rfT#*GFEMn@M&;M?CEXnO;5$&MkH% zLTOA|6AF?7MP{_m+0sTkD8^Y27Oe4f``K{+ti76n(*d037~VYDfUe=5dU z+nO0CJFdc)it$BUO%5G8uizR=3aYQ|=4MC7SFo%Y*Wx+?$Cw=WD(3RQ4HU_UDH>}?$Qz?#n3%XpD7%RuqWbW)B70MGJctpNfASD{o7H++ zvZu$4o1xXFA?ww{bWYj1)>vOM11H((N3yjpV{pzA1&`%9C|O8;qTz8oAyBw>%}U=A z6;BG(jxNlRaoAGyw1!8qhjHlOwzNr^`JZaog`d$CAt|9Y>il#($06H=pOe~P#7@x2 zFSr@lgzs*2f8e^n2IOcmXU-YNne%Gnnv>GNc2HZc_ZisGIydd#(P!m?R4 zivLigs3CR?D@I^FJ=eFEUL)RNUX(Or!8C~c7a#Nf0~EDxE0#HP zRnWs=+UPC{6t^VVf1XabIi-5(-Jyy?!mSgUnpB~XV_Ytcm>sjoUU_Xrk!*W}#(=%< zFu5&sO%#X;B$IlJxWmOE*VT;jlXNjjOy-p(bjuEzRzw+xz_6T^Tpp-LYt==$sL;d| zF_o$bnU-_S=o062v$^+A7hX}xo2HK`WF$0dI1W2MQxmgfe?L7xF+ZjX`ttP1S%IZ_ z(rDdbbAGH~(p)X(l58=L6)YK(CzRiGtrc-B0eI$hl^z=3O{Ygm)&fzhi5gKyWrR8) z>bsJCjxKxz05sY_@G}Yk3Dc=EH=Dtv!#Ajku0+&I@M|%_fIyc`EM&DL*fHD9e%b4a z#j?E+)M{6be`;Tyj5$`+JbiP}?32xoXwpP8m%f=<^e{tJxy7oghoq4Pa<`(&N{~HO z^qjLoRa7tJT!Sk7SsgN9G|@;e$Q&I@$3Q{O#Il^uu=VVmiBk!-Mt8Jk<70+$)=(E; z&_XY3YUUYE+mq35Groo+M7UH)O&>)Tg_BG8Jq8ffe>0TcVv^EJOj3He0dUd!GEAWt z_X^@_X}^c)tlGf(_1=OVsHoe4Y4tl$>Dz%B-ohQ2HH10$f&WTSjk)Q4h1*FdNq1jY zJA(Ovw%S2VOJTtX>H@W0L#UVR!W51#ZKi)IoH&G~gQ!g5)U9Z$OQB^e8fZ@i{VD?~ ztQIWX*I2w);@?C{sP+OFC4_IfZtP} zLT~3FqJG8Qta_S@d{Vkvu5N`^@ADRYnG%9GerFINTpiWH}CfKwRa=su8@xYMtWNUdJgtNAiV;Y+Vv zf0(n9&Vd3lf?a|2yyMZp2p%U3hp@Z!sUbWwglALO>sM2F-mChR0km_#io86qt3HtR zNa-qlkvtm4D=F+N{ry3=vh!+J>Fd(tHxEt;zf#bwmKV7$3^W(rBK+m*wvRirDL}s& zQrJB?i6Atd4)_cBfJ^^8jKAEEf28nXf9Xdl4z_0iFG!aQePzN$eu?%GQ4sL##QTAO zx3DYVE)$-Pf-<3Y6gGQOqPX1C)iER{rbH=aO-fALiUh}@oulAayfieU^rNVS(J)mTl^2~@tAe^!b)l2(foB|TZJmNY8*#H->Iagn%6(yPU_l3p*i zOM0^ymh>U9SJJ)Wd9fc5FN&8WzhAt?)OC&PM)w4HMnSamq zf#jJo|Dn53@=S?$m$)mKmy~z{%+m=xH=vS$SKv$n;7+))4h8h&FQj*-2UijZ-vAYN z5vYCyO)N(-fvhgVm>{B<=vszJt~HqKx&S4vAWB_fl({a&6!&VByDvb6JBX?7UQBau zgx76LJ#Go~?*9Q$O9u!}1dt)a<&)icU4Pq312GVW|5&xPuGV_G@op77bzQ0`Ma3II z6cj;0@G{*_x6$l@WLq!9K8SDOg$Q2w06vsBTNM!*$jtot=1)l8KVIJeY+_#EvERRF z+`CN~+)~_fcio`v*4!Y8Ql(|4lGuxq7O`$fleEN}9cjIwL&2@>M%LYJOKqvn8>I&WVJ`e@>#4mHnuhzUW>Zd z%6?zt$4SI~lcxhlC4TO|$3j~w-G4Q7M%K!ZiRsf{m&+`_EmNcWDpuKnz~ahZga7dA zl|W%-^~!;R$uf$lI4EIk3?ryIC}TXYW(0;0`IS)TrpP}tglbN4Rm~aBg2TZCuXEfj zpuhoC)~>H#Ftz@S>Dn`9pMU{c7+4fO0Z>Z^2t=Mc0&4*P0OtV!08mQ<1d~V*7L&|- zFMkPm8^?8iLjVN0f)0|RWazNhlxTrCNF5O=L$(|qvP}`96jDcE$(EPEf?NsMWp)>m zXxB>G$Z3wYX%eT2l*V%1)^uAZjamt$qeSWzyLHo~Y15=<+Qx3$rdOKYhok&&0FWRF z%4wrdA7*Ff&CHwk{`bE(eC0czzD`8jMSo7v#dGI|cRk)Zs-;iqW~MdKn$EVyTGLj3 z!pLc^VVUu~mC-S7>p5L>bWDzGPCPxXr%ySBywjSH8!T(g4QQ%tWV0x-GTxc>x`MRw2YvQwFLXi(-2*!pH1fqj&WM*)ss%^jy-O~~=Jod&rs3`p^lQh*xx>$V^%w2Z&j z!JV31wR!8-t%AmCUa;)Y-AU<8!|LS2%021Y5tmW3yZsi6H<#N!hAI1YOn-O#a+>1^ zY7Vzo?Ij0y2kCaYgRP(n3RWNMr&c&bKWjLyBMtUYkTz4BLYwF=K`m0W;2OEkJ}Z|4 z-hg4pPhmj~dVa#4Ok$m&rpk#@lE-jhgrW+yQw*XxjPPMNp)uTkZ2rB2)Iptm9_-aT zw@Z(0YjS%(ZC7XqyKkA{^nV*Rl(6i{Anhz^*#)h&3?SVSPA&|N-F%x}bT_Y02wE{; zM?c*o$Zt4%`65BuLv73GUb;`vqYp@vs~HH{#%O^rt!`;^wx}6PcU04I)wE^0nqjJ% zISH|nPKNGusC&;&prdD0*HW{FnNjt#TH4J`s@rDeCOZPuGcS}&{(tsUA6${O?7Rk> z-W^^Hh+{QwxL7Jkd+C0K`so2dTfRpG`DsAVrtljgQiju@Li;Ew$mLtxrwweRuSZebVg~sWWptaT74S$#u1s7ZBTHa52W{3I8 zm+)pOWYR>19WXa<84{8gUtj=V_*gGP(WQby4xL6c6(%y83!VL#8W`a1&e9}n@)*R^ zIm^+5^aGq99C`xc8L2Ne1WWY>>Fx9mmi@ts)>Sv|Ef~2BXN7kvbe@6II43cH)FLy+ zyI?xkdQd-GT7R<$v9kgDZhDVGKTPlCRF1mA9S_ov&;gF&AH@(u#l-zKg!>k+E-Qjf z-cLWyx_m%Td}$9YvGPN_@+qVd*Q)5cI$TrLpP-Mh>_<6kysd!BC`cEXVf*Q0Y(Ugd zE^PYo5;;FDXeF@IGwN8mf~#|e4$?Ec!zTJEQCEM2VSjC;Wf`Vg*;)ahW;Gxob7z~` zW~NXn)s)F=lj^v3T31JP-BevIkI)8>oH5+-jyAK;GP8!ASKV>V#gDFTsa`xXt|1Uc z3i&PSgl%D=JEwj zW^F5vD1UeDg2OE5$hxnCFVvbUDpIEl_O19mVOmP_8bVz-kCsYEtX_1Ovbj+KS444hDHKJfNHwq&hQ z29#QGU>;3PSjf!&)Yr_T8HS#)YF@1v9`RQjD zr1yF0XiA~y=y{YGCGep{s6iwTA*ge*SZSH9K;{Gc1^NWT@{>XOdHMwf#oVVr5e4%x z1I%+r&CEE*Qu8V$tmu5mm?%|OR}{L++~wCzm$RIp(7a-4uUW|Jw)8G^n5G$)e{tS^ zRevIWx`v3t^JKqe>w9y09=jp{Kg*@dXXrZU#?;Tc<%xwMJewbXg?^RAe+_wMk=A>m z=A@r~0~#Z6hmh`q^b!Z`=jde+%aR2&hxQ>`<7bXmDk+!%e+$*7qh)2_^In4P`ktr> zO8z!|UZGd$clcz~c=h>Hr~z=--z_oAmw!Nq6({r-vRRJz0|mD#FZ{ls+p66(fA$X) z`U?9cH0RlBfikrIP@yl=AE9!T32=5+P-i$<+jN!7%+FG|&!5nrvTOegUa57UpZ*+h zJA>p2ga0MxsK21E^Uo8!3b{#gdjViLwDj?{%qL2b=fc}>G8GrHM z04YZSz|%^HpkOH)4w1W41*h(bOQ8mmEBsPEo@ObLg93$OR0O5mpOMj_muJWzi zcd5+~DdKi<2U`M<%O>D6UC5#6I_&6n&lq+LidLWk)0^OY9*xW4fM}}_(4tNKVhgr% zbaxmv1}d_H<;08!&5{N0g2W)&MMM!{5rt{6{~60ZbqGntDu5ToKv2X*M+0=~M6SR& z<)ddMykRaD#Wt~>_t=3wq<=D6rYsQ@J4;ibrnTWEV_xiHnY-c4F?oiIdnZc;p4g27 z50m%IdkG@6bOz!c03W3^!@e}MkjzV?@Z_6Ck0S09y;xv4TzT4dVFJ}bQ1pW-F|*f4 z{BIQzPD0Kdvk|QP{?*Mzf6Q4J5u5wBBE`9VlR!DpSj`QxGz*C1KwY`uOsHURS@Wb04YUIC8;j5AVHYM92El2AI3|7!eaOO$$wm{yCc6}sue43iB(dyLTG_^#o z(%R@%3dOF{`pXhN4YYwamKKQzu%sUCvS_48cOEU$mW!m!P=9=IitdXRX zsou|$KQ-uyjWqQ}X6V7eYqT$w6p?A#KSdvb6cFIOR4q2LNNghFd6ACRq1M@i@lB~z zGSZZqriY;H1%C=h<@t9;uhDT<@L}{HO(kEVmC@_oXQ(0S**-;H@pAPMql=DME;|u{ zPV`eSkr1cw8-cy+VdH~Tho_^5PQzI5hn1hk=oGB~D*W}B#^ZpzM3Zs;1Bsf0H=O>b*lMV|>Id?7De>`bbw{(os|iidojmii(+J_T#jhg$0E zF0t9a77uxgbgoE0g!SjKewv>2bop9*@$1i0N4&+iqmgc&o1yom5?K6WxbL!%ch%M+ zeefu@$Iyq5p7+5aUyAWQ7g9q-`pFAWDVi$MB{=)pq@RtFI-c-)A|u}Dh%Yu$A0KJ@ znUJ?+p?~L6u+PukkXqb;1zKnw?ZnMCAU$*2j^CZL_F4f6AMEu3*y|O1H*on~MrSW( zJZQTj(qC~jzsPRd?74SC6t~&Ho{dB|Y=>iK=<-GKd0seQ2i;$T8Bdj+^cwz8-F(Mj z1Sh?ABUYrpy39W}5TOdE+*bM#6<z)Ddox>o z2N5DqtOG!qxx|%NBqc+6Fj^Fz(uu%!QGdXaA8r=)rLCl^E*&i&6g$x@0yt?#tSE}c ziVo|C*xX<);bC`*gjXbdQe-WHg1wsXvs(d>ud+wQMn*g0ivOoLF2tQhvAJ2?b)qO@ zSH#w$c$56?E{a6L*BFNL_ZP*zUEYT7Kts0@^2Hfeo@y3{rp4hK(U3pni(e5(n#Egj{R-^BgMlcUDgtvJJ9-)H zy>pP4vE5+TX7MmA3PKQ#&Ef<;Z3EAhC`=6xCvd=B|IeNLz zE%#rd&&xiy-2Xa#L-x7l{_7|Jxz8>7!Xp~FFI(=%M7Qj7%l))?O6pmPiz6nW|1H4k zBUC4nix*$<2{av@xW8pXsPUVs;6JVT3+(1xAt z?9Q3@Iqyu)%%8u%egjy8DR6vr^rrerZ%S*Q{Fc6`FJH6}@8{p6nQo%F$e3uUKnOSQ}Q)_}#>HIS{p_QQ;x^ zw&N3pj&F1Hkiv+)I9^?SyjnF{bf|wGg%C(Lf+V!)h2xUId=T2E9mcN1L$QF^5g2*u_)h#x zV5qoL+7?I^OWPS_a6JtT*$mPcAHy(mJmUtoz)Z1zp0^RJebf|pVGWIsQB0nO8D@fn zeP+6d6PT}AA2UVLt7UKlb7PprygKtn-5>!^V1XRwIrG!}4+mn=`WBk<_rS~lA< zY|ueMzJEovQoY~iYXas~$fZRtL07(a1=a?#TU!GSD_28(EFUP#hg|sL=D^Hz|L6K7 zD60g^T-8lJg#y_+AG()`*QD^R!cpOxY7iLXH>Zls_hOj;GnnAs;L$9uaRbuj_dhXN z_<^afP)`ndO!qW}o+exVj;Uj$zv1Tc32vVWmrHP`CoJ`Zxvp@$E4=rv{Dp%8tK5(9 z7c5fP{T{ZAA#Omvi%lqOVetgT%V6phEDiQ6oM7cL#+QIm<(v8kP)i30>q=X}6rk(Ww~N);x^iv)>V z)F>R%WhPu8Gn7lW${nB1g?2dLWg6t73{<@%o=iq^d`ejx{msu;S`%=Y2!BRo(WJ^C zT4hqAYqXBuA|4G-hEb5yvQw2Bx7zVRpD;RR2ccOu@PhR3faoczJIZ5StRhv zJT*c`VV6u>2x;0SlCBHsQ7n>YhA$6iQU$Rd`#A*0pf5UAX^2~Qi`Ky%f6RGsoueIc_WKEcM!=sZzkijF|}LFs~GM=v-1aFc3dl?tifzSiqvXmL+l| z5-?ahO zL%3?PG<>&D{-(~{sG3$mZG!I^`lqCHWOSn}?5JWosiW?}R7Hz45Z6M;|I3ZkC#9f+ zgJwObwvJ7+lKPKs9)HS$N-3eNAWZc~d`TP=sY$X_md=Li)LwW?#|kR6y$#RzQ>|l?27Kf`O2bZM(f5T<@B@DC9-<3~{+a6@$%*btze+^?#(y za}=}LbSblhT0Q6Rm4>3=gi)o*G!B_6$tq*ItV%e0&U6FU!uj0%!h9}SX6NEZ9}oim zg4WPW?76Hk0#QwuQj$)~3QJw+v|eX=>YZgbHMJs34ZXEzFL($9Pw6>LDO8nGd&N^$ zGQH4GKq$+GsmsL%*AWQpwp1!JQ-AyUofV|o;~RKj0^!|%nF=P~ai{JLHLCol`|FQ7a$D7+PR6Mx&`hnhg>;JWrBjTd0T_>aUBJK||PoA}xwjpy>>3&$74 zTY?_p_n~D4+YZ_`VA~C};yEAv@pMP)u1z-biGn_klvcL6sU`UFOa5WKV z3&fLwP#~_QGqNI?vZjX9e_Ddmyv`La8Jre}B_kXk=J63Dn>GS%Nl7tyD3D2o(^4iZ z3mZc%E$ibOHj%F0n#U)zib4~{uoPZTL$0P|m2+KIQ#3oub%T7-d~5T@=GJh6j|NV- z!5BPIEvv`*E?MCW0ZmUuQo58-cw|hMG8wK%_B(RtIFDydO?RP^e__!PX;g|RlA4P2 z4jtif(}ij>mC-fQG-YluEa|d!vZky=`ljZ$Ff1r&IZhWinz9xVW74ROYid$XF*J6~ z9#4m@lhthw1!$|R%I2dC^$n%=%E!^TkD;QWai13pu*d@!Y6y9c-dw2lpbj-&crkx2 zs<6ZhH|C13WnOqNe@}d^VDJ{l;le5kl8?)VY1pm@y|@qed$1aQ;y}@)L?Jvc0$AuF zD-SZv*SVC~K`>q0t1Aq34UJs|`lF_(@D?xDV66bu6ClOSK1t`Q>F~QK56Cm(MI(a3 zaT7ypQO-6;vTAZ&m6Uwuwr6=LD-tLFL&h0PIO1GPDmNp0 z`#UM72-bPfjP(o)4PIiAp{Ai!ThwhM9u`&DL*e7r45@}qS>??T@1^nnVwqpqQ|k{%dq*LC>flElRbiy zesX2Z>T19VbuXQiV{#@+&4oMF+fTiOA{>-6PSIjcOoKFS6iq+l;13qz9r6xO;T=vS z2R}50ccv2#o=Q|h+CAJH)AW%6InA}KX&=!}FH#s5e>yTlWkaW!*oqO68SU{JVB)Hl0vvZTX1MRnmt z>R(Ase@{zh`Mq(VYx=EF{=B@5S3GzLuQCMxe}@eW>)Mz!MD4@r)31AQ0&md9FQ^oy zd7G7(S$O_sh;iiPo+8b+hoW2MCgpqfo!xG0(OkY_^|alpF%|tM#Ck5;=^g0SxgBPA zpj~cHfB&b6Q&;Wy!08+sbMeTuzdkW$^B?J$?sUlvt-t$YPGauPu)u#cwTdxyCpYYM z|J?88HSPEDl;Ruqhx%`Yevy`xn?Bjd|3~W9oV}gRHGB7q`Q(Vdsq+q>2waJF_ebBs z)an<$U1`@M%@%a;Q0e-`{4plt?ULOps_VMsCGSXjny=7!ro#&yKNJ1)=Ai$NRxZn^ zy4Sl4Ll2z(KBwF8hi}V=YEO>0v)s;W-I6n3;eA8#Nm?3bGv7lNHQNmz*r)Dmo);Ff zO0UZEYszKk7@x=M+t~l3}nRw>VNAHNMwcP4SQ@7VY?D`sF z;##ZUqW&=|gK7D@n8jC^GLEP2>E!!zYZE_vZY78Ewvd7|(~cLOnzsC9yoW$&qm3qq zpsJ|K^t*>sV&Xw`rHeF8*lJuD$<$-jSyd5*cS5Ss(6Yb9VFg zmdBdWY}LIRu7AEU`|`%nmbKe9Ru|paYqCyhr|*UfE-FWEX}w=mRr&Plh1ihRb?fZf zwan)B=Es{q5~L;-`z1@i@D;g`V!FL5wNQ6(VEFnOV}(&W5(+OmjC zt{E6?P*hzNg{ZnQ&x93nPpII0QRXs9h^Y5`Q(5r+jzD)z2ikzD_m~1i)&BV=vWRQ) z7#M6(Y-m#ksd5Lq7I7sT1A_&Ms!M7hRT`7mEYOmU0bSDtw9y&pb5uV)p8RovzbyDF zC}8LG98irBiYd|B5Es=i)RINMw8tJrRiQ3K)r*DZvWN>X&_g-e0HjJ0c*PGt$nC6< z^X(fKi85!JGE5e*Qk=YNk-RMYOm?7qbWm(zvI40x1N$3(C^beb?XYH;Y+x@1JjLBu z8gV!>aE=hgEak}u7stwi&)5apvl!@aI}~{(M~2DzjvipU5XZhUFzBPGigad}%vdEd zxzbq`tP*~*CD2u<_W8O(R6@>+)dQxjt#%cLitU#2DN2U^a=&A{*< zxXD2YMbW`rkaaSXALI&vos7Kx2GzR%l^~VoU`HXw92poCP|Q0w`QmaLS@`e~Fqq^~ z`SO8EH vsyBKjGfaLs3G5A4NEtF=r6}|LX&_PQ$$rzsC*NAh!zI8AJhX8xsQ3T?W}x<& delta 34740 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�{ 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