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

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


The following commit(s) were added to refs/heads/main by this push:
     new 35c78a050017 CAMEL-24323: Fix MongoDB TLS test-infra cert copy for 
Testcontainers 2.x
35c78a050017 is described below

commit 35c78a050017c1697db83087554ae5d19d597504
Author: Omar Atie <[email protected]>
AuthorDate: Sun Aug 2 23:06:46 2026 -0700

    CAMEL-24323: Fix MongoDB TLS test-infra cert copy for Testcontainers 2.x
    
    Replace withClasspathResourceMapping directory mount with per-file
    withCopyFileToContainer calls in MongoDBLocalContainerTLSService, fixing
    MongoDbSslConnectionIT container startup failure on Testcontainers 2.x.
    
    Closes #25284
    
    Co-authored-by: Cursor <[email protected]>
---
 .../integration/MongoDbSslConnectionIT.java        | 23 +++++--
 .../services/MongoDBLocalContainerTLSService.java  | 21 +++++--
 .../MongoDBLocalContainerTLSServiceTest.java       | 72 ++++++++++++++++++++++
 3 files changed, 104 insertions(+), 12 deletions(-)

diff --git 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbSslConnectionIT.java
 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbSslConnectionIT.java
index f5e92f9a6fbc..cb31d5e4d300 100644
--- 
a/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbSslConnectionIT.java
+++ 
b/components/camel-mongodb/src/test/java/org/apache/camel/component/mongodb/integration/MongoDbSslConnectionIT.java
@@ -47,8 +47,8 @@ import org.junit.jupiter.api.TestInstance;
 import org.junit.jupiter.api.extension.RegisterExtension;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertInstanceOf;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 
 /**
  * Integration test that validates TLS connectivity to MongoDB using Camel's 
SSLContextParameters.
@@ -114,23 +114,34 @@ public class MongoDbSslConnectionIT implements 
ConfigurableContext, Configurable
     }
 
     @Test
-    public void testInsertOverTls() {
+    void testInsertOverTls() {
         ProducerTemplate template = contextExtension.getProducerTemplate();
 
         Document doc = new Document("scientist", "Einstein").append("tls", 
true);
         Object result = template.requestBody("direct:insert", doc);
         assertNotNull(result, "Insert result should not be null");
 
-        assertEquals(1L, testCollection.countDocuments(),
-                "Test collection should contain 1 document after insert");
+        assertEquals(1L, testCollection.countDocuments());
     }
 
     @Test
-    public void testCountOverTls() {
+    void testInsertAndCountOverTls() {
+        ProducerTemplate template = contextExtension.getProducerTemplate();
+
+        Document doc = new Document("scientist", "Curie").append("tls", true);
+        template.requestBody("direct:insert", doc);
+
+        Object count = template.requestBody("direct:count", "irrelevantBody");
+        assertInstanceOf(Long.class, count);
+        assertEquals(1L, count);
+    }
+
+    @Test
+    void testCountOverTls() {
         ProducerTemplate template = contextExtension.getProducerTemplate();
 
         Object result = template.requestBody("direct:count", "irrelevantBody");
-        assertTrue(result instanceof Long, "Count result should be of type 
Long");
+        assertInstanceOf(Long.class, result);
     }
 
     @AfterEach
diff --git 
a/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSService.java
 
b/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSService.java
index 3c1cfc759e73..d95794f37825 100644
--- 
a/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSService.java
+++ 
b/test-infra/camel-test-infra-mongodb/src/main/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSService.java
@@ -24,19 +24,23 @@ import 
org.apache.camel.test.infra.common.services.ContainerService;
 import org.apache.camel.test.infra.mongodb.common.MongoDBProperties;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testcontainers.containers.BindMode;
 import org.testcontainers.containers.GenericContainer;
 import org.testcontainers.containers.wait.strategy.Wait;
+import org.testcontainers.utility.MountableFile;
 
 /**
  * A TLS-enabled MongoDB container service using a standalone mongod with 
--tlsMode requireTLS. Uses pre-generated
- * self-signed certificates mounted from classpath resources.
+ * self-signed certificates copied from classpath resources (individual files, 
not a directory mount, for Testcontainers
+ * 2.x portability).
  */
 public class MongoDBLocalContainerTLSService implements MongoDBService, 
