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

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


The following commit(s) were added to refs/heads/main by this push:
     new 57da99def4 Add test coverage for virtual thread support
57da99def4 is described below

commit 57da99def42612c9048807fdd04c135f8e476aac
Author: James Netherton <[email protected]>
AuthorDate: Tue May 12 09:52:34 2026 +0100

    Add test coverage for virtual thread support
    
    Fixes #8525
---
 .../quarkus/core/deployment/CamelProcessor.java    | 10 +++++++
 .../core/graal/ThreadTypeSubstitutions.java        | 32 +++++++++-------------
 .../quarkus/component/seda/it/SedaResource.java    |  2 +-
 .../quarkus/component/seda/it/SedaRoutes.java}     | 31 ++++++++++-----------
 .../seda/src/main/resources/application.properties | 17 ++++++++++++
 .../camel/quarkus/component/seda/it/SedaTest.java  | 14 ++++++++++
 .../{SedaTest.java => SedaVirtualThreadsIT.java}   | 24 ++++++----------
 .../{SedaTest.java => SedaVirtualThreadsTest.java} | 30 +++++++++++++++-----
 8 files changed, 101 insertions(+), 59 deletions(-)

diff --git 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
index 941b4d092f..3d1b78660f 100644
--- 
a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
+++ 
b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
@@ -42,6 +42,7 @@ import io.quarkus.deployment.annotations.Overridable;
 import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
 import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.SystemPropertyBuildItem;
 import 
io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
 import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
 import io.quarkus.deployment.pkg.steps.NativeOrNativeSourcesBuild;
@@ -77,6 +78,7 @@ import 
org.apache.camel.quarkus.core.deployment.util.PathFilter;
 import org.apache.camel.quarkus.core.util.FileUtils;
 import org.apache.camel.spi.TypeConverterLoader;
 import org.apache.camel.spi.TypeConverterRegistry;
+import org.eclipse.microprofile.config.ConfigProvider;
 import org.jboss.jandex.AnnotationTarget;
 import org.jboss.jandex.ClassInfo;
 import org.jboss.jandex.DotName;
@@ -509,6 +511,14 @@ class CamelProcessor {
         return new 
CamelModelReifierFactoryBuildItem(recorder.modelReifierFactory());
     }
 
+    @BuildStep
+    public SystemPropertyBuildItem camelVirtualThreadSupportSystemProperty() {
+        // Need to set camel.threads.virtual.enabled early as possible as the 
CamelContext is constructed during static init phase
+        return new SystemPropertyBuildItem("camel.threads.virtual.enabled", 
ConfigProvider.getConfig()
+                .getOptionalValue("camel.main.virtualThreadsEnabled", 
String.class)
+                .orElse("false"));
+    }
+
     /**
      * Useful for identifying Camel services that are potentially not covered 
by inclusion patterns
      */
