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

twolf pushed a commit to branch dev_3.0
in repository https://gitbox.apache.org/repos/asf/mina-sshd.git

commit 528290b9a389b91102d4b81a347fdbf69b67b9ae
Author: Thomas Wolf <[email protected]>
AuthorDate: Sat Sep 20 16:31:33 2025 +0200

    sshd-test: fix multiple executions with testcontainers
    
    testcontainers removes test container images asynchronously when the
    test JVM shuts down. Subsequent executions may then get into a situation
    where they want to re-use an image that just gets removed, and then fail
    to start the container.
    
    Prevent that by ensuring that the first layer in each of these
    containers is different for each JVM run. This is a stop-gap measure;
    it has the disadvantage that we'll re-build the container for each
    execution. Maybe a better approach is to not let testcontainers reap the
    containers except in the last execution. (This would be possible through
    ImageFromDockerfile(String, boolean), but we'd have to give the
    containers static names, and somehow figure out how to set the flag to
    true in the last run, which could become complicated if we want it to
    figure out which profiles are active at all.)
    
    Interestingly this problem only cropped up with failsafe, but not with
    multiple executions of surefire.
---
 sshd-test/pom.xml                                  |  1 +
 .../org/apache/sshd/AbstractContainerTestBase.java | 51 ++++++++++++++++++++++
 .../client/auth/ClientOpenSSHCertificatesTest.java |  7 ++-
 .../sshd/client/auth/HostBoundPubKeyAuthTest.java  |  7 ++-
 .../forward/PortForwardingWithOpenSshTest.java     |  7 ++-
 .../apache/sshd/client/kex/OpenSshMlKemTest.java   |  7 ++-
 .../client/kex/StrictKexInteroperabilityTest.java  |  8 ++--
 .../client/proxy/ProxyHttpAuthIntegrationTest.java |  9 ++--
 .../client/proxy/ProxyHttpIntegrationTest.java     |  9 ++--
 .../proxy/ProxySocksAuthIntegrationTest.java       |  9 ++--
 .../client/proxy/ProxySocksIntegrationTest.java    |  9 ++--
 .../sshd/common/cipher/OpenSshCipherTest.java      |  9 ++--
 12 files changed, 88 insertions(+), 45 deletions(-)

diff --git a/sshd-test/pom.xml b/sshd-test/pom.xml
index 3ac83a5e1..cfbb2fd42 100644
--- a/sshd-test/pom.xml
+++ b/sshd-test/pom.xml
@@ -159,6 +159,7 @@
                         </configuration>
                         <executions>
                             <execution>
