Skip to content

feat: Use test containers for SFTP/Mina-sftp tests and remove certs from repo#8683

Merged
jamesnetherton merged 1 commit into
apache:mainfrom
gansheer:feat/8534-use-testcontainers
Jun 1, 2026
Merged

feat: Use test containers for SFTP/Mina-sftp tests and remove certs from repo#8683
jamesnetherton merged 1 commit into
apache:mainfrom
gansheer:feat/8534-use-testcontainers

Conversation

@gansheer

@gansheer gansheer commented May 21, 2026

Copy link
Copy Markdown
Contributor

Ref #8534
Ref #2212

Follow-up from #8629

  • Use dynamically generated certs instead of repo files
  • Use openssh-server container image instead of sshd-server (I found some limitations on certificates verification)
  • Added RSA certificate tests to mina-sftp
  • Remove net.i2p.crypto.eddsa in ssh in favor of BouncyCastle for EdDSA following Apache SSHD (https://issues.apache.org/jira/browse/SSHD-985)

@gansheer

Copy link
Copy Markdown
Contributor Author

Fixes #8700.

@gansheer gansheer force-pushed the feat/8534-use-testcontainers branch 3 times, most recently from 349d48f to ec433a2 Compare May 28, 2026 08:20
@gansheer gansheer marked this pull request as ready for review May 28, 2026 09:19
@gansheer gansheer requested a review from apupier May 28, 2026 09:19
@gansheer gansheer force-pushed the feat/8534-use-testcontainers branch from ec433a2 to bb33328 Compare May 28, 2026 09:24

@apupier apupier left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

locally I have errors:

[ERROR] �[1;31m  SftpHostCertTest.testHostCertificateVerification:49 1 expectation failed.
Expected status code <201> but was <500>.
�[m
[ERROR] �[1;31m  SftpHostCertTest.testHostCertificateVerificationWithCaSignatureAlgorithms:70 1 expectation failed.
Expected status code <201> but was <500>.
[ERROR] �[1;31mTests �[0;1mrun: �[0;1m2�[m, �[1;31mFailures: �[0;1;31m2�[m, Errors: 0, Skipped: 0, Time elapsed: 6.848 s�[1;31m <<< FAILURE!�[m -- in org.apache.camel.quarkus.component.sftp.it.�[1mSftpHostCertTest�[m
[ERROR] org.apache.camel.quarkus.component.sftp.it.SftpHostCertTest.testHostCertificateVerification -- Time elapsed: 2.139 s <<< FAILURE!
java.lang.AssertionError: 
1 expectation failed.
Expected status code <201> but was <500>.

	at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:516)
	at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:714)
	at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:139)
	at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:147)
	at io.restassured.internal.ValidatableResponseOptionsImpl.statusCode(ValidatableResponseOptionsImpl.java:89)
	at org.apache.camel.quarkus.component.sftp.it.SftpHostCertTest.testHostCertificateVerification(SftpHostCertTest.java:49)
	Suppressed: org.jboss.resteasy.spi.UnhandledException: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[]
		at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:107)
		at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:344)
		at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:210)
		at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:457)
		at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invokePropagateNotFound$0(SynchronousDispatcher.java:280)
		at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:159)
		at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
		at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:162)
		at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:265)
		at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:86)
		at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:151)
		at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:97)
		at io.quarkus.vertx.core.runtime.VertxCoreRecorder$15.runWith(VertxCoreRecorder.java:677)
		at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
		at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
		at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
		at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
		at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
		at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
		at java.base/java.lang.Thread.run(Thread.java:1583)
	Caused by: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[]
		at org.apache.camel.CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:45)
		at org.apache.camel.support.ExchangeHelper.extractResultBody(ExchangeHelper.java:701)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:594)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:590)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:220)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:212)
		at org.apache.camel.quarkus.component.sftp.it.SftpResource.createFileWithHostCertVerification(SftpResource.java:222)
		at org.apache.camel.quarkus.component.sftp.it.SftpResource_ClientProxy.createFileWithHostCertVerification(Unknown Source)
		at java.base/java.lang.reflect.Method.invoke(Method.java:580)
		at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
		at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
		at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
		at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:413)
		at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
		at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:434)
		... 17 more
	Caused by: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://admin@localhost:41237
		at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:146)
		at org.apache.camel.component.file.remote.RemoteFileProducer.connectIfNecessary(RemoteFileProducer.java:209)
		at org.apache.camel.component.file.remote.RemoteFileProducer.doPreWriteCheck(RemoteFileProducer.java:141)
		at org.apache.camel.component.file.remote.RemoteFileProducer.preWriteCheck(RemoteFileProducer.java:112)
		at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:126)
		at org.apache.camel.component.file.remote.RemoteFileProducer.doProcess(RemoteFileProducer.java:65)
		at org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:66)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor.processNonTransacted(SharedCamelInternalProcessor.java:156)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:133)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:89)
		at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:81)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:86)
		at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:180)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:175)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:171)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:152)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:218)
		... 32 more
	Caused by: com.jcraft.jsch.JSchChangedHostKeyException: HostKey has been changed: [localhost]:41237
		at com.jcraft.jsch.Session.doCheckHostKey(Session.java:1071)
		at com.jcraft.jsch.Session.checkHost(Session.java:1018)
		at com.jcraft.jsch.Session.connect(Session.java:370)
		at org.apache.camel.component.file.remote.SftpOperations.tryConnect(SftpOperations.java:172)
		at org.apache.camel.support.task.BlockingTask.lambda$run$0(BlockingTask.java:45)
		at org.apache.camel.support.task.ForegroundTask.doRun(ForegroundTask.java:143)
		at org.apache.camel.support.task.ForegroundTask.run(ForegroundTask.java:108)
		at org.apache.camel.support.task.BlockingTask.run(BlockingTask.java:45)
		at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:144)
		... 48 more