diff --git 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/graal/ThreadTypeSubstitutions.java
similarity index 58%
copy from 
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to 
extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/graal/ThreadTypeSubstitutions.java
index 9f4904b685..80d586c814 100644
--- 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++ 
b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/graal/ThreadTypeSubstitutions.java
@@ -14,25 +14,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.seda.it;
+package org.apache.camel.quarkus.core.graal;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
-
-import static org.hamcrest.Matchers.equalTo;
-
-@QuarkusTest
-class SedaTest {
-
-    @Test
-    public void seda() {
-        RestAssured.given()
-                .contentType(ContentType.TEXT).body("Hello 
World").post("/seda/foo")
-                .then().statusCode(201);
-
-        RestAssured.get("/seda/foo").then().body(equalTo("Hello 
World")).statusCode(200);
-    }
+import com.oracle.svm.core.annotate.Alias;
+import com.oracle.svm.core.annotate.RecomputeFieldValue;
+import com.oracle.svm.core.annotate.TargetClass;
+import org.apache.camel.util.concurrent.ThreadType;
 
+/**
+ * Prevent Camel virtual thread configuration being set permanently fixed 
value in the native application
+ */
+@TargetClass(ThreadType.class)
+final class ThreadTypeSubstitutions {
+    @Alias
+    @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias)
+    private static volatile ThreadType current = null;
 }
diff --git 
a/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
 
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
index 4e9570d803..6850ce8612 100644
--- 
a/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
+++ 
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaResource.java
@@ -48,7 +48,7 @@ public class SedaResource {
     @GET
     @Produces(MediaType.TEXT_PLAIN)
     public String get(@PathParam("name") String name) throws Exception {
-        final String message = consumerTemplate.receiveBodyNoWait("seda:" + 
name, String.class);
+        final String message = consumerTemplate.receiveBody("seda:" + name, 
5000, String.class);
         LOG.infof("Received from seda: %s", message);
         return message;
     }
diff --git 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
 
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaRoutes.java
similarity index 56%
copy from 
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to 
integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaRoutes.java
index 9f4904b685..b8f14cb691 100644
--- 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++ 
b/integration-test-groups/foundation/seda/src/main/java/org/apache/camel/quarkus/component/seda/it/SedaRoutes.java
@@ -16,23 +16,20 @@
  */
 package org.apache.camel.quarkus.component.seda.it;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
-import org.junit.jupiter.api.Test;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.builder.RouteBuilder;
 
-import static org.hamcrest.Matchers.equalTo;
-
-@QuarkusTest
-class SedaTest {
-
-    @Test
-    public void seda() {
-        RestAssured.given()
-                .contentType(ContentType.TEXT).body("Hello 
World").post("/seda/foo")
-                .then().statusCode(201);
-
-        RestAssured.get("/seda/foo").then().body(equalTo("Hello 
World")).statusCode(200);
+public class SedaRoutes extends RouteBuilder {
+    @Override
+    public void configure() throws Exception {
+        from("seda:virtualThreaded")
+                .process(new Processor() {
+                    public void process(Exchange exchange) throws Exception {
+                        // Avoid Thread.isVirtual to maintain JDK 17 
compatibility
+                        
exchange.getMessage().setBody(Thread.currentThread().getClass().getName());
+                    }
+                })
+                .to("seda:virtualThreadedResults");
     }
-
 }
diff --git 
a/integration-test-groups/foundation/seda/src/main/resources/application.properties
 
b/integration-test-groups/foundation/seda/src/main/resources/application.properties
new file mode 100644
index 0000000000..ecf18b08b7
--- /dev/null
+++ 
b/integration-test-groups/foundation/seda/src/main/resources/application.properties
@@ -0,0 +1,17 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+%virtualThreads.camel.main.virtualThreadsEnabled=true
\ No newline at end of file
diff --git 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
 
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
index 9f4904b685..5e1df50b97 100644
--- 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++ 
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
@@ -22,6 +22,7 @@ import io.restassured.http.ContentType;
 import org.junit.jupiter.api.Test;
 
 import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
 
 @QuarkusTest
 class SedaTest {
@@ -35,4 +36,17 @@ class SedaTest {
         RestAssured.get("/seda/foo").then().body(equalTo("Hello 
World")).statusCode(200);
     }
 
+    @Test
+    void virtualThreadsDisabled() {
+        RestAssured.given()
+                .contentType(ContentType.TEXT)
+                .post("/seda/virtualThreaded")
+                .then()
+                .statusCode(201);
+
+        RestAssured.get("/seda/virtualThreadedResults")
+                .then()
+                .body(is(Thread.class.getName()))
+                .statusCode(200);
+    }
 }
diff --git 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
 
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsIT.java
similarity index 66%
copy from 
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to 
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsIT.java
index 9f4904b685..7920405eab 100644
--- 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++ 
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsIT.java
@@ -16,23 +16,17 @@
  */
 package org.apache.camel.quarkus.component.seda.it;
 
-import io.quarkus.test.junit.QuarkusTest;
-import io.restassured.RestAssured;
-import io.restassured.http.ContentType;
+import io.quarkus.test.junit.QuarkusIntegrationTest;
 import org.junit.jupiter.api.Test;
 
-import static org.hamcrest.Matchers.equalTo;
-
-@QuarkusTest
-class SedaTest {
-
+@QuarkusIntegrationTest
+class SedaVirtualThreadsIT extends SedaVirtualThreadsTest {
+    /**
+     * Overridden to remove JDK version restrictions as the JDK used in native 
mode should be >= 25
+     */
+    @Override
     @Test
-    public void seda() {
-        RestAssured.given()
-                .contentType(ContentType.TEXT).body("Hello 
World").post("/seda/foo")
-                .then().statusCode(201);
-
-        RestAssured.get("/seda/foo").then().body(equalTo("Hello 
World")).statusCode(200);
+    void sedaExecutesOnVirtualThread() {
+        super.sedaExecutesOnVirtualThread();
     }
-
 }
diff --git 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
 
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsTest.java
similarity index 52%
copy from 
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
copy to 
integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsTest.java
index 9f4904b685..5a575f8e3c 100644
--- 
a/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaTest.java
+++ 
b/integration-test-groups/foundation/seda/src/test/java/org/apache/camel/quarkus/component/seda/it/SedaVirtualThreadsTest.java
@@ -17,22 +17,38 @@
 package org.apache.camel.quarkus.component.seda.it;
 
 import io.quarkus.test.junit.QuarkusTest;
+import io.quarkus.test.junit.QuarkusTestProfile;
+import io.quarkus.test.junit.TestProfile;
 import io.restassured.RestAssured;
 import io.restassured.http.ContentType;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.condition.EnabledForJreRange;
+import org.junit.jupiter.api.condition.JRE;
 
-import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.containsString;
 
+@TestProfile(SedaVirtualThreadsTest.VirtualThreadsTestProfile.class)
 @QuarkusTest
-class SedaTest {
-
+class SedaVirtualThreadsTest {
+    @EnabledForJreRange(min = JRE.JAVA_21)
     @Test
-    public void seda() {
+    void sedaExecutesOnVirtualThread() {
         RestAssured.given()
-                .contentType(ContentType.TEXT).body("Hello 
World").post("/seda/foo")
-                .then().statusCode(201);
+                .contentType(ContentType.TEXT)
+                .post("/seda/virtualThreaded")
+                .then()
+                .statusCode(201);
 
-        RestAssured.get("/seda/foo").then().body(equalTo("Hello 
World")).statusCode(200);
+        RestAssured.get("/seda/virtualThreadedResults")
+                .then()
+                .body(containsString("java.lang.VirtualThread"))
+                .statusCode(200);
     }
 
+    public static final class VirtualThreadsTestProfile implements 
QuarkusTestProfile {
+        @Override
+        public String getConfigProfile() {
+            return "virtualThreads";
+        }
+    }
 }

Reply via email to