+                                <id>multirelease</id>
                                 <goals>
                                     <goal>integration-test</goal>
                                     <goal>verify</goal>
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/AbstractContainerTestBase.java 
b/sshd-test/src/test/java/org/apache/sshd/AbstractContainerTestBase.java
new file mode 100644
index 000000000..4475d256a
--- /dev/null
+++ b/sshd-test/src/test/java/org/apache/sshd/AbstractContainerTestBase.java
@@ -0,0 +1,51 @@
+/*
+ * 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.sshd;
+
+import java.time.Instant;
+
+import org.apache.sshd.util.test.BaseTestSupport;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+@Testcontainers(disabledWithoutDocker = true)
+public abstract class AbstractContainerTestBase extends BaseTestSupport {
+
+    // Running multiple executions of failsafe with testcontainers appears to 
run into a problem with
+    // containers from previous runs being cleaned up asynchronously while the 
next execution starts.
+    // The next execution then may try to use a parent image that just got 
removed by the cleanup of the
+    // previous execution.
+    //
+    // Symptom:
+    //
+    // org.testcontainers.containers.ContainerFetchException: Can't get Docker 
image: RemoteDockerImage...
+    // Caused by:
+    // com.github.dockerjava.api.exception.DockerClientException: Could not 
build image: NotFound: parent snapshot
+    // (SHA256) does not exist: not found
+    //
+    // Try to prevent that by deliberately including a layer that contains a 
random value.
+    private static final String DISCRIMINATOR = "tmp" + 
Instant.now().toEpochMilli();
+
+    protected AbstractContainerTestBase() {
+        super();
+    }
+
+    protected static String discriminate() {
+        return "touch /" + DISCRIMINATOR;
+    }
+}
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/auth/ClientOpenSSHCertificatesTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/auth/ClientOpenSSHCertificatesTest.java
index 11ab545ec..c984f9f0e 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/auth/ClientOpenSSHCertificatesTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/auth/ClientOpenSSHCertificatesTest.java
@@ -31,6 +31,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.config.keys.PublicKeyEntry;
@@ -39,7 +40,6 @@ import org.apache.sshd.common.keyprovider.KeyIdentityProvider;
 import org.apache.sshd.common.session.SessionContext;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.common.util.io.IoUtils;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.jupiter.api.BeforeAll;
@@ -52,11 +52,9 @@ import org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.junit.jupiter.Container;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
-@Testcontainers(disabledWithoutDocker = true)
-public class ClientOpenSSHCertificatesTest extends BaseTestSupport {
+public class ClientOpenSSHCertificatesTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ClientOpenSSHCertificatesTest.class);
 
@@ -88,6 +86,7 @@ public class ClientOpenSSHCertificatesTest extends 
BaseTestSupport {
     @Container
     static GenericContainer<?> sshdContainer = new GenericContainer<>(
             new ImageFromDockerfile().withDockerfileFromBuilder(builder -> 
builder.from("alpine:3.19") //
+                    .run(discriminate()) //
                     .run("apk --update add openssh openssh-server") // Install
                     .run("rm -rf /var/cache/apk/*") // Clear cache
                     .run("addgroup customusers") // Give our users a group
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/auth/HostBoundPubKeyAuthTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/auth/HostBoundPubKeyAuthTest.java
index 6c0f17010..afe73ab9a 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/auth/HostBoundPubKeyAuthTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/auth/HostBoundPubKeyAuthTest.java
@@ -26,13 +26,13 @@ import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.config.DefaultNewHostKeysHandler;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.config.keys.PublicKeyEntry;
 import org.apache.sshd.common.kex.extension.DefaultClientKexExtensionHandler;
 import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -43,11 +43,9 @@ import org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.junit.jupiter.Container;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
-@Testcontainers(disabledWithoutDocker = true)
-public class HostBoundPubKeyAuthTest extends BaseTestSupport {
+public class HostBoundPubKeyAuthTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(HostBoundPubKeyAuthTest.class);
 
@@ -62,6 +60,7 @@ public class HostBoundPubKeyAuthTest extends BaseTestSupport {
     @Container
     static GenericContainer<?> sshdContainer = new GenericContainer<>(
             new ImageFromDockerfile().withDockerfileFromBuilder(builder -> 
builder.from("alpine:3.16")
+                    .run(discriminate()) //
                     .run("apk --update add openssh-server") // Installs 
OpenSSH 9.0
                     .run("ssh-keygen -A") // Generate multiple host keys
                     .run("adduser -D bob") // Add a user
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/forward/PortForwardingWithOpenSshTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/forward/PortForwardingWithOpenSshTest.java
index 04cd6d3e3..5623ef665 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/forward/PortForwardingWithOpenSshTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/forward/PortForwardingWithOpenSshTest.java
@@ -32,6 +32,7 @@ import java.util.concurrent.CountDownLatch;
 
 import io.grpc.Server;
 import io.grpc.ServerBuilder;
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.common.forward.DefaultForwarder;
 import org.apache.sshd.common.forward.DefaultForwarderFactory;
 import org.apache.sshd.common.forward.Forwarder;
@@ -42,7 +43,6 @@ import org.apache.sshd.server.channel.ChannelSessionFactory;
 import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
 import org.apache.sshd.server.forward.DirectTcpipFactory;
 import org.apache.sshd.server.forward.ForwardedTcpipFactory;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CoreTestSupportUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -55,7 +55,6 @@ import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
 /**
@@ -78,8 +77,7 @@ import org.testcontainers.utility.MountableFile;
  * @see <a href="https://issues.apache.org/jira/browse/SSHD-1055";>SSHD-1055</a>
  * @see <a href="https://issues.apache.org/jira/browse/SSHD-1269";>SSHD-1269</a>
  */