[ERROR] org.apache.camel.quarkus.component.sftp.it.SftpHostCertTest.testHostCertificateVerificationWithCaSignatureAlgorithms -- Time elapsed: 2.062 s <<< FAILURE!
java.lang.AssertionError: 
1 expectation failed.
Expected status code <201> but was <500>.

	at io.restassured.internal.ResponseSpecificationImpl$HamcrestAssertionClosure.validate(ResponseSpecificationImpl.groovy:516)
	at io.restassured.internal.ResponseSpecificationImpl.validateResponseIfRequired(ResponseSpecificationImpl.groovy:714)
	at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:139)
	at io.restassured.internal.ResponseSpecificationImpl.statusCode(ResponseSpecificationImpl.groovy:147)
	at io.restassured.internal.ValidatableResponseOptionsImpl.statusCode(ValidatableResponseOptionsImpl.java:89)
	at org.apache.camel.quarkus.component.sftp.it.SftpHostCertTest.testHostCertificateVerificationWithCaSignatureAlgorithms(SftpHostCertTest.java:70)
	Suppressed: org.jboss.resteasy.spi.UnhandledException: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[]
		at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:107)
		at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:344)
		at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:210)
		at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:457)
		at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invokePropagateNotFound$0(SynchronousDispatcher.java:280)
		at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:159)
		at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
		at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:162)
		at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:265)
		at io.quarkus.resteasy.runtime.standalone.RequestDispatcher.service(RequestDispatcher.java:86)
		at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler.dispatch(VertxRequestHandler.java:151)
		at io.quarkus.resteasy.runtime.standalone.VertxRequestHandler$1.run(VertxRequestHandler.java:97)
		at io.quarkus.vertx.core.runtime.VertxCoreRecorder$15.runWith(VertxCoreRecorder.java:677)
		at org.jboss.threads.EnhancedQueueExecutor$Task.doRunWith(EnhancedQueueExecutor.java:2651)
		at org.jboss.threads.EnhancedQueueExecutor$Task.run(EnhancedQueueExecutor.java:2630)
		at org.jboss.threads.EnhancedQueueExecutor.runThreadBody(EnhancedQueueExecutor.java:1622)
		at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1589)
		at org.jboss.threads.DelegatingRunnable.run(DelegatingRunnable.java:11)
		at org.jboss.threads.ThreadLocalResettingRunnable.run(ThreadLocalResettingRunnable.java:11)
		at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
		at java.base/java.lang.Thread.run(Thread.java:1583)
	Caused by: org.apache.camel.CamelExecutionException: Exception occurred during execution on the exchange: Exchange[]
		at org.apache.camel.CamelExecutionException.wrapCamelExecutionException(CamelExecutionException.java:45)
		at org.apache.camel.support.ExchangeHelper.extractResultBody(ExchangeHelper.java:701)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:594)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.extractResultBody(DefaultProducerTemplate.java:590)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:220)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:212)
		at org.apache.camel.quarkus.component.sftp.it.SftpResource.createFileWithHostCertAndAlgorithms(SftpResource.java:258)
		at org.apache.camel.quarkus.component.sftp.it.SftpResource_ClientProxy.createFileWithHostCertAndAlgorithms(Unknown Source)
		at java.base/java.lang.reflect.Method.invoke(Method.java:580)
		at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:154)
		at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:118)
		at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:560)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:452)
		at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:413)
		at org.jboss.resteasy.core.interception.jaxrs.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:321)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:415)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:378)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:356)
		at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:70)
		at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:434)
		... 17 more
	Caused by: org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://admin@localhost:41237
		at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:146)
		at org.apache.camel.component.file.remote.RemoteFileProducer.connectIfNecessary(RemoteFileProducer.java:209)
		at org.apache.camel.component.file.remote.RemoteFileProducer.doPreWriteCheck(RemoteFileProducer.java:141)
		at org.apache.camel.component.file.remote.RemoteFileProducer.preWriteCheck(RemoteFileProducer.java:112)
		at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:126)
		at org.apache.camel.component.file.remote.RemoteFileProducer.doProcess(RemoteFileProducer.java:65)
		at org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:66)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor.processNonTransacted(SharedCamelInternalProcessor.java:156)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:133)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor$1.process(SharedCamelInternalProcessor.java:89)
		at org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager.process(DefaultAsyncProcessorAwaitManager.java:81)
		at org.apache.camel.impl.engine.SharedCamelInternalProcessor.process(SharedCamelInternalProcessor.java:86)
		at org.apache.camel.support.cache.DefaultProducerCache.send(DefaultProducerCache.java:180)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:175)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:171)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.send(DefaultProducerTemplate.java:152)
		at org.apache.camel.impl.engine.DefaultProducerTemplate.sendBodyAndHeader(DefaultProducerTemplate.java:218)
		... 32 more
	Caused by: com.jcraft.jsch.JSchChangedHostKeyException: HostKey has been changed: [localhost]:41237
		at com.jcraft.jsch.Session.doCheckHostKey(Session.java:1071)
		at com.jcraft.jsch.Session.checkHost(Session.java:1018)
		at com.jcraft.jsch.Session.connect(Session.java:370)
		at org.apache.camel.component.file.remote.SftpOperations.tryConnect(SftpOperations.java:172)
		at org.apache.camel.support.task.BlockingTask.lambda$run$0(BlockingTask.java:45)
		at org.apache.camel.support.task.ForegroundTask.doRun(ForegroundTask.java:143)
		at org.apache.camel.support.task.ForegroundTask.run(ForegroundTask.java:108)
		at org.apache.camel.support.task.BlockingTask.run(BlockingTask.java:45)
		at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:144)
		... 48 more

…rom the repo

* remove cert files and use testcontainers

* Add RSA certificate test to mina-sftp

* ssh remove net.i2p.crypto eddsa support
@gansheer gansheer force-pushed the feat/8534-use-testcontainers branch from bb33328 to 9572e22 Compare May 28, 2026 15:36
@gansheer gansheer requested a review from apupier May 29, 2026 09:04
@jamesnetherton

Copy link
Copy Markdown
Contributor

Fixes #8700.

@gansheer Have you verified it locally by running the test from the Quarkus Platform project?

@gansheer

gansheer commented Jun 1, 2026

Copy link
Copy Markdown
Contributor Author

Fixes #8700.

@gansheer Have you verified it locally by running the test from the Quarkus Platform project?

Yes, I ran successfully the tests on jvm and native for the 3 modules (ftp, mina-sftp and ssh).

@jamesnetherton jamesnetherton merged commit c4835a5 into apache:main Jun 1, 2026
24 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants