This is an automated email from the ASF dual-hosted git repository.

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new fc5be874ef1 Update dependency 
com.adobe.testing:s3mock-testsupport-common to v5 (#4596)
fc5be874ef1 is described below

commit fc5be874ef1c4b62f92927564a80029309c8ba11
Author: Solr Bot <[email protected]>
AuthorDate: Tue Aug 25 13:35:15 2026 +0200

    Update dependency com.adobe.testing:s3mock-testsupport-common to v5 (#4596)
    
    Updates Solr’s s3-repository test dependency on Adobe S3Mock to the 5.x 
line, which removes the prior JUnit4/embedded-server approach and instead runs 
S3Mock via Testcontainers. The PR adapts the module’s tests, documentation, and 
dependency metadata accordingly.
    
    Co-authored-by: Eric Pugh <[email protected]>
---
 ...com-adobe-testing-s3mock-testsupport-common.yml |  7 ++
 gradle/libs.versions.toml                          |  5 +-
 solr/licenses/aws-crt-0.45.1.jar.sha1              |  1 -
 solr/licenses/aws-crt-client-2.42.37.jar.sha1      |  1 -
 solr/licenses/aws-java-sdk-core-1.12.794.jar.sha1  |  1 -
 solr/licenses/aws-java-sdk-kms-1.12.794.jar.sha1   |  1 -
 solr/licenses/aws-java-sdk-s3-1.12.794.jar.sha1    |  1 -
 .../licenses/jackson-datatype-jdk8-2.22.0.jar.sha1 |  1 -
 .../jackson-module-parameter-names-2.22.0.jar.sha1 |  1 -
 solr/licenses/jmespath-java-1.12.794.jar.sha1      |  1 -
 solr/licenses/joda-time-2.14.2.jar.sha1            |  1 -
 solr/licenses/kotlin-stdlib-2.3.21.jar.sha1        |  1 +
 solr/licenses/micrometer-commons-1.14.13.jar.sha1  |  1 -
 .../micrometer-observation-1.14.13.jar.sha1        |  1 -
 solr/licenses/s3mock-4.12.4.jar.sha1               |  1 -
 solr/licenses/s3mock-junit4-4.12.4.jar.sha1        |  1 -
 solr/licenses/s3mock-testcontainers-5.1.0.jar.sha1 |  1 +
 .../s3mock-testsupport-common-4.12.4.jar.sha1      |  1 -
 solr/licenses/snakeyaml-2.4.jar.sha1               |  1 -
 solr/licenses/spring-aop-6.2.14.jar.sha1           |  1 -
 solr/licenses/spring-beans-6.2.14.jar.sha1         |  1 -
 solr/licenses/spring-boot-3.5.8.jar.sha1           |  1 -
 .../spring-boot-autoconfigure-3.5.8.jar.sha1       |  1 -
 solr/licenses/spring-boot-starter-3.5.8.jar.sha1   |  1 -
 .../spring-boot-starter-json-3.5.8.jar.sha1        |  1 -
 .../spring-boot-starter-logging-3.5.8.jar.sha1     |  1 -
 .../spring-boot-starter-tomcat-3.5.8.jar.sha1      |  1 -
 .../spring-boot-starter-web-3.5.8.jar.sha1         |  1 -
 solr/licenses/spring-context-6.2.14.jar.sha1       |  1 -
 solr/licenses/spring-core-6.2.14.jar.sha1          |  1 -
 solr/licenses/spring-expression-6.2.14.jar.sha1    |  1 -
 solr/licenses/spring-jcl-6.2.14.jar.sha1           |  1 -
 solr/licenses/spring-web-6.2.14.jar.sha1           |  1 -
 solr/licenses/spring-webmvc-6.2.14.jar.sha1        |  1 -
 solr/licenses/tomcat-embed-core-10.1.49.jar.sha1   |  1 -
 solr/licenses/tomcat-embed-el-10.1.49.jar.sha1     |  1 -
 .../tomcat-embed-websocket-10.1.49.jar.sha1        |  1 -
 .../url-connection-client-2.42.37.jar.sha1         |  1 -
 solr/modules/s3-repository/README.md               |  2 +-
 solr/modules/s3-repository/build.gradle            | 34 ++------
 solr/modules/s3-repository/gradle.lockfile         | 63 ++++----------
 .../org/apache/solr/s3/AbstractS3ClientTest.java   | 16 ++--
 .../org/apache/solr/s3/S3BackupRepositoryTest.java | 20 +++--
 .../apache/solr/s3/S3IncrementalBackupTest.java    | 16 ++--
 .../org/apache/solr/s3/S3InstallShardTest.java     | 18 ++--
 .../org/apache/solr/s3/S3MockContainerRule.java    | 95 ++++++++++++++++++++++
 .../solr/s3/S3MockTestcontainersThreadFilter.java  | 33 ++++++++
 .../org/apache/solr/s3/S3OutputStreamTest.java     | 15 ++--
 48 files changed, 215 insertions(+), 145 deletions(-)

diff --git 
a/changelog/unreleased/PR#4596-update-com-adobe-testing-s3mock-testsupport-common.yml
 
b/changelog/unreleased/PR#4596-update-com-adobe-testing-s3mock-testsupport-common.yml
new file mode 100644
index 00000000000..77e41830df6
--- /dev/null
+++ 
b/changelog/unreleased/PR#4596-update-com-adobe-testing-s3mock-testsupport-common.yml
@@ -0,0 +1,7 @@
+title: Update com.adobe.testing:s3mock-testsupport-common to v5
+type: dependency_update
+authors:
+- name: solrbot
+links:
+- name: PR#4596
+  url: https://github.com/apache/solr/pull/4596
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 91c753dfaaf..607ed54ecfe 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -13,7 +13,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 [versions]
-adobe-testing-s3mock = "4.12.4"
+adobe-testing-s3mock = "5.1.0"
 amazon-awssdk = "2.42.37"
 androidx-adaptive = "1.3.0-beta02"
 androidx-lifecycle = "2.10.0"
@@ -221,8 +221,7 @@ swagger3-core = { id = 
"io.swagger.core.v3.swagger-gradle-plugin", version.ref =
 thetaphi-forbiddenapis = { id = "de.thetaphi.forbiddenapis", version.ref = 
"thetaphi-forbiddenapis" }
 
 [libraries]
-adobe-testing-s3mock-junit4 = { module = "com.adobe.testing:s3mock-junit4", 
version.ref = "adobe-testing-s3mock" }
-adobe-testing-s3mock-testsupportcommon = { module = 
"com.adobe.testing:s3mock-testsupport-common", version.ref = 
"adobe-testing-s3mock" }
+adobe-testing-s3mock-testcontainers = { module = 
"com.adobe.testing:s3mock-testcontainers", version.ref = "adobe-testing-s3mock" 
}
 amazon-awssdk-apacheclient = { module = 
"software.amazon.awssdk:apache-client", version.ref = "amazon-awssdk" }
 amazon-awssdk-auth = { module = "software.amazon.awssdk:auth", version.ref = 
"amazon-awssdk" }
 amazon-awssdk-awscore = { module = "software.amazon.awssdk:aws-core", 
version.ref = "amazon-awssdk" }
diff --git a/solr/licenses/aws-crt-0.45.1.jar.sha1 
b/solr/licenses/aws-crt-0.45.1.jar.sha1
deleted file mode 100644
index 15decfc5028..00000000000
--- a/solr/licenses/aws-crt-0.45.1.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8bc83c38dc07d6762aa35753c9c0f7f959b0e85c
diff --git a/solr/licenses/aws-crt-client-2.42.37.jar.sha1 
b/solr/licenses/aws-crt-client-2.42.37.jar.sha1
deleted file mode 100644
index cca3601b605..00000000000
--- a/solr/licenses/aws-crt-client-2.42.37.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-878585e8678fe4dfce4d0608be99fd0c9c25a240
diff --git a/solr/licenses/aws-java-sdk-core-1.12.794.jar.sha1 
b/solr/licenses/aws-java-sdk-core-1.12.794.jar.sha1
deleted file mode 100644
index 052602eb6bf..00000000000
--- a/solr/licenses/aws-java-sdk-core-1.12.794.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9c6cc73ccf8a043f83e41272c1d3dde61ace274c
diff --git a/solr/licenses/aws-java-sdk-kms-1.12.794.jar.sha1 
b/solr/licenses/aws-java-sdk-kms-1.12.794.jar.sha1
deleted file mode 100644
index 867595330d1..00000000000
--- a/solr/licenses/aws-java-sdk-kms-1.12.794.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f62bca2da988f3b58e13b980f5d5af135f61b091
diff --git a/solr/licenses/aws-java-sdk-s3-1.12.794.jar.sha1 
b/solr/licenses/aws-java-sdk-s3-1.12.794.jar.sha1
deleted file mode 100644
index 0fd93feb5d4..00000000000
--- a/solr/licenses/aws-java-sdk-s3-1.12.794.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-a5b815e823ab29e5bac3dd4fc2340a275af61f2d
diff --git a/solr/licenses/jackson-datatype-jdk8-2.22.0.jar.sha1 
b/solr/licenses/jackson-datatype-jdk8-2.22.0.jar.sha1
deleted file mode 100644
index 8262c0b49f4..00000000000
--- a/solr/licenses/jackson-datatype-jdk8-2.22.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-5eaa676681bbb4a4036c097d13cb50835f513212
diff --git a/solr/licenses/jackson-module-parameter-names-2.22.0.jar.sha1 
b/solr/licenses/jackson-module-parameter-names-2.22.0.jar.sha1
deleted file mode 100644
index dd896bd834a..00000000000
--- a/solr/licenses/jackson-module-parameter-names-2.22.0.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-8bf5fd8adffde5ee34638be4f3fc69153cf74958
diff --git a/solr/licenses/jmespath-java-1.12.794.jar.sha1 
b/solr/licenses/jmespath-java-1.12.794.jar.sha1
deleted file mode 100644
index a26cd9733d3..00000000000
--- a/solr/licenses/jmespath-java-1.12.794.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-3a3000c9e9ea0a372c438d7cf18d72faf037abed
diff --git a/solr/licenses/joda-time-2.14.2.jar.sha1 
b/solr/licenses/joda-time-2.14.2.jar.sha1
deleted file mode 100644
index 33c00443e88..00000000000
--- a/solr/licenses/joda-time-2.14.2.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-3860f88b96c286330a895f65ba126f09a0b33bba
diff --git a/solr/licenses/kotlin-stdlib-2.3.21.jar.sha1 
b/solr/licenses/kotlin-stdlib-2.3.21.jar.sha1
new file mode 100644
index 00000000000..624ff9a6e75
--- /dev/null
+++ b/solr/licenses/kotlin-stdlib-2.3.21.jar.sha1
@@ -0,0 +1 @@
+a2ee2c4e220fee522f0451b723bab2a43f3481a7
diff --git a/solr/licenses/micrometer-commons-1.14.13.jar.sha1 
b/solr/licenses/micrometer-commons-1.14.13.jar.sha1
deleted file mode 100644
index e442c66ddb8..00000000000
--- a/solr/licenses/micrometer-commons-1.14.13.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-27570cdb63946dc2e95a0de5b75cd0bc9943a210
diff --git a/solr/licenses/micrometer-observation-1.14.13.jar.sha1 
b/solr/licenses/micrometer-observation-1.14.13.jar.sha1
deleted file mode 100644
index 69164a4c286..00000000000
--- a/solr/licenses/micrometer-observation-1.14.13.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-b9414791188efbfd823886047d0e6c3d20b2cd8d
diff --git a/solr/licenses/s3mock-4.12.4.jar.sha1 
b/solr/licenses/s3mock-4.12.4.jar.sha1
deleted file mode 100644
index 24a91521648..00000000000
--- a/solr/licenses/s3mock-4.12.4.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-92d7e1b5f8398b18d585ddae4ee2f5ef3bc53342
diff --git a/solr/licenses/s3mock-junit4-4.12.4.jar.sha1 
b/solr/licenses/s3mock-junit4-4.12.4.jar.sha1
deleted file mode 100644
index 0e27eab225d..00000000000
--- a/solr/licenses/s3mock-junit4-4.12.4.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-7ccdf31e3db85f4228b6a076324573d452675800
diff --git a/solr/licenses/s3mock-testcontainers-5.1.0.jar.sha1 
b/solr/licenses/s3mock-testcontainers-5.1.0.jar.sha1
new file mode 100644
index 00000000000..fd6b264bba0
--- /dev/null
+++ b/solr/licenses/s3mock-testcontainers-5.1.0.jar.sha1
@@ -0,0 +1 @@
+fa4251cd48d49ba09076aac96cf4858e43622895
diff --git a/solr/licenses/s3mock-testsupport-common-4.12.4.jar.sha1 
b/solr/licenses/s3mock-testsupport-common-4.12.4.jar.sha1
deleted file mode 100644
index d233465edc0..00000000000
--- a/solr/licenses/s3mock-testsupport-common-4.12.4.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f96c0850fa5de07a15de2a9c6b9faae4db69e123
diff --git a/solr/licenses/snakeyaml-2.4.jar.sha1 
b/solr/licenses/snakeyaml-2.4.jar.sha1
deleted file mode 100644
index 8739f8c1762..00000000000
--- a/solr/licenses/snakeyaml-2.4.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e0666b825b796f85521f02360e77f4c92c5a7a07
diff --git a/solr/licenses/spring-aop-6.2.14.jar.sha1 
b/solr/licenses/spring-aop-6.2.14.jar.sha1
deleted file mode 100644
index 368f3398445..00000000000
--- a/solr/licenses/spring-aop-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9928bf6218013fc04292bd2bb37a0099d7582e97
diff --git a/solr/licenses/spring-beans-6.2.14.jar.sha1 
b/solr/licenses/spring-beans-6.2.14.jar.sha1
deleted file mode 100644
index 52013b69cc9..00000000000
--- a/solr/licenses/spring-beans-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-7c3cc4477ba26f863848111a21e28886cadaccd9
diff --git a/solr/licenses/spring-boot-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-3.5.8.jar.sha1
deleted file mode 100644
index bcbea4a1bb6..00000000000
--- a/solr/licenses/spring-boot-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-449b94d19de085ffb767c7e4b6e888e754a059b5
diff --git a/solr/licenses/spring-boot-autoconfigure-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-autoconfigure-3.5.8.jar.sha1
deleted file mode 100644
index e27a4ad25cc..00000000000
--- a/solr/licenses/spring-boot-autoconfigure-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-313f6befb3e1e87b06703c087b6589ce15fd9ef7
diff --git a/solr/licenses/spring-boot-starter-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-starter-3.5.8.jar.sha1
deleted file mode 100644
index 566e8d97b51..00000000000
--- a/solr/licenses/spring-boot-starter-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-757ed1793f8c7d560cc837359f5816a1f495a087
diff --git a/solr/licenses/spring-boot-starter-json-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-starter-json-3.5.8.jar.sha1
deleted file mode 100644
index d3f8495a25a..00000000000
--- a/solr/licenses/spring-boot-starter-json-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9ab24564f45685c64e90bbf228402fec824c157d
diff --git a/solr/licenses/spring-boot-starter-logging-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-starter-logging-3.5.8.jar.sha1
deleted file mode 100644
index a4ffa258c35..00000000000
--- a/solr/licenses/spring-boot-starter-logging-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-86b7491d89ee273db4dfb6a162dd612be4710a6b
diff --git a/solr/licenses/spring-boot-starter-tomcat-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-starter-tomcat-3.5.8.jar.sha1
deleted file mode 100644
index d9404adad7d..00000000000
--- a/solr/licenses/spring-boot-starter-tomcat-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-91f0e20dc5ae0a5cc01153fedd0ed6375358fcfb
diff --git a/solr/licenses/spring-boot-starter-web-3.5.8.jar.sha1 
b/solr/licenses/spring-boot-starter-web-3.5.8.jar.sha1
deleted file mode 100644
index a7474d2ce99..00000000000
--- a/solr/licenses/spring-boot-starter-web-3.5.8.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-f4afb8ae01d775b91dbfa365012be55789d3e0de
diff --git a/solr/licenses/spring-context-6.2.14.jar.sha1 
b/solr/licenses/spring-context-6.2.14.jar.sha1
deleted file mode 100644
index 9b58eb8555e..00000000000
--- a/solr/licenses/spring-context-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-68022d7abfd427ff31e95cac9b7c1832e92f43d8
diff --git a/solr/licenses/spring-core-6.2.14.jar.sha1 
b/solr/licenses/spring-core-6.2.14.jar.sha1
deleted file mode 100644
index 0bac2aea3a9..00000000000
--- a/solr/licenses/spring-core-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0f8096a2102dbd9b2e864e19276d36d79efb7f0f
diff --git a/solr/licenses/spring-expression-6.2.14.jar.sha1 
b/solr/licenses/spring-expression-6.2.14.jar.sha1
deleted file mode 100644
index 057bf320ebb..00000000000
--- a/solr/licenses/spring-expression-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-4da9a87ad43d4e95a542b0ee3ed53308c535d7da
diff --git a/solr/licenses/spring-jcl-6.2.14.jar.sha1 
b/solr/licenses/spring-jcl-6.2.14.jar.sha1
deleted file mode 100644
index 17dad14e1b5..00000000000
--- a/solr/licenses/spring-jcl-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-54e46d799759e21a4e32fdb5fe487c0330d4acb4
diff --git a/solr/licenses/spring-web-6.2.14.jar.sha1 
b/solr/licenses/spring-web-6.2.14.jar.sha1
deleted file mode 100644
index c1acc13eee3..00000000000
--- a/solr/licenses/spring-web-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e2d19ddcef801d93143b6337e62bfd53c1490fbf
diff --git a/solr/licenses/spring-webmvc-6.2.14.jar.sha1 
b/solr/licenses/spring-webmvc-6.2.14.jar.sha1
deleted file mode 100644
index 1622e2178ad..00000000000
--- a/solr/licenses/spring-webmvc-6.2.14.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-c3f0f0651a4ffe212cbf8389e043a7c20450859c
diff --git a/solr/licenses/tomcat-embed-core-10.1.49.jar.sha1 
b/solr/licenses/tomcat-embed-core-10.1.49.jar.sha1
deleted file mode 100644
index f96378ea84c..00000000000
--- a/solr/licenses/tomcat-embed-core-10.1.49.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-e307b4b4e7ef975f5358c01ed014c80b830f39f9
diff --git a/solr/licenses/tomcat-embed-el-10.1.49.jar.sha1 
b/solr/licenses/tomcat-embed-el-10.1.49.jar.sha1
deleted file mode 100644
index 3a43658193c..00000000000
--- a/solr/licenses/tomcat-embed-el-10.1.49.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-2258d147a49331d34e36ea96abc7664b263f399e
diff --git a/solr/licenses/tomcat-embed-websocket-10.1.49.jar.sha1 
b/solr/licenses/tomcat-embed-websocket-10.1.49.jar.sha1
deleted file mode 100644
index 031248ad77d..00000000000
--- a/solr/licenses/tomcat-embed-websocket-10.1.49.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-9e89b260c504cb6c3be5e56707ef55869a684ed3
diff --git a/solr/licenses/url-connection-client-2.42.37.jar.sha1 
b/solr/licenses/url-connection-client-2.42.37.jar.sha1
deleted file mode 100644
index 6ac8dc316df..00000000000
--- a/solr/licenses/url-connection-client-2.42.37.jar.sha1
+++ /dev/null
@@ -1 +0,0 @@
-0d6dc3d6fdf3404e29321698c0c7ea4b0de2c90d
diff --git a/solr/modules/s3-repository/README.md 
b/solr/modules/s3-repository/README.md
index 7d703071a98..2657da6357c 100644
--- a/solr/modules/s3-repository/README.md
+++ b/solr/modules/s3-repository/README.md
@@ -40,7 +40,7 @@ This plugin uses the [default AWS credentials provider 
chain](https://docs.aws.a
 To run / test locally, first spin up S3Mock:
 
     mkdir /tmp/s3
-    docker run -p 9090:9090 --env initialBuckets=TEST_BUCKET -v 
/tmp/s3:/s3mockroot -t adobe/s3mock
+    docker run -p 9090:9090 --env 
COM_ADOBE_TESTING_S3MOCK_STORE_INITIAL_BUCKETS=TEST_BUCKET -v 
/tmp/s3:/s3mockroot -t adobe/s3mock:5.1.0
 
 Add this to your `solr.xml`:
 
diff --git a/solr/modules/s3-repository/build.gradle 
b/solr/modules/s3-repository/build.gradle
index da302c354d2..9828152e0ee 100644
--- a/solr/modules/s3-repository/build.gradle
+++ b/solr/modules/s3-repository/build.gradle
@@ -20,8 +20,10 @@ apply plugin: 'java-library'
 description = 'S3 Repository'
 
 ext {
-  // S3Mock 4.x runs on embedded Tomcat, which is incompatible with the Java 
SecurityManager
-  // (Tomcat's PrivilegedSetAccessControlContext fails under an SM). Disable 
it for these tests.
+  // S3Mock now runs as a Testcontainers-managed Docker container 
(S3MockContainerRule), which
+  // does PATH scanning, spawns processes, and talks to the Docker daemon over 
a Unix socket --
+  // none of which play well with a static SecurityManager policy. Same 
rationale as
+  // solr:cross-dc-manager and solr:modules:extraction, Solr's other 
Testcontainers consumers.
   useSecurityManager = false
 }
 
@@ -61,27 +63,10 @@ dependencies {
 
   testImplementation libs.hamcrest.hamcrest
 
-  testImplementation(libs.adobe.testing.s3mock.junit4) {
-    transitive = false
-  }
-  testImplementation(libs.adobe.testing.s3mock.testsupportcommon) {
-    // Don't pull in separate versions of these libs, just use what Solr 
already has
-    exclude group: 'org.apache.logging.log4j', module: 'log4j-to-slf4j'
-    exclude group: 'ch.qos.logback', module: 'logback-classic'
-    exclude group: 'org.eclipse.jetty', module: '*'
-    exclude group: 'io.netty', module: '*'
-    exclude group: 'commons-io', module: 'commons-io'
-    exclude group: 'commons-codec', module: 'commons-codec'
-    exclude group: 'org.apache.commons', module: 'commons-lang3'
-    exclude group: 'software.amazon.awssdk', module: 'netty-nio-client'
-    exclude group: 'org.codehaus.woodstox', module: 'stax2-api'
-    exclude group: 'org.springframework.boot', module: 
'spring-boot-actuator-autoconfigure'
-  }
+  testImplementation libs.adobe.testing.s3mock.testcontainers
 
   testImplementation libs.commonsio.commonsio
 
-  testRuntimeOnly libs.eclipse.jetty.ee10.webapp
-
   testImplementation(libs.mockito.core, {
     exclude group: "net.bytebuddy", module: "byte-buddy-agent"
   })
@@ -91,15 +76,6 @@ dependencies {
 }
 
 test {
-  // S3Mock uses Spring Boot under the hood, which tries to do too much auto 
configuration that we don't want
-  environment "spring.autoconfigure.exclude",
-      "org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration"
-  environment "spring.jmx.enabled", "false"
-
-  // Without this, randomizedtesting will think our tests leak threads (b/c 
S3Mock's Jetty hasn't bothered to clean up yet)
-  environment "server.jetty.threads.idle-timeout", "1s"
-
-  // Reduce logging noise during the tests
   environment "aws.accessKeyId", "foo"
   environment "aws.secretAccessKey", "bar"
 }
diff --git a/solr/modules/s3-repository/gradle.lockfile 
b/solr/modules/s3-repository/gradle.lockfile
index 596ad8fb440..fdd3a7c36ec 100644
--- a/solr/modules/s3-repository/gradle.lockfile
+++ b/solr/modules/s3-repository/gradle.lockfile
@@ -2,28 +2,21 @@
 # Manual edits can break the build and are not advised.
 # This file is expected to be part of source control.
 # To regenerate this file, run: ./gradlew 
:solr:modules:s3-repository:dependencies --write-locks
-com.adobe.testing:s3mock-junit4:4.12.4=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.adobe.testing:s3mock-testsupport-common:4.12.4=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.adobe.testing:s3mock:4.12.4=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.amazonaws:aws-java-sdk-core:1.12.794=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.amazonaws:aws-java-sdk-kms:1.12.794=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.amazonaws:aws-java-sdk-s3:1.12.794=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.amazonaws:jmespath-java:1.12.794=jarValidation,testCompileClasspath,testRuntimeClasspath
+com.adobe.testing:s3mock-testcontainers:5.1.0=jarValidation,testCompileClasspath,testRuntimeClasspath
 
com.carrotsearch.randomizedtesting:randomizedtesting-runner:2.9.1=jarValidation,testCompileClasspath,testRuntimeClasspath
 
com.carrotsearch:hppc:0.10.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
com.fasterxml.jackson.core:jackson-annotations:2.22=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
-com.fasterxml.jackson.core:jackson-core:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
-com.fasterxml.jackson.core:jackson-databind:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
-com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
+com.fasterxml.jackson.core:jackson-core:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
+com.fasterxml.jackson.core:jackson-databind:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
+com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
com.fasterxml.jackson.dataformat:jackson-dataformat-smile:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.22.0=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.22.0=jarValidation,testCompileClasspath,testRuntimeClasspath
-com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.22.0=jarValidation,testCompileClasspath,testRuntimeClasspath
 
com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:2.22.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-com.fasterxml.jackson.module:jackson-module-parameter-names:2.22.0=jarValidation,testCompileClasspath,testRuntimeClasspath
 
com.fasterxml.jackson:jackson-bom:2.22.0=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
-com.fasterxml.woodstox:woodstox-core:7.2.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
+com.fasterxml.woodstox:woodstox-core:7.2.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
com.github.ben-manes.caffeine:caffeine:3.2.4=annotationProcessor,errorprone,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testAnnotationProcessor,testRuntimeClasspath
+com.github.docker-java:docker-java-api:3.7.1=jarValidation,testCompileClasspath,testRuntimeClasspath
+com.github.docker-java:docker-java-transport-zerodep:3.7.1=jarValidation,testCompileClasspath,testRuntimeClasspath
+com.github.docker-java:docker-java-transport:3.7.1=jarValidation,testCompileClasspath,testRuntimeClasspath
 
com.github.kevinstern:software-and-algorithms:1.0=annotationProcessor,errorprone,testAnnotationProcessor
 
com.google.auto.service:auto-service-annotations:1.0.1=annotationProcessor,errorprone,testAnnotationProcessor
 
com.google.auto.value:auto-value-annotations:1.11.1=annotationProcessor,errorprone,testAnnotationProcessor
@@ -49,8 +42,6 @@ 
commons-io:commons-io:2.22.0=compileClasspath,jarValidation,runtimeClasspath,run
 
io.dropwizard.metrics:metrics-core:4.2.39=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
io.github.eisop:dataflow-errorprone:3.41.0-eisop1=annotationProcessor,errorprone,testAnnotationProcessor
 
io.github.java-diff-utils:java-diff-utils:4.12=annotationProcessor,errorprone,testAnnotationProcessor
-io.micrometer:micrometer-commons:1.14.13=jarValidation,testCompileClasspath,testRuntimeClasspath
-io.micrometer:micrometer-observation:1.14.13=jarValidation,testCompileClasspath,testRuntimeClasspath
 
io.netty:netty-buffer:4.2.17.Final=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
io.netty:netty-codec-base:4.2.17.Final=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
io.netty:netty-common:4.2.17.Final=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
@@ -83,19 +74,20 @@ 
io.prometheus:prometheus-metrics-model:1.8.0=jarValidation,runtimeClasspath,runt
 
io.sgr:s2-geometry-library-java:1.0.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
io.swagger.core.v3:swagger-annotations-jakarta:2.2.52=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
jakarta.activation:jakarta.activation-api:2.1.3=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-jakarta.annotation:jakarta.annotation-api:3.0.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
+jakarta.annotation:jakarta.annotation-api:3.0.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
jakarta.inject:jakarta.inject-api:2.0.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
jakarta.servlet:jakarta.servlet-api:6.1.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
jakarta.validation:jakarta.validation-api:3.1.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
jakarta.ws.rs:jakarta.ws.rs-api:4.0.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
jakarta.xml.bind:jakarta.xml.bind-api:4.0.2=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
javax.inject:javax.inject:1=annotationProcessor,errorprone,testAnnotationProcessor
-joda-time:joda-time:2.14.2=jarValidation,testCompileClasspath,testRuntimeClasspath
 junit:junit:4.13.2=jarValidation,testCompileClasspath,testRuntimeClasspath
 
net.bytebuddy:byte-buddy:1.18.11=jarValidation,testCompileClasspath,testRuntimeClasspath
+net.java.dev.jna:jna:5.19.1=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.antlr:antlr4-runtime:4.13.2=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
+org.apache.commons:commons-compress:1.28.0=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.apache.commons:commons-exec:1.6.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-org.apache.commons:commons-lang3:3.20.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
+org.apache.commons:commons-lang3:3.20.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
org.apache.commons:commons-math3:3.6.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.apache.curator:curator-client:5.9.0=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
org.apache.curator:curator-framework:5.9.0=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
@@ -130,9 +122,6 @@ 
org.apache.lucene:lucene-spatial-extras:10.4.0=jarValidation,runtimeClasspath,ru
 
org.apache.lucene:lucene-spatial3d:10.4.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.apache.lucene:lucene-suggest:10.4.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.apache.lucene:lucene-test-framework:10.4.0=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.apache.tomcat.embed:tomcat-embed-core:10.1.49=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.apache.tomcat.embed:tomcat-embed-el:10.1.49=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.apache.tomcat.embed:tomcat-embed-websocket:10.1.49=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.apache.zookeeper:zookeeper-jute:3.9.5=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
org.apache.zookeeper:zookeeper:3.9.5=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 org.apiguardian:apiguardian-api:1.1.2=jarValidation,testRuntimeClasspath
@@ -140,8 +129,6 @@ 
org.codehaus.woodstox:stax2-api:4.3.0=jarValidation,runtimeClasspath,runtimeLibs
 
org.eclipse.jetty.compression:jetty-compression-common:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.eclipse.jetty.compression:jetty-compression-gzip:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.eclipse.jetty.ee10:jetty-ee10-servlet:12.1.10=jarValidation,testRuntimeClasspath
-org.eclipse.jetty.ee10:jetty-ee10-webapp:12.1.10=jarValidation,testRuntimeClasspath
-org.eclipse.jetty.ee:jetty-ee-webapp:12.1.10=jarValidation,testRuntimeClasspath
 
org.eclipse.jetty.http2:jetty-http2-client-transport:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.eclipse.jetty.http2:jetty-http2-client:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
 
org.eclipse.jetty.http2:jetty-http2-common:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
@@ -159,7 +146,6 @@ 
org.eclipse.jetty:jetty-security:12.1.10=jarValidation,runtimeClasspath,runtimeL
 
org.eclipse.jetty:jetty-server:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 org.eclipse.jetty:jetty-session:12.1.10=jarValidation,testRuntimeClasspath
 
org.eclipse.jetty:jetty-util:12.1.10=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
-org.eclipse.jetty:jetty-xml:12.1.10=jarValidation,testRuntimeClasspath
 
org.glassfish.hk2.external:aopalliance-repackaged:4.0.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.glassfish.hk2:hk2-api:4.0.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.glassfish.hk2:hk2-locator:4.0.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
@@ -175,7 +161,7 @@ 
org.glassfish.jersey.media:jersey-media-json-jackson:4.0.2=jarValidation,runtime
 
org.glassfish.jersey:jersey-bom:4.0.2=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.hamcrest:hamcrest:3.0=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.javassist:javassist:3.30.2-GA=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-org.jetbrains.kotlin:kotlin-stdlib:2.2.21=jarValidation,testCompileClasspath,testRuntimeClasspath
+org.jetbrains.kotlin:kotlin-stdlib:2.3.21=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.jetbrains:annotations:26.1.0=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.jspecify:jspecify:1.0.0=annotationProcessor,compileClasspath,errorprone,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testAnnotationProcessor,testCompileClasspath,testRuntimeClasspath
 org.junit.jupiter:junit-jupiter-api:5.6.2=jarValidation,testRuntimeClasspath
@@ -191,34 +177,18 @@ 
org.ow2.asm:asm-tree:9.10.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatf
 
org.ow2.asm:asm:9.10.1=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.pcollections:pcollections:4.0.1=annotationProcessor,errorprone,testAnnotationProcessor
 
org.reactivestreams:reactive-streams:1.0.4=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
+org.rnorth.duct-tape:duct-tape:1.0.8=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.semver4j:semver4j:6.0.0=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
 
org.slf4j:jcl-over-slf4j:2.0.18=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-org.slf4j:jul-to-slf4j:2.0.18=jarValidation,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
+org.slf4j:jul-to-slf4j:2.0.18=solrPlatformLibs
 
org.slf4j:slf4j-api:2.0.18=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot-autoconfigure:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot-starter-json:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot-starter-logging:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot-starter-tomcat:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot-starter-web:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot-starter:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework.boot:spring-boot:3.5.8=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-aop:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-beans:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-context:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-core:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-expression:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-jcl:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-web:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
-org.springframework:spring-webmvc:6.2.14=jarValidation,testCompileClasspath,testRuntimeClasspath
+org.testcontainers:testcontainers:2.0.5=jarValidation,testCompileClasspath,testRuntimeClasspath
 
org.xerial.snappy:snappy-java:1.1.10.8=jarValidation,runtimeClasspath,runtimeLibs,solrPlatformLibs,testRuntimeClasspath
-org.yaml:snakeyaml:2.4=jarValidation,testCompileClasspath,testRuntimeClasspath
-software.amazon.awssdk.crt:aws-crt:0.45.1=jarValidation,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:annotations:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:apache-client:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:arns:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:auth:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:aws-core:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
-software.amazon.awssdk:aws-crt-client:2.42.37=jarValidation,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:aws-query-protocol:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:aws-xml-protocol:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:bom:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
@@ -243,7 +213,6 @@ 
software.amazon.awssdk:s3:2.42.37=compileClasspath,jarValidation,runtimeClasspat
 
software.amazon.awssdk:sdk-core:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:sts:2.42.37=jarValidation,runtimeClasspath,runtimeLibs,testRuntimeClasspath
 
software.amazon.awssdk:third-party-jackson-core:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
-software.amazon.awssdk:url-connection-client:2.42.37=jarValidation,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:utils-lite:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.awssdk:utils:2.42.37=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
 
software.amazon.eventstream:eventstream:1.0.1=compileClasspath,jarValidation,runtimeClasspath,runtimeLibs,testCompileClasspath,testRuntimeClasspath
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/AbstractS3ClientTest.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/AbstractS3ClientTest.java
index 242ab9b81e2..a68c16d0636 100644
--- 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/AbstractS3ClientTest.java
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/AbstractS3ClientTest.java
@@ -16,13 +16,15 @@
  */
 package org.apache.solr.s3;
 
-import com.adobe.testing.s3mock.junit4.S3MockRule;
+import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
+import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
+import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.util.SocketProxy;
 import org.junit.After;
@@ -31,14 +33,18 @@ import org.junit.ClassRule;
 import software.amazon.awssdk.profiles.ProfileFileSystemSetting;
 
 /** Abstract class for test with S3Mock. */
+@ThreadLeakFilters(
+    filters = {
+      SolrIgnoredThreadsFilter.class,
+      QuickPatchThreadsFilter.class,
+      S3MockTestcontainersThreadFilter.class
+    })
 public class AbstractS3ClientTest extends SolrTestCaseJ4 {
 
   protected static final String BUCKET_NAME = "test-bucket";
 
   @ClassRule
-  @SuppressWarnings("removal")
-  public static final S3MockRule S3_MOCK_RULE =
-      S3MockRule.builder().silent().withInitialBuckets(BUCKET_NAME).build();
+  public static final S3MockContainerRule S3_MOCK_RULE = new 
S3MockContainerRule(BUCKET_NAME);
 
   S3StorageClient client;
   private SocketProxy proxy;
@@ -52,7 +58,7 @@ public class AbstractS3ClientTest extends SolrTestCaseJ4 {
 
     // We are using a proxy in front of S3Mock to be able to test connection 
loss
     proxy = new SocketProxy();
-    proxy.open(URI.create("http://localhost:"; + S3_MOCK_RULE.getHttpPort()));
+    proxy.open(URI.create(S3_MOCK_RULE.getHttpEndpoint()));
     client =
         new S3StorageClient(
             BUCKET_NAME,
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3BackupRepositoryTest.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3BackupRepositoryTest.java
index 96f89a35b44..e75f9bef733 100644
--- 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3BackupRepositoryTest.java
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3BackupRepositoryTest.java
@@ -18,7 +18,7 @@ package org.apache.solr.s3;
 
 import static org.apache.solr.s3.S3BackupRepository.S3_SCHEME;
 
-import com.adobe.testing.s3mock.junit4.S3MockRule;
+import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -37,6 +37,8 @@ import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexInput;
 import org.apache.lucene.store.IndexOutput;
 import org.apache.lucene.store.OutputStreamIndexOutput;
+import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
+import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.api.collections.AbstractBackupRepositoryTest;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.core.backup.repository.BackupRepository;
@@ -48,6 +50,12 @@ import software.amazon.awssdk.core.sync.ResponseTransformer;
 import software.amazon.awssdk.regions.Region;
 import software.amazon.awssdk.services.s3.S3Client;
 
+@ThreadLeakFilters(
+    filters = {
+      SolrIgnoredThreadsFilter.class,
+      QuickPatchThreadsFilter.class,
+      S3MockTestcontainersThreadFilter.class
+    })
 public class S3BackupRepositoryTest extends AbstractBackupRepositoryTest {
 
   private static final String BUCKET_NAME = 
S3BackupRepositoryTest.class.getSimpleName();
@@ -55,13 +63,7 @@ public class S3BackupRepositoryTest extends 
AbstractBackupRepositoryTest {
   public Path temporaryFolder;
 
   @ClassRule
-  @SuppressWarnings("removal")
-  public static final S3MockRule S3_MOCK_RULE =
-      S3MockRule.builder()
-          .silent()
-          .withInitialBuckets(BUCKET_NAME)
-          .withSecureConnection(false)
-          .build();
+  public static final S3MockContainerRule S3_MOCK_RULE = new 
S3MockContainerRule(BUCKET_NAME);
 
   @Before
   @Override
@@ -336,7 +338,7 @@ public class S3BackupRepositoryTest extends 
AbstractBackupRepositoryTest {
     NamedList<Object> args = new NamedList<>();
     args.add(S3BackupRepositoryConfig.REGION, Region.US_EAST_1.id());
     args.add(S3BackupRepositoryConfig.BUCKET_NAME, BUCKET_NAME);
-    args.add(S3BackupRepositoryConfig.ENDPOINT, "http://localhost:"; + 
S3_MOCK_RULE.getHttpPort());
+    args.add(S3BackupRepositoryConfig.ENDPOINT, 
S3_MOCK_RULE.getHttpEndpoint());
     return args;
   }
 
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
index a0f1d1111a7..d2afd7e8119 100644
--- 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3IncrementalBackupTest.java
@@ -17,10 +17,12 @@
 
 package org.apache.solr.s3;
 
-import com.adobe.testing.s3mock.junit4.S3MockRule;
+import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.lang.invoke.MethodHandles;
 import org.apache.lucene.tests.util.LuceneTestCase;
+import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
+import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.api.collections.AbstractIncrementalBackupTest;
 import org.apache.solr.util.LogLevel;
 import org.junit.BeforeClass;
@@ -33,6 +35,12 @@ import software.amazon.awssdk.regions.Region;
 @LuceneTestCase.Nightly
 @LuceneTestCase.SuppressCodecs({"SimpleText"})
 @ThreadLeakLingering(linger = 10)
+@ThreadLeakFilters(
+    filters = {
+      SolrIgnoredThreadsFilter.class,
+      QuickPatchThreadsFilter.class,
+      S3MockTestcontainersThreadFilter.class
+    })
 @LogLevel(
     value =
         
"org.apache.solr.cloud=DEBUG;org.apache.solr.cloud.api.collections=DEBUG;org.apache.solr.cloud.overseer=DEBUG")
@@ -42,9 +50,7 @@ public class S3IncrementalBackupTest extends 
AbstractIncrementalBackupTest {
   private static final String BUCKET_NAME = 
S3IncrementalBackupTest.class.getSimpleName();
 
   @ClassRule
-  @SuppressWarnings("removal")
-  public static final S3MockRule S3_MOCK_RULE =
-      
S3MockRule.builder().withInitialBuckets(BUCKET_NAME).withSecureConnection(false).build();
+  public static final S3MockContainerRule S3_MOCK_RULE = new 
S3MockContainerRule(BUCKET_NAME);
 
   public static final String SOLR_XML =
       "<solr>\n"
@@ -128,7 +134,7 @@ public class S3IncrementalBackupTest extends 
AbstractIncrementalBackupTest {
                 .replace("BAD_BUCKET", BUCKET_NAME)
                 .replace("BUCKET", BUCKET_NAME)
                 .replace("REGION", Region.US_EAST_1.id())
-                .replace("ENDPOINT", "http://localhost:"; + 
S3_MOCK_RULE.getHttpPort()))
+                .replace("ENDPOINT", S3_MOCK_RULE.getHttpEndpoint()))
         .configure();
   }
 
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3InstallShardTest.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3InstallShardTest.java
index c44e2170a39..b239ae4b660 100644
--- 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3InstallShardTest.java
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3InstallShardTest.java
@@ -17,9 +17,10 @@
 
 package org.apache.solr.s3;
 
-import com.adobe.testing.s3mock.junit4.S3MockRule;
-import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
+import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import org.apache.lucene.tests.util.LuceneTestCase;
+import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
+import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.cloud.api.collections.AbstractIncrementalBackupTest;
 import org.apache.solr.cloud.api.collections.AbstractInstallShardTest;
 import org.apache.solr.handler.admin.api.InstallShardData;
@@ -35,7 +36,12 @@ import software.amazon.awssdk.regions.Region;
  */
 // Backups do checksum validation against a footer value not present in 
'SimpleText'
 @LuceneTestCase.SuppressCodecs({"SimpleText"})
-@ThreadLeakLingering(linger = 10)
+@ThreadLeakFilters(
+    filters = {
+      SolrIgnoredThreadsFilter.class,
+      QuickPatchThreadsFilter.class,
+      S3MockTestcontainersThreadFilter.class
+    })
 public class S3InstallShardTest extends AbstractInstallShardTest {
 
   private static final String BUCKET_NAME = 
S3InstallShardTest.class.getSimpleName();
@@ -61,9 +67,7 @@ public class S3InstallShardTest extends 
AbstractInstallShardTest {
       
AbstractInstallShardTest.defaultSolrXmlTextWithBackupRepository(BACKUP_REPOSITORY_XML);
 
   @ClassRule
-  @SuppressWarnings("removal")
-  public static final S3MockRule S3_MOCK_RULE =
-      
S3MockRule.builder().withInitialBuckets(BUCKET_NAME).withSecureConnection(false).build();
+  public static final S3MockContainerRule S3_MOCK_RULE = new 
S3MockContainerRule(BUCKET_NAME);
 
   @BeforeClass
   public static void setupClass() throws Exception {
@@ -78,7 +82,7 @@ public class S3InstallShardTest extends 
AbstractInstallShardTest {
             SOLR_XML
                 .replace("BUCKET", BUCKET_NAME)
                 .replace("REGION", Region.US_EAST_1.id())
-                .replace("ENDPOINT", "http://localhost:"; + 
S3_MOCK_RULE.getHttpPort()))
+                .replace("ENDPOINT", S3_MOCK_RULE.getHttpEndpoint()))
         .configure();
 
     bootstrapBackupRepositoryData("/");
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3MockContainerRule.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3MockContainerRule.java
new file mode 100644
index 00000000000..48eb7a84021
--- /dev/null
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3MockContainerRule.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.s3;
+
+import com.adobe.testing.s3mock.testcontainers.S3MockContainer;
+import java.lang.invoke.MethodHandles;
+import java.net.URI;
+import org.junit.Assume;
+import org.junit.rules.ExternalResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.utility.DockerImageName;
+import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
+import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
+import software.amazon.awssdk.regions.Region;
+import software.amazon.awssdk.services.s3.S3Client;
+import software.amazon.awssdk.services.s3.S3Configuration;
+
+/**
+ * JUnit rule that manages a single S3Mock testcontainer. Declare as a {@code 
@ClassRule} so the
+ * (expensive to start) mock server is shared across all {@code @Test} methods 
in a class instead of
+ * being restarted for each one; JUnit starts it before, and stops it after, 
the whole class runs.
+ *
+ * <p>Skips the calling test (via {@link Assume}) instead of failing outright 
if
+ * Docker/Testcontainers isn't available in this environment.
+ */
+public class S3MockContainerRule extends ExternalResource {
+
+  private static final Logger log = 
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+  public static final String S3MOCK_DOCKER_IMAGE = "adobe/s3mock:5.1.0";
+
+  private final String bucketName;
+
+  private S3MockContainer s3MockContainer;
+
+  public S3MockContainerRule(String bucketName) {
+    this.bucketName = bucketName;
+  }
+
+  @Override
+  protected void before() {
+    s3MockContainer =
+        new S3MockContainer(DockerImageName.parse(S3MOCK_DOCKER_IMAGE))
+            .withInitialBuckets(bucketName);
+    try {
+      s3MockContainer.start();
+    } catch (Throwable t) {
+      Assume.assumeNoException("Docker/Testcontainers not available; skipping 
test", t);
+    }
+  }
+
+  @Override
+  protected void after() {
+    if (s3MockContainer != null) {
+      try {
+        s3MockContainer.stop();
+      } catch (Exception e) {
+        log.error("Exception stopping S3Mock container", e);
+      } finally {
+        s3MockContainer = null;
+      }
+    }
+  }
+
+  /** Full HTTP endpoint URL (including mapped host/port). */
+  public String getHttpEndpoint() {
+    return s3MockContainer.getHttpEndpoint();
+  }
+
+  public S3Client createS3ClientV2() {
+    return S3Client.builder()
+        .endpointOverride(URI.create(s3MockContainer.getHttpEndpoint()))
+        .region(Region.US_EAST_1)
+        .credentialsProvider(
+            StaticCredentialsProvider.create(AwsBasicCredentials.create("foo", 
"bar")))
+        
.serviceConfiguration(S3Configuration.builder().pathStyleAccessEnabled(true).build())
+        .build();
+  }
+}
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3MockTestcontainersThreadFilter.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3MockTestcontainersThreadFilter.java
new file mode 100644
index 00000000000..f4cb503a80c
--- /dev/null
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3MockTestcontainersThreadFilter.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.solr.s3;
+
+import com.carrotsearch.randomizedtesting.ThreadFilter;
+
+/** Ignore known non-daemon threads spawned by Testcontainers/S3Mock in these 
tests. */
+public class S3MockTestcontainersThreadFilter implements ThreadFilter {
+  @Override
+  public boolean reject(Thread t) {
+    if (t == null || t.getName() == null) return false;
+    String n = t.getName();
+    return n.startsWith("testcontainers-ryuk")
+        || n.startsWith("testcontainers-wait-")
+        || n.startsWith("testcontainers-pull-watchdog")
+        || n.startsWith("ducttape-");
+  }
+}
diff --git 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3OutputStreamTest.java
 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3OutputStreamTest.java
index dd829b69d20..f887c55cd0f 100644
--- 
a/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3OutputStreamTest.java
+++ 
b/solr/modules/s3-repository/src/test/org/apache/solr/s3/S3OutputStreamTest.java
@@ -16,12 +16,14 @@
  */
 package org.apache.solr.s3;
 
-import com.adobe.testing.s3mock.junit4.S3MockRule;
+import com.carrotsearch.randomizedtesting.annotations.ThreadLeakFilters;
 import com.carrotsearch.randomizedtesting.generators.RandomStrings;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.time.Duration;
+import org.apache.lucene.tests.util.QuickPatchThreadsFilter;
+import org.apache.solr.SolrIgnoredThreadsFilter;
 import org.apache.solr.SolrTestCaseJ4;
 import org.junit.After;
 import org.junit.Before;
@@ -30,14 +32,17 @@ import org.junit.Test;
 import software.amazon.awssdk.core.sync.ResponseTransformer;
 import software.amazon.awssdk.services.s3.S3Client;
 
+@ThreadLeakFilters(
+    filters = {
+      SolrIgnoredThreadsFilter.class,
+      QuickPatchThreadsFilter.class,
+      S3MockTestcontainersThreadFilter.class
+    })
 public class S3OutputStreamTest extends SolrTestCaseJ4 {
 
   private static final String BUCKET = 
S3OutputStreamTest.class.getSimpleName();
 
-  @ClassRule
-  @SuppressWarnings("removal")
-  public static final S3MockRule S3_MOCK_RULE =
-      
S3MockRule.builder().silent().withInitialBuckets(BUCKET).withSecureConnection(false).build();
+  @ClassRule public static final S3MockContainerRule S3_MOCK_RULE = new 
S3MockContainerRule(BUCKET);
 
   private S3Client s3;
 

Reply via email to