ContainerService<GenericContainer<?>> {
 
     private static final Logger LOG = 
LoggerFactory.getLogger(MongoDBLocalContainerTLSService.class);
     private static final int DEFAULT_MONGODB_PORT = 27017;
-    private static final String CERT_RESOURCE_PATH = 
"org/apache/camel/test/infra/mongodb/services/ssl";
+    static final String CERT_RESOURCE_PATH = 
"org/apache/camel/test/infra/mongodb/services/ssl";
+    static final String CONTAINER_SSL_DIR = "/etc/mongodb/ssl";
+    static final String SERVER_CERT_RESOURCE = CERT_RESOURCE_PATH + 
"/server.pem";
+    static final String CA_CERT_RESOURCE = CERT_RESOURCE_PATH + "/ca.pem";
 
     private final GenericContainer<?> container;
 
@@ -55,12 +59,17 @@ public class MongoDBLocalContainerTLSService implements 
MongoDBService, Containe
         boolean fixedPort = 
ContainerEnvironmentUtil.isFixedPort(this.getClass());
         ContainerEnvironmentUtil.configurePort(c, fixedPort, 
DEFAULT_MONGODB_PORT);
 
-        c.withClasspathResourceMapping(CERT_RESOURCE_PATH, "/etc/mongodb/ssl", 
BindMode.READ_ONLY)
+        c.withCopyFileToContainer(
+                MountableFile.forClasspathResource(SERVER_CERT_RESOURCE),
+                CONTAINER_SSL_DIR + "/server.pem")
+                .withCopyFileToContainer(
+                        MountableFile.forClasspathResource(CA_CERT_RESOURCE),
+                        CONTAINER_SSL_DIR + "/ca.pem")
                 .withCommand(
                         "mongod",
                         "--tlsMode", "requireTLS",
-                        "--tlsCertificateKeyFile", 
"/etc/mongodb/ssl/server.pem",
-                        "--tlsCAFile", "/etc/mongodb/ssl/ca.pem",
+                        "--tlsCertificateKeyFile", CONTAINER_SSL_DIR + 
"/server.pem",
+                        "--tlsCAFile", CONTAINER_SSL_DIR + "/ca.pem",
                         "--tlsAllowConnectionsWithoutCertificates",
                         "--bind_ip_all",
                         "--port", String.valueOf(DEFAULT_MONGODB_PORT))
diff --git 
a/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSServiceTest.java
 
b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSServiceTest.java
new file mode 100644
index 000000000000..41edeb5990ea
--- /dev/null
+++ 
b/test-infra/camel-test-infra-mongodb/src/test/java/org/apache/camel/test/infra/mongodb/services/MongoDBLocalContainerTLSServiceTest.java
@@ -0,0 +1,72 @@
+/*
+ * 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.camel.test.infra.mongodb.services;
+
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+
+import org.junit.jupiter.api.Test;
+import org.testcontainers.containers.GenericContainer;
+import org.testcontainers.utility.MountableFile;
+
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class MongoDBLocalContainerTLSServiceTest {
+
+    @Test
+    void tlsClasspathResourcesExist() {
+        ClassLoader loader = 
MongoDBLocalContainerTLSService.class.getClassLoader();
+
+        
assertNotNull(loader.getResource(MongoDBLocalContainerTLSService.SERVER_CERT_RESOURCE));
+        
assertNotNull(loader.getResource(MongoDBLocalContainerTLSService.CA_CERT_RESOURCE));
+        
assertNotNull(loader.getResource(MongoDBLocalContainerTLSService.CERT_RESOURCE_PATH
 + "/ca-truststore.jks"));
+    }
+
+    @Test
+    void mountableFilesResolveToNonEmptyTlsCertificates() throws Exception {
+        MountableFile serverCert = 
MountableFile.forClasspathResource(MongoDBLocalContainerTLSService.SERVER_CERT_RESOURCE);
+        MountableFile caCert = 
MountableFile.forClasspathResource(MongoDBLocalContainerTLSService.CA_CERT_RESOURCE);
+
+        Path serverPath = Path.of(serverCert.getFilesystemPath());
+        Path caPath = Path.of(caCert.getFilesystemPath());
+
+        assertTrue(Files.exists(serverPath));
+        assertTrue(Files.exists(caPath));
+        assertTrue(Files.size(serverPath) > 0);
+        assertTrue(Files.size(caPath) > 0);
+    }
+
+    @Test
+    void initContainerConfiguresIndividualCertCopyAndTlsCommand() {
+        MongoDBLocalContainerTLSService service = new 
MongoDBLocalContainerTLSService("mirror.gcr.io/mongo:7.0.31-jammy");
+        GenericContainer<?> container = service.getContainer();
+
+        String[] commandParts = container.getCommandParts();
+
+        assertTrue(Arrays.asList(commandParts).contains("--tlsMode"));
+        assertTrue(Arrays.asList(commandParts).contains("requireTLS"));
+        
assertTrue(Arrays.asList(commandParts).contains(MongoDBLocalContainerTLSService.CONTAINER_SSL_DIR
 + "/server.pem"));
+        
assertTrue(Arrays.asList(commandParts).contains(MongoDBLocalContainerTLSService.CONTAINER_SSL_DIR
 + "/ca.pem"));
+
+        // Directory classpath mapping breaks on Testcontainers 2.x copy 
strategy (CAMEL-24323).
+        assertDoesNotThrow(() -> 
MountableFile.forClasspathResource(MongoDBLocalContainerTLSService.SERVER_CERT_RESOURCE));
+        assertDoesNotThrow(() -> 
MountableFile.forClasspathResource(MongoDBLocalContainerTLSService.CA_CERT_RESOURCE));
+    }
+}

Reply via email to