-@Testcontainers(disabledWithoutDocker = true)
-class PortForwardingWithOpenSshTest extends BaseTestSupport {
+class PortForwardingWithOpenSshTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(PortForwardingWithOpenSshTest.class);
 
@@ -177,6 +175,7 @@ class PortForwardingWithOpenSshTest extends BaseTestSupport 
{
         @SuppressWarnings("resource")
         GenericContainer<?> sshdContainer = new GenericContainer<>(
                 new ImageFromDockerfile().withDockerfileFromBuilder(builder -> 
builder.from("alpine:3.16") //
+                        .run(discriminate()) //
                         .run("apk --update add openssh openssh-server") // 
Installs OpenSSH 9.0
                         .run("mkdir -p /root/.ssh") // Create the SSH config 
directory
                         .entryPoint("/entrypoint.sh") //
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/kex/OpenSshMlKemTest.java 
b/sshd-test/src/test/java/org/apache/sshd/client/kex/OpenSshMlKemTest.java
index ccb459316..f9a715cd8 100644
--- a/sshd-test/src/test/java/org/apache/sshd/client/kex/OpenSshMlKemTest.java
+++ b/sshd-test/src/test/java/org/apache/sshd/client/kex/OpenSshMlKemTest.java
@@ -21,13 +21,13 @@ package org.apache.sshd.client.kex;
 import java.security.Security;
 import java.util.Collections;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.ClientBuilder;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.future.AuthFuture;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.kex.BuiltinDHFactories;
 import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.jupiter.api.Assumptions;
@@ -40,7 +40,6 @@ import org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.junit.jupiter.Container;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
 /**
@@ -48,8 +47,7 @@ import org.testcontainers.utility.MountableFile;
  *
  * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
  */
-@Testcontainers(disabledWithoutDocker = true)
-class OpenSshMlKemTest extends BaseTestSupport {
+class OpenSshMlKemTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(OpenSshMlKemTest.class);
 
@@ -60,6 +58,7 @@ class OpenSshMlKemTest extends BaseTestSupport {
     @Container
     static GenericContainer<?> sshdContainer = new GenericContainer<>(new 
ImageFromDockerfile()
             .withDockerfileFromBuilder(builder -> builder.from("alpine:3.21") 
//
+                    .run(discriminate()) //
                     .run("apk --update add openssh-server") // Installs 
OpenSSH 9.9
                     .run("ssh-keygen -A") // Generate multiple host keys
                     .run("adduser -D bob") // Add a user
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/kex/StrictKexInteroperabilityTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/kex/StrictKexInteroperabilityTest.java
index 8c7136238..f101fef03 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/kex/StrictKexInteroperabilityTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/kex/StrictKexInteroperabilityTest.java
@@ -23,6 +23,7 @@ import java.io.PipedInputStream;
 import java.io.PipedOutputStream;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.ClientFactoryManager;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.channel.ChannelShell;
@@ -32,7 +33,6 @@ import org.apache.sshd.client.session.SessionFactory;
 import org.apache.sshd.common.channel.StreamingChannel;
 import org.apache.sshd.common.io.IoSession;
 import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
@@ -44,7 +44,6 @@ import org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.images.builder.dockerfile.DockerfileBuilder;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
 /**
@@ -55,8 +54,7 @@ import org.testcontainers.utility.MountableFile;
  * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
  * @see    <A HREF="https://github.com/apache/mina-sshd/issues/445";>Terrapin 
Mitigation: &quot;strict-kex&quot;</A>
  */
-@Testcontainers(disabledWithoutDocker = true)
-class StrictKexInteroperabilityTest extends BaseTestSupport {
+class StrictKexInteroperabilityTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(StrictKexInteroperabilityTest.class);
 
@@ -88,6 +86,7 @@ class StrictKexInteroperabilityTest extends BaseTestSupport {
         if (!withStrictKex) {
             return builder
                     .from("alpine:3.9.2") //
+                    .run(discriminate()) //
                     .run("apk --update add openssh-server") // Installs 
OpenSSH 7.9_p1-r6
                     .run("echo 'PrintMotd no' >> /etc/ssh/sshd_config") //
                     .run("ssh-keygen -A") // Generate multiple host keys
@@ -96,6 +95,7 @@ class StrictKexInteroperabilityTest extends BaseTestSupport {
         } else {
             return builder
                     .from("alpine:3.19") //
+                    .run(discriminate()) //
                     .run("apk --update add openssh-server") // Installs 
OpenSSH 9.6
                     .run("ssh-keygen -A") // Generate multiple host keys
                     .run("adduser -D bob") // Add a user
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpAuthIntegrationTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpAuthIntegrationTest.java
index 674b94fad..b7b815d66 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpAuthIntegrationTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpAuthIntegrationTest.java
@@ -27,6 +27,7 @@ import java.net.Proxy;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.future.AuthFuture;
@@ -34,7 +35,6 @@ import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.SshServer;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommandExecutionHelper;
 import org.apache.sshd.util.test.CoreTestSupportUtils;
 import org.junit.jupiter.api.AfterAll;
@@ -42,16 +42,15 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testcontainers.Testcontainers;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
 /**
  * Test client connection through tinyproxy (HTTP CONNECT), requiring 
authentication.
  */
-@Testcontainers(disabledWithoutDocker = true)
-class ProxyHttpAuthIntegrationTest extends BaseTestSupport {
+class ProxyHttpAuthIntegrationTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ProxyHttpAuthIntegrationTest.class);
 
@@ -78,7 +77,7 @@ class ProxyHttpAuthIntegrationTest extends BaseTestSupport {
             }
         });
         server.start();
-        org.testcontainers.Testcontainers.exposeHostPorts(server.getPort());
+        Testcontainers.exposeHostPorts(server.getPort());
         proxy.start();
     }
 
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpIntegrationTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpIntegrationTest.java
index 6e6287808..399ca7a55 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpIntegrationTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxyHttpIntegrationTest.java
@@ -25,10 +25,10 @@ import java.net.InetSocketAddress;
 import java.net.Proxy;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.server.SshServer;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommandExecutionHelper;
 import org.apache.sshd.util.test.CoreTestSupportUtils;
 import org.junit.jupiter.api.AfterAll;
@@ -36,16 +36,15 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testcontainers.Testcontainers;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
 /**
  * Test client connection through tinyproxy (HTTP CONNECT), anonymous.
  */
-@Testcontainers(disabledWithoutDocker = true)
-class ProxyHttpIntegrationTest extends BaseTestSupport {
+class ProxyHttpIntegrationTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ProxyHttpIntegrationTest.class);
 
@@ -72,7 +71,7 @@ class ProxyHttpIntegrationTest extends BaseTestSupport {
             }
         });
         server.start();
-        org.testcontainers.Testcontainers.exposeHostPorts(server.getPort());
+        Testcontainers.exposeHostPorts(server.getPort());
         proxy.start();
     }
 
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksAuthIntegrationTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksAuthIntegrationTest.java
index 2ea139340..c2e72aa91 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksAuthIntegrationTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksAuthIntegrationTest.java
@@ -27,6 +27,7 @@ import java.net.Proxy;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.auth.keyboard.UserInteraction;
 import org.apache.sshd.client.future.AuthFuture;
@@ -34,7 +35,6 @@ import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.SshException;
 import org.apache.sshd.common.util.GenericUtils;
 import org.apache.sshd.server.SshServer;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommandExecutionHelper;
 import org.apache.sshd.util.test.CoreTestSupportUtils;
 import org.junit.jupiter.api.AfterAll;
@@ -42,15 +42,14 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testcontainers.Testcontainers;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.junit.jupiter.Testcontainers;
 
 /**
  * Test client connection through a SOCKS proxy requiring authentication.
  */
-@Testcontainers(disabledWithoutDocker = true)
-class ProxySocksAuthIntegrationTest extends BaseTestSupport {
+class ProxySocksAuthIntegrationTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ProxySocksAuthIntegrationTest.class);
 
@@ -77,7 +76,7 @@ class ProxySocksAuthIntegrationTest extends BaseTestSupport {
             }
         });
         server.start();
-        org.testcontainers.Testcontainers.exposeHostPorts(server.getPort());
+        Testcontainers.exposeHostPorts(server.getPort());
         proxy.start();
     }
 
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksIntegrationTest.java
 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksIntegrationTest.java
index ab0b71093..a7f9f5542 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksIntegrationTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/client/proxy/ProxySocksIntegrationTest.java
@@ -25,10 +25,10 @@ import java.net.InetSocketAddress;
 import java.net.Proxy;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.server.SshServer;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommandExecutionHelper;
 import org.apache.sshd.util.test.CoreTestSupportUtils;
 import org.junit.jupiter.api.AfterAll;
@@ -36,15 +36,14 @@ import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.testcontainers.Testcontainers;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.output.Slf4jLogConsumer;
-import org.testcontainers.junit.jupiter.Testcontainers;
 
 /**
  * Test client connection through an anonymous SOCKS proxy.
  */
-@Testcontainers(disabledWithoutDocker = true)
-class ProxySocksIntegrationTest extends BaseTestSupport {
+class ProxySocksIntegrationTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(ProxySocksIntegrationTest.class);
 
@@ -69,7 +68,7 @@ class ProxySocksIntegrationTest extends BaseTestSupport {
             }
         });
         server.start();
-        org.testcontainers.Testcontainers.exposeHostPorts(server.getPort());
+        Testcontainers.exposeHostPorts(server.getPort());
         proxy.start();
     }
 
diff --git 
a/sshd-test/src/test/java/org/apache/sshd/common/cipher/OpenSshCipherTest.java 
b/sshd-test/src/test/java/org/apache/sshd/common/cipher/OpenSshCipherTest.java
index 98b023e0e..67c67542d 100644
--- 
a/sshd-test/src/test/java/org/apache/sshd/common/cipher/OpenSshCipherTest.java
+++ 
b/sshd-test/src/test/java/org/apache/sshd/common/cipher/OpenSshCipherTest.java
@@ -23,12 +23,12 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import org.apache.sshd.AbstractContainerTestBase;
 import org.apache.sshd.client.SshClient;
 import org.apache.sshd.client.future.AuthFuture;
 import org.apache.sshd.client.session.ClientSession;
 import org.apache.sshd.common.keyprovider.FileKeyPairProvider;
 import org.apache.sshd.common.util.security.SecurityUtils;
-import org.apache.sshd.util.test.BaseTestSupport;
 import org.apache.sshd.util.test.CommonTestSupportUtils;
 import org.bouncycastle.jce.provider.BouncyCastleProvider;
 import org.junit.jupiter.api.AfterEach;
@@ -41,16 +41,14 @@ import 
org.testcontainers.containers.output.Slf4jLogConsumer;
 import org.testcontainers.containers.wait.strategy.Wait;
 import org.testcontainers.images.builder.ImageFromDockerfile;
 import org.testcontainers.junit.jupiter.Container;
-import org.testcontainers.junit.jupiter.Testcontainers;
 import org.testcontainers.utility.MountableFile;
 
 /**
- * Test ciphers against OpenSSH. Force resetting ciphers every time to verify 
that they are res-initialized correctly.
+ * Test ciphers against OpenSSH. Force resetting ciphers every time to verify 
that they are re-initialized correctly.
  *
  * @author <a href="mailto:[email protected]";>Apache MINA SSHD Project</a>
  */
-@Testcontainers(disabledWithoutDocker = true)
-class OpenSshCipherTest extends BaseTestSupport {
+class OpenSshCipherTest extends AbstractContainerTestBase {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(OpenSshCipherTest.class);
 
@@ -61,6 +59,7 @@ class OpenSshCipherTest extends BaseTestSupport {
     @Container
     static GenericContainer<?> sshdContainer = new GenericContainer<>(new 
ImageFromDockerfile()
             .withDockerfileFromBuilder(builder -> builder.from("alpine:3.19") 
//
+                    .run(discriminate()) //
                     .run("apk --update add openssh-server") // Installs OpenSSH
                     // Enable deprecated ciphers
                     .run("echo 'Ciphers 
+aes128-cbc,aes192-cbc,aes256-cbc,3des-cbc' >> /etc/ssh/sshd_config")

Reply via email to