You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2023/03/01 12:18:58 UTC

[camel-quarkus] branch main updated (eda3bb96cc -> 4f1c2ea5e0)

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

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


    from eda3bb96cc Telegram: add integration test for the webhook endpoint
     new 1beb466b48 Revert "Disable infinispan test temporarily #4499"
     new 4f1c2ea5e0 Split infinispan testing into separate modules for the quarkus and camel managed clients

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../infinispan/deployment/InfinispanProcessor.java |  15 +
 .../{main-devmode => infinispan-common}/pom.xml    |  73 ++--
 .../common/InfinispanCommonProducers.java          |  53 +++
 .../common/InfinispanCommonResources.java          | 325 ++++++++++++++++++
 .../infinispan/common/InfinispanCommonRoutes.java  | 198 +++++++++++
 .../component/infinispan/common}/model/Person.java |   2 +-
 .../infinispan/common}/model/PersonSchema.java     |   2 +-
 .../InfinispanCommonServerTestResource.java}       |  40 ++-
 .../infinispan/common/InfinispanCommonTest.java}   | 235 ++++---------
 .../src/test/resources/infinispan.xml              |  18 +-
 .../{consul => infinispan-quarkus-client}/pom.xml  |  27 +-
 .../infinispan/InfinispanQuarkusClientRoutes.java  |  68 ++++
 .../src/main/resources/application.properties      |   0
 .../infinispan/InfinispanQuarkusClientIT.java}     |   2 +-
 .../infinispan/InfinispanQuarkusClientTest.java}   |  22 +-
 .../infinispan/InfinispanServerTestResource.java   |  42 +++
 integration-tests/infinispan/pom.xml               |  73 +---
 .../infinispan/src/main/java/InfinispanRoutes.java |  75 ++++
 .../component/infinispan/InfinispanResources.java  | 376 ---------------------
 .../component/infinispan/InfinispanRoutes.java     | 305 -----------------
 .../component/infinispan => }/InfinispanIT.java    |   1 -
 .../test/java/InfinispanServerTestResource.java    |  40 +++
 .../src/test/java/InfinispanTest.java}             |  34 +-
 .../infinispan/InfinispanServerTestResource.java   |  99 ------
 integration-tests/pom.xml                          |   4 +-
 poms/bom-test/pom.xml                              |  11 +
 tooling/scripts/test-categories.yaml               |   2 +
 tooling/scripts/validate-github-workflows.groovy   |   1 +
 28 files changed, 1020 insertions(+), 1123 deletions(-)
 copy integration-tests/{main-devmode => infinispan-common}/pom.xml (80%)
 create mode 100644 integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonProducers.java
 create mode 100644 integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonResources.java
 create mode 100644 integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonRoutes.java
 rename integration-tests/{infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan => infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common}/model/Person.java (95%)
 rename integration-tests/{infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan => infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common}/model/PersonSchema.java (94%)
 copy integration-tests/{couchdb/src/test/java/org/apache/camel/quarkus/component/couchdb/it/CouchdbTestResource.java => infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonServerTestResource.java} (55%)
 rename integration-tests/{infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanTest.java => infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonTest.java} (52%)
 rename integration-tests/{infinispan => infinispan-common}/src/test/resources/infinispan.xml (81%)
 copy integration-tests/{consul => infinispan-quarkus-client}/pom.xml (84%)
 create mode 100644 integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
 copy integration-tests/{infinispan => infinispan-quarkus-client}/src/main/resources/application.properties (100%)
 copy integration-tests/{infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java => infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientIT.java} (92%)
 copy integration-tests/{github/src/test/java/org/apache/camel/quarkus/component/github/it/GithubTest.java => infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientTest.java} (62%)
 create mode 100644 integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java
 create mode 100644 integration-tests/infinispan/src/main/java/InfinispanRoutes.java
 delete mode 100644 integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanResources.java
 delete mode 100644 integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanRoutes.java
 rename integration-tests/infinispan/src/test/java/{org/apache/camel/quarkus/component/infinispan => }/InfinispanIT.java (94%)
 create mode 100644 integration-tests/infinispan/src/test/java/InfinispanServerTestResource.java
 copy integration-tests/{amqp/src/test/java/org/apache/camel/quarkus/component/amqp/it/AmqpTest.java => infinispan/src/test/java/InfinispanTest.java} (55%)
 delete mode 100644 integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java


[camel-quarkus] 01/02: Revert "Disable infinispan test temporarily #4499"

Posted by ja...@apache.org.
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

commit 1beb466b480bdf8efa00af45fc631894a595a927
Author: James Netherton <ja...@gmail.com>
AuthorDate: Tue Feb 28 10:40:58 2023 +0000

    Revert "Disable infinispan test temporarily #4499"
    
    This reverts commit 1073a9a6046b54995bd4bf8084427be80f80724c.
---
 integration-tests/pom.xml            | 2 +-
 tooling/scripts/test-categories.yaml | 1 +
 2 files changed, 2 insertions(+), 1 deletion(-)

diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 48b4227e0c..73bde9a35d 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -111,7 +111,7 @@
         <module>headersmap</module>
         <module>hl7</module>
         <module>http</module>
-        <!--<module>infinispan</module> https://github.com/apache/camel-quarkus/issues/4499 -->
+        <module>infinispan</module>
         <module>influxdb</module>
         <module>jackson-avro</module>
         <module>jackson-protobuf</module>
diff --git a/tooling/scripts/test-categories.yaml b/tooling/scripts/test-categories.yaml
index 8f06e0ee78..937b91a79d 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -21,6 +21,7 @@ group-01:
   - git
   - google-storage
   - http
+  - infinispan
   - jcache
   - jms-artemis-client
   - jsch


[camel-quarkus] 02/02: Split infinispan testing into separate modules for the quarkus and camel managed clients

Posted by ja...@apache.org.
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

commit 4f1c2ea5e0550b3cb91f9dbff62bbbb8fc6b3e16
Author: James Netherton <ja...@gmail.com>
AuthorDate: Tue Feb 28 15:37:11 2023 +0000

    Split infinispan testing into separate modules for the quarkus and camel managed clients
    
    Fixes #4570
    Fixes #4499
---
 .../infinispan/deployment/InfinispanProcessor.java |  15 +
 .../{infinispan => infinispan-common}/pom.xml      |  76 ++---
 .../common/InfinispanCommonProducers.java          |  53 +++
 .../common/InfinispanCommonResources.java          | 325 ++++++++++++++++++
 .../infinispan/common/InfinispanCommonRoutes.java  | 198 +++++++++++
 .../component/infinispan/common}/model/Person.java |   2 +-
 .../infinispan/common}/model/PersonSchema.java     |   2 +-
 .../common/InfinispanCommonServerTestResource.java |  70 ++++
 .../infinispan/common/InfinispanCommonTest.java}   | 235 ++++---------
 .../src/test/resources/infinispan.xml              |  18 +-
 .../pom.xml                                        |  92 +----
 .../infinispan/InfinispanQuarkusClientRoutes.java  |  68 ++++
 .../src/main/resources/application.properties      |  20 ++
 .../infinispan/InfinispanQuarkusClientIT.java}     |   2 +-
 .../infinispan/InfinispanQuarkusClientTest.java}   |  23 +-
 .../infinispan/InfinispanServerTestResource.java   |  42 +++
 integration-tests/infinispan/pom.xml               |  73 +---
 .../infinispan/src/main/java/InfinispanRoutes.java |  75 ++++
 .../component/infinispan/InfinispanResources.java  | 376 ---------------------
 .../component/infinispan/InfinispanRoutes.java     | 305 -----------------
 .../component/infinispan => }/InfinispanIT.java    |   1 -
 .../test/java/InfinispanServerTestResource.java    |  40 +++
 .../infinispan/src/test/java/InfinispanTest.java   |  44 +++
 .../infinispan/InfinispanServerTestResource.java   |  99 ------
 integration-tests/pom.xml                          |   4 +-
 poms/bom-test/pom.xml                              |  11 +
 tooling/scripts/test-categories.yaml               |   1 +
 tooling/scripts/validate-github-workflows.groovy   |   1 +
 28 files changed, 1102 insertions(+), 1169 deletions(-)

diff --git a/extensions/infinispan/deployment/src/main/java/org/apache/camel/quarkus/component/infinispan/deployment/InfinispanProcessor.java b/extensions/infinispan/deployment/src/main/java/org/apache/camel/quarkus/component/infinispan/deployment/InfinispanProcessor.java
index f305db1c6d..6e8688a333 100644
--- a/extensions/infinispan/deployment/src/main/java/org/apache/camel/quarkus/component/infinispan/deployment/InfinispanProcessor.java
+++ b/extensions/infinispan/deployment/src/main/java/org/apache/camel/quarkus/component/infinispan/deployment/InfinispanProcessor.java
@@ -18,6 +18,9 @@ package org.apache.camel.quarkus.component.infinispan.deployment;
 
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem;
+import org.infinispan.commons.marshall.ProtoStreamMarshaller;
 
 class InfinispanProcessor {
 
@@ -27,4 +30,16 @@ class InfinispanProcessor {
     FeatureBuildItem feature() {
         return new FeatureBuildItem(FEATURE);
     }
+
+    @BuildStep
+    NativeImageResourceBuildItem nativeImageResources() {
+        // Only required when Camel instantiates and manages its own internal CacheContainer
+        return new NativeImageResourceBuildItem("org/infinispan/protostream/message-wrapping.proto");
+    }
+
+    @BuildStep
+    ReflectiveClassBuildItem reflectiveClasses() {
+        // Only required when Camel instantiates and manages its own internal CacheContainer
+        return new ReflectiveClassBuildItem(false, false, ProtoStreamMarshaller.class);
+    }
 }
diff --git a/integration-tests/infinispan/pom.xml b/integration-tests/infinispan-common/pom.xml
similarity index 73%
copy from integration-tests/infinispan/pom.xml
copy to integration-tests/infinispan-common/pom.xml
index bca76cd9a0..3fd5f0a3af 100644
--- a/integration-tests/infinispan/pom.xml
+++ b/integration-tests/infinispan-common/pom.xml
@@ -26,9 +26,9 @@
         <relativePath>../../poms/build-parent-it/pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-integration-test-infinispan</artifactId>
-    <name>Camel Quarkus :: Integration Tests :: Infinispan</name>
-    <description>Integration tests for Camel Infinispan component</description>
+    <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Infinispan Common</name>
+    <description>Integration tests for Camel Infinispan</description>
 
     <dependencies>
         <dependency>
@@ -85,35 +85,24 @@
         </dependency>
     </dependencies>
 
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.jboss.jandex</groupId>
+                <artifactId>jandex-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <id>make-index</id>
+                        <goals>
+                            <goal>jandex</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 
     <profiles>
-        <profile>
-            <id>native</id>
-            <activation>
-                <property>
-                    <name>native</name>
-                </property>
-            </activation>
-            <properties>
-                <quarkus.package.type>native</quarkus.package.type>
-            </properties>
-            <build>
-                <plugins>
-                    <plugin>
-                        <groupId>org.apache.maven.plugins</groupId>
-                        <artifactId>maven-failsafe-plugin</artifactId>
-                        <executions>
-                            <execution>
-                                <goals>
-                                    <goal>integration-test</goal>
-                                    <goal>verify</goal>
-                                </goals>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
         <profile>
             <id>virtualDependencies</id>
             <activation>
@@ -177,33 +166,6 @@
                 </dependency>
             </dependencies>
         </profile>
-        <profile>
-            <id>skip-testcontainers-tests</id>
-            <activation>
-                <property>
-                    <name>skip-testcontainers-tests</name>
-                </property>
-            </activation>
-            <properties>
-                <skipTests>true</skipTests>
-            </properties>
-        </profile>
-        <profile>
-            <id>jdk17-build</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <argLine>--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED</argLine>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
     </profiles>
 
 </project>
diff --git a/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonProducers.java b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonProducers.java
new file mode 100644
index 0000000000..45deb3d587
--- /dev/null
+++ b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonProducers.java
@@ -0,0 +1,53 @@
+/*
+ * 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.quarkus.component.infinispan.common;
+
+import java.util.function.BiFunction;
+
+import jakarta.inject.Named;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteCustomListener;
+import org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated;
+import org.infinispan.client.hotrod.annotation.ClientListener;
+import org.infinispan.client.hotrod.event.ClientCacheEntryCreatedEvent;
+
+public class InfinispanCommonProducers {
+    @Named("customMappingFunction")
+    public BiFunction<String, String, String> mappingFunction() {
+        return (k, v) -> v + "-remapped";
+    }
+
+    @Named("customListener")
+    public InfinispanRemoteCustomListener customListener() {
+        return new CustomListener();
+    }
+
+    @ClientListener
+    public static final class CustomListener extends InfinispanRemoteCustomListener {
+
+        @ClientCacheEntryCreated
+        public void entryCreated(ClientCacheEntryCreatedEvent<?> event) {
+            if (isAccepted(event.getType())) {
+                getEventProcessor().processEvent(
+                        event.getType().toString(),
+                        getCacheName(),
+                        event.getKey(),
+                        null,
+                        null);
+            }
+        }
+    }
+}
diff --git a/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonResources.java b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonResources.java
new file mode 100644
index 0000000000..047d5c8aaf
--- /dev/null
+++ b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonResources.java
@@ -0,0 +1,325 @@
+/*
+ * 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.quarkus.component.infinispan.common;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import jakarta.json.Json;
+import jakarta.json.JsonObject;
+import jakarta.ws.rs.Consumes;
+import jakarta.ws.rs.DELETE;
+import jakarta.ws.rs.GET;
+import jakarta.ws.rs.PATCH;
+import jakarta.ws.rs.POST;
+import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
+import jakarta.ws.rs.Produces;
+import jakarta.ws.rs.QueryParam;
+import jakarta.ws.rs.core.MediaType;
+import jakarta.ws.rs.core.Response;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.component.infinispan.InfinispanConstants;
+import org.apache.camel.component.infinispan.InfinispanOperation;
+import org.apache.camel.component.infinispan.InfinispanQueryBuilder;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.quarkus.component.infinispan.common.model.Person;
+import org.apache.camel.util.CollectionHelper;
+import org.infinispan.client.hotrod.ServerStatistics;
+
+import static org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonRoutes.CORRELATOR_HEADER;
+
+@Path("/infinispan")
+@ApplicationScoped
+public class InfinispanCommonResources {
+    public static final String CACHE_NAME = "camel-infinispan";
+
+    @Inject
+    ProducerTemplate template;
+
+    @Inject
+    CamelContext camelContext;
+
+    @Path("/inspect")
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    public JsonObject inspectCamelInfinispanClientConfiguration() {
+        InfinispanRemoteComponent component = camelContext.getComponent("infinispan", InfinispanRemoteComponent.class);
+
+        return Json.createObjectBuilder()
+                .add("hosts", Objects.toString(component.getConfiguration().getHosts(), "none"))
+                .add("cache-manager", Objects.toString(component.getConfiguration().getCacheContainer(), "none"))
+                .build();
+    }
+
+    @Path("/aggregate")
+    @GET
+    public void aggregate() throws InterruptedException {
+        MockEndpoint mockEndpoint = camelContext.getEndpoint("mock:aggregationResult", MockEndpoint.class);
+        mockEndpoint.expectedMessageCount(2);
+        mockEndpoint.expectedBodiesReceived(1 + 3 + 4 + 5, 6 + 7 + 20 + 21);
+
+        try {
+            Map<String, Object> headers = Map.of(CORRELATOR_HEADER, CORRELATOR_HEADER);
+
+            Stream.of(1, 3, 4, 5, 6, 7, 20, 21)
+                    .forEach(value -> template.sendBodyAndHeaders("direct:aggregation", value, headers));
+
+            mockEndpoint.assertIsSatisfied(15000);
+        } finally {
+            mockEndpoint.reset();
+        }
+    }
+
+    @Path("/clear")
+    @DELETE
+    public void clear() {
+        template.sendBody("direct:clear", null);
+    }
+
+    @Path("/clearAsync")
+    @DELETE
+    public void clearAsync()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<?> future = template.requestBody("direct:clearAsync", null, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/compute")
+    @POST
+    public void compute() {
+        template.sendBody("direct:compute", null);
+    }
+
+    @Path("/computeAsync")
+    @POST
+    public void computeAsync()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<?> future = template.requestBody("direct:computeAsync", null, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/containsKey")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Boolean containsKey() {
+        return template.requestBody("direct:containsKey", null, Boolean.class);
+    }
+
+    @Path("/containsValue")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Boolean containsValue(@QueryParam("value") String value) {
+        return template.requestBody("direct:containsValue", value, Boolean.class);
+    }
+
+    @Path("/event/verify")
+    @GET
+    public void listener(
+            @QueryParam("mockEndpointUri") String mockEndpointUri,
+            String content) throws InterruptedException {
+        MockEndpoint mockEndpoint = camelContext.getEndpoint(mockEndpointUri, MockEndpoint.class);
+        mockEndpoint.expectedMessageCount(1);
+        mockEndpoint.message(0).header(InfinispanConstants.EVENT_TYPE).isEqualTo("CLIENT_CACHE_ENTRY_CREATED");
+        mockEndpoint.message(0).header(InfinispanConstants.CACHE_NAME).isNotNull();
+        mockEndpoint.message(0).header(InfinispanConstants.KEY).isEqualTo("the-key");
+
+        try {
+            template.sendBody("direct:put", content);
+            mockEndpoint.assertIsSatisfied(5000);
+        } finally {
+            mockEndpoint.reset();
+        }
+    }
+
+    @Path("/get")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String get(@QueryParam("key") String key) {
+        Map<String, Object> headers = Map.of(InfinispanConstants.KEY, Objects.requireNonNullElse(key, "the-key"));
+        return template.requestBodyAndHeaders("direct:get", null, headers, String.class);
+    }
+
+    @Path("/getOrDefault")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public String getOrDefault() {
+        return template.requestBody("direct:getOrDefault", null, String.class);
+    }
+
+    @Path("/put")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public String put(String content) {
+        return template.requestBody("direct:put", content, String.class);
+    }
+
+    @Path("/putAsync")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    public void putAsync(String content)
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<?> future = template.requestBody("direct:putAsync", content, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/putAll")
+    @POST
+    public void putAll() {
+        Map<String, String> body = CollectionHelper.mapOf("key-1", "value-1", "key-2", "value-2");
+        template.sendBody("direct:putAll", body);
+    }
+
+    @Path("/putAllAsync")
+    @POST
+    public void putAllAsync()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        Map<String, String> body = CollectionHelper.mapOf("key-1", "value-1", "key-2", "value-2");
+        CompletableFuture<?> future = template.requestBody("direct:putAllAsync", body, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/putIdempotent")
+    @GET
+    public void putIdempotent() throws InterruptedException {
+        MockEndpoint mockEndpoint = camelContext.getEndpoint("mock:idempotentResult", MockEndpoint.class);
+        mockEndpoint.expectedMessageCount(1);
+
+        String messageId = UUID.randomUUID().toString();
+        try {
+            IntStream.of(1, 10).forEach(value -> {
+                Map<String, Object> headers = Map.of("MessageId", messageId);
+                template.sendBodyAndHeaders("direct:idempotent", "Message " + value, headers);
+            });
+
+            mockEndpoint.assertIsSatisfied(5000);
+        } finally {
+            mockEndpoint.reset();
+        }
+    }
+
+    @Path("/putIfAbsent")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    @Produces(MediaType.TEXT_PLAIN)
+    public String putIfAbsent(@QueryParam("component") String component, String content) {
+        return template.requestBody("direct:putIfAbsent", content, String.class);
+    }
+
+    @Path("/putIfAbsentAsync")
+    @POST
+    @Consumes(MediaType.TEXT_PLAIN)
+    public void putIfAbsentAsync(String content)
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<?> future = template.requestBody("direct:putIfAbsentAsync", content, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/query")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    @SuppressWarnings("unchecked")
+    public Response query() {
+        Map<String, Object> putOperationHeaders = Map.of(
+                InfinispanConstants.OPERATION, InfinispanOperation.PUT,
+                InfinispanConstants.KEY, "person",
+                InfinispanConstants.VALUE, new Person("Test", "Person"));
+
+        template.sendBodyAndHeaders("infinispan:" + CACHE_NAME, null, putOperationHeaders);
+
+        String query = "FROM person.Person WHERE firstName = 'Test'";
+        InfinispanQueryBuilder builder = InfinispanQueryBuilder.create(query);
+
+        Map<String, Object> headers = Map.of(InfinispanConstants.QUERY_BUILDER, builder);
+
+        List<String> result = template.requestBodyAndHeaders("direct:query", null, headers, List.class);
+        if (result.isEmpty()) {
+            return Response.status(404).build();
+        }
+        return Response.ok().entity(result.get(0)).build();
+    }
+
+    @Path("/remove")
+    @DELETE
+    public void remove() {
+        template.requestBody("direct:remove", null, String.class);
+    }
+
+    @Path("/removeAsync")
+    @DELETE
+    public void removeAsync()
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<?> future = template.requestBody("direct:removeAsync", null, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/replace")
+    @PATCH
+    @Consumes(MediaType.TEXT_PLAIN)
+    public void replace(String content) {
+        template.sendBody("direct:replace", content);
+    }
+
+    @Path("/replaceAsync")
+    @PATCH
+    @Consumes(MediaType.TEXT_PLAIN)
+    public void replaceAsync(String content)
+            throws ExecutionException, InterruptedException, TimeoutException {
+        CompletableFuture<?> future = template.requestBody("direct:replaceAsync", content, CompletableFuture.class);
+        future.get(5, TimeUnit.SECONDS);
+    }
+
+    @Path("/size")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Integer size() {
+        return template.requestBody("direct:size", null, Integer.class);
+    }
+
+    @Path("/stats")
+    @GET
+    @Produces(MediaType.TEXT_PLAIN)
+    public Integer stats() {
+        ServerStatistics statistics = template.requestBody("direct:stats", null, ServerStatistics.class);
+        return statistics.getIntStatistic(ServerStatistics.APPROXIMATE_ENTRIES);
+    }
+
+    @POST
+    @Path("consumer/{routeId}/{enabled}")
+    public void manageRoute(
+            @PathParam("routeId") String routeId,
+            @PathParam("enabled") boolean enabled) throws Exception {
+        if (enabled) {
+            camelContext.getRouteController().startRoute(routeId);
+        } else {
+            camelContext.getRouteController().stopRoute(routeId);
+        }
+    }
+}
diff --git a/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonRoutes.java b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonRoutes.java
new file mode 100644
index 0000000000..ab0e221b9c
--- /dev/null
+++ b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonRoutes.java
@@ -0,0 +1,198 @@
+/*
+ * 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.quarkus.component.infinispan.common;
+
+import org.apache.camel.AggregationStrategy;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.infinispan.InfinispanConstants;
+import org.apache.camel.component.infinispan.InfinispanOperation;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository;
+import org.infinispan.client.hotrod.configuration.Configuration;
+
+import static org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonResources.CACHE_NAME;
+
+public abstract class InfinispanCommonRoutes extends RouteBuilder {
+    public static final int COMPLETION_SIZE = 4;
+    public static final String CORRELATOR_HEADER = "CORRELATOR_HEADER";
+
+    @Override
+    public void configure() {
+        from("direct:clear")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CLEAR)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:clearAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CLEARASYNC)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:compute")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.COMPUTE)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s?remappingFunction=#customMappingFunction", CACHE_NAME);
+
+        from("direct:computeAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.COMPUTEASYNC)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s?remappingFunction=#customMappingFunction", CACHE_NAME);
+
+        from("direct:containsKey")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CONTAINSKEY)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:containsValue")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CONTAINSVALUE)
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:get")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:getOrDefault")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GETORDEFAULT)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.DEFAULT_VALUE).constant("default-value")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:put")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:putAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTASYNC)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:putAll")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTALL)
+                .setHeader(InfinispanConstants.MAP).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:putAllAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTALLASYNC)
+                .setHeader(InfinispanConstants.MAP).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:putIfAbsent")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTIFABSENT)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:putIfAbsentAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTIFABSENTASYNC)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:query")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.QUERY)
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:remove")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REMOVE)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:removeAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REMOVEASYNC)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:replace")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REPLACE)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:replaceAsync")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REPLACEASYNC)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .setHeader(InfinispanConstants.VALUE).body()
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:size")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.SIZE)
+                .setHeader(InfinispanConstants.KEY).constant("the-key")
+                .toF("infinispan:%s", CACHE_NAME);
+
+        from("direct:stats")
+                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.STATS)
+                .toF("infinispan:%s", CACHE_NAME);
+
+        fromF("infinispan:%s?eventTypes=CLIENT_CACHE_ENTRY_CREATED", CACHE_NAME)
+                .id("infinispan-events")
+                .autoStartup(false)
+                .to("mock:resultCreated");
+
+        from("direct:aggregation")
+                .aggregate(header(CORRELATOR_HEADER))
+                .aggregationRepository(createAggregationRepository())
+                .aggregationStrategy(createAggregationStrategy())
+                .completionSize(COMPLETION_SIZE)
+                .to("mock:aggregationResult");
+
+        from("direct:idempotent")
+                .idempotentConsumer(header("MessageID"), createIdempotentRepository())
+                .to("mock:idempotentResult");
+
+        fromF("infinispan:%s?customListener=#customListener", CACHE_NAME)
+                .id("infinispan-custom-listener")
+                .autoStartup(false)
+                .to("mock:resultCustomListener");
+    }
+
+    protected abstract Configuration getConfigurationBuilder();
+
+    protected abstract InfinispanRemoteConfiguration getConfiguration();
+
+    private InfinispanRemoteIdempotentRepository createIdempotentRepository() {
+        InfinispanRemoteConfiguration configuration = getConfiguration();
+        InfinispanRemoteIdempotentRepository repository = new InfinispanRemoteIdempotentRepository(CACHE_NAME);
+        repository.setConfiguration(configuration);
+        return repository;
+    }
+
+    private InfinispanRemoteAggregationRepository createAggregationRepository() {
+        InfinispanRemoteAggregationRepository aggregationRepository = new InfinispanRemoteAggregationRepository(CACHE_NAME);
+        InfinispanRemoteConfiguration configuration = getConfiguration();
+        aggregationRepository.setConfiguration(configuration);
+        return aggregationRepository;
+    }
+
+    private AggregationStrategy createAggregationStrategy() {
+        return (oldExchange, newExchange) -> {
+            if (oldExchange == null) {
+                return newExchange;
+            } else {
+                Integer n = newExchange.getIn().getBody(Integer.class);
+                Integer o = oldExchange.getIn().getBody(Integer.class);
+                Integer v = (o == null ? 0 : o) + (n == null ? 0 : n);
+                oldExchange.getIn().setBody(v, Integer.class);
+                return oldExchange;
+            }
+        };
+    }
+}
diff --git a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/model/Person.java b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/model/Person.java
similarity index 95%
rename from integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/model/Person.java
rename to integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/model/Person.java
index 9902d83518..5cb0a10e9b 100644
--- a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/model/Person.java
+++ b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/model/Person.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.infinispan.model;
+package org.apache.camel.quarkus.component.infinispan.common.model;
 
 import java.util.Objects;
 
diff --git a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/model/PersonSchema.java b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/model/PersonSchema.java
similarity index 94%
rename from integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/model/PersonSchema.java
rename to integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/model/PersonSchema.java
index 4569d616d2..a995930735 100644
--- a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/model/PersonSchema.java
+++ b/integration-tests/infinispan-common/src/main/java/org/apache/camel/quarkus/component/infinispan/common/model/PersonSchema.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.infinispan.model;
+package org.apache.camel.quarkus.component.infinispan.common.model;
 
 import org.infinispan.protostream.GeneratedSchema;
 import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder;
diff --git a/integration-tests/infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonServerTestResource.java b/integration-tests/infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonServerTestResource.java
new file mode 100644
index 0000000000..383a77411e
--- /dev/null
+++ b/integration-tests/infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonServerTestResource.java
@@ -0,0 +1,70 @@
+/*
+ * 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.quarkus.component.infinispan.common;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
+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.TestcontainersConfiguration;
+
+public class InfinispanCommonServerTestResource implements QuarkusTestResourceLifecycleManager {
+    protected static final String USER = "camel";
+    protected static final String PASS = "camel";
+    private static final Logger LOGGER = LoggerFactory.getLogger(InfinispanCommonServerTestResource.class);
+    private static final String CONTAINER_IMAGE = System.getProperty("infinispan.container.image", "infinispan/server:14.0");
+    private static final int HOTROD_PORT = 11222;
+
+    private GenericContainer<?> container;
+
+    @Override
+    public Map<String, String> start() {
+        LOGGER.info(TestcontainersConfiguration.getInstance().toString());
+
+        container = new GenericContainer<>(CONTAINER_IMAGE)
+                .withExposedPorts(HOTROD_PORT)
+                .withEnv("USER", USER)
+                .withEnv("PASS", PASS)
+                .withClasspathResourceMapping("infinispan.xml", "/user-config/infinispan.xml", BindMode.READ_ONLY)
+                .withCommand("-c", "/user-config/infinispan.xml")
+                .waitingFor(Wait.forListeningPort());
+
+        container.start();
+
+        return new HashMap<>();
+    }
+
+    @Override
+    public void stop() {
+        try {
+            if (container != null) {
+                container.stop();
+            }
+        } catch (Exception e) {
+            // ignored
+        }
+    }
+
+    protected String getServerList() {
+        return String.format("%s:%s", container.getHost(), container.getMappedPort(HOTROD_PORT));
+    }
+}
diff --git a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanTest.java b/integration-tests/infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonTest.java
similarity index 52%
rename from integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanTest.java
rename to integration-tests/infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonTest.java
index 4e27f05239..96169c3738 100644
--- a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanTest.java
+++ b/integration-tests/infinispan-common/src/test/java/org/apache/camel/quarkus/component/infinispan/common/InfinispanCommonTest.java
@@ -14,139 +14,113 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.infinispan;
+package org.apache.camel.quarkus.component.infinispan.common;
 
-import java.util.stream.Stream;
-
-import io.quarkus.test.common.QuarkusTestResource;
-import io.quarkus.test.junit.QuarkusTest;
 import io.restassured.RestAssured;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
-import org.junit.jupiter.params.provider.Arguments;
-import org.junit.jupiter.params.provider.MethodSource;
+import org.junit.jupiter.params.provider.ValueSource;
 
 import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
 
-@QuarkusTest
-@QuarkusTestResource(InfinispanServerTestResource.class)
-public class InfinispanTest {
+public abstract class InfinispanCommonTest {
 
     @AfterEach
     public void afterEach() {
-        for (String componentName : componentNames()) {
-            RestAssured.with()
-                    .queryParam("component", componentName)
-                    .delete("/infinispan/clear")
-                    .then()
-                    .statusCode(204);
+        RestAssured.with()
+                .delete("/infinispan/clear")
+                .then()
+                .statusCode(204);
 
-            RestAssured.with()
-                    .queryParam("component", componentName)
-                    .get("/infinispan/get")
-                    .then()
-                    .statusCode(204);
-        }
+        RestAssured.with()
+                .get("/infinispan/get")
+                .then()
+                .statusCode(204);
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void aggregate(String componentName) {
+    @Test
+    public void aggregate() {
         RestAssured.with()
-                .queryParam("component", componentName)
+                .queryParam("component")
                 .get("/infinispan/aggregate")
                 .then()
                 .statusCode(204);
     }
 
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void clear(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void clear(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
-                .body(is("Hello " + componentName));
+                .body(is("Hello Camel Infinispan"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .delete(computePath("/infinispan/clear", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(204);
     }
 
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void compute(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void compute(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .body("Initial value")
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .post(computePath("/infinispan/compute", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
                 .body(is("Initial value-remapped"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void containsKey(String componentName) {
+    @Test
+    public void containsKey() {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/containsKey")
                 .then()
                 .statusCode(200)
                 .body(is("false"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/containsKey")
                 .then()
                 .statusCode(200)
                 .body(is("true"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void containsValue(String componentName) {
+    @Test
+    public void containsValue() {
         String value = "test-value";
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .queryParam("value", value)
                 .get("/infinispan/containsValue")
                 .then()
@@ -154,14 +128,12 @@ public class InfinispanTest {
                 .body(is("false"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .body(value)
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .queryParam("value", value)
                 .get("/infinispan/containsValue")
                 .then()
@@ -169,135 +141,104 @@ public class InfinispanTest {
                 .body(is("true"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void customListener(String componentName) {
+    @Test
+    public void customListener() {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .post("/infinispan/consumer/" + componentName + "-custom-listener/true")
+                .post("/infinispan/consumer/infinispan-custom-listener/true")
                 .then()
                 .statusCode(204);
 
         try {
-            String mockEndpointUri = componentName.equals("infinispan") ? "mock:camelResultCustomListener"
-                    : "mock:quarkusResultCustomListener";
             RestAssured.with()
-                    .queryParam("component", componentName)
-                    .queryParam("mockEndpointUri", mockEndpointUri)
-                    .body("Hello " + componentName)
+                    .queryParam("mockEndpointUri", "mock:resultCustomListener")
+                    .body("Hello Camel Infinispan")
                     .get("/infinispan/event/verify")
                     .then()
                     .statusCode(204);
         } finally {
             RestAssured.with()
-                    .queryParam("component", componentName)
-                    .post("/infinispan/consumer/" + componentName + "-custom-listener/false")
+                    .post("/infinispan/consumer/infinispan-custom-listener/false")
                     .then()
                     .statusCode(204);
         }
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void events(String componentName) {
+    @Test
+    public void events() {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .post("/infinispan/consumer/" + componentName + "-events/true")
+                .post("/infinispan/consumer/infinispan-events/true")
                 .then()
                 .statusCode(204);
 
         try {
-            String mockEndpointUri = componentName.equals("infinispan") ? "mock:camelResultCreated"
-                    : "mock:quarkusResultCreated";
             RestAssured.with()
-                    .queryParam("component", componentName)
-                    .queryParam("mockEndpointUri", mockEndpointUri)
-                    .body("Hello " + componentName)
+                    .queryParam("mockEndpointUri", "mock:resultCreated")
+                    .body("Hello Camel Infinispan")
                     .get("/infinispan/event/verify")
                     .then()
                     .statusCode(204);
         } finally {
             RestAssured.with()
-                    .queryParam("component", componentName)
-                    .post("/infinispan/consumer/" + componentName + "-events/false")
+                    .post("/infinispan/consumer/infinispan-events/false")
                     .then()
                     .statusCode(204);
         }
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void getOrDefault(String componentName) {
+    @Test
+    public void getOrDefault() {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/getOrDefault")
                 .then()
                 .statusCode(200)
                 .body(is("default-value"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/getOrDefault")
                 .then()
                 .statusCode(200)
-                .body(is("Hello " + componentName));
+                .body(is("Hello Camel Infinispan"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void idempotent(String componentName) {
+    @Test
+    public void idempotent() {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/putIdempotent")
                 .then()
                 .statusCode(204);
     }
 
-    @Test
-    public void inspect() {
-        RestAssured.when()
-                .get("/infinispan/inspect")
-                .then().body(
-                        "hosts", is(notNullValue()),
-                        "cache-manager", is("none"));
-    }
-
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void put(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void put(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post(computePath("/infinispan/put", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
-                .body(is("Hello " + componentName));
+                .body(is("Hello Camel Infinispan"));
     }
 
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void putAll(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void putAll(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .post(computePath("/infinispan/putAll", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .queryParam("key", "key-1")
                 .get("/infinispan/get")
                 .then()
@@ -305,7 +246,6 @@ public class InfinispanTest {
                 .body(is("value-1"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .queryParam("key", "key-2")
                 .get("/infinispan/get")
                 .then()
@@ -314,146 +254,126 @@ public class InfinispanTest {
     }
 
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void putIfAbsent(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void putIfAbsent(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post(computePath("/infinispan/putIfAbsent", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
-                .body(is("Hello " + componentName));
+                .body(is("Hello Camel Infinispan"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .body("An alternative value")
                 .post(computePath("/infinispan/putIfAbsent", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
-                .body(is("Hello " + componentName));
+                .body(is("Hello Camel Infinispan"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void query(String componentName) {
+    @Test
+    public void query() {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/query")
                 .then()
                 .statusCode(200);
     }
 
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void remove(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void remove(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post(computePath("/infinispan/put", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .delete(computePath("/infinispan/remove", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
+
                 .get("/infinispan/get")
                 .then()
                 .statusCode(204);
     }
 
     @ParameterizedTest
-    @MethodSource("componentNamesWithSynchronicity")
-    public void replace(String componentName, boolean isAsync) {
+    @ValueSource(booleans = { false, true })
+    public void replace(boolean isAsync) {
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post(computePath("/infinispan/put", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
-                .body(is("Hello " + componentName));
+                .body(is("Hello Camel Infinispan"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .body("replaced cache value")
                 .patch(computePath("/infinispan/replace", isAsync))
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/get")
                 .then()
                 .statusCode(200)
                 .body(is("replaced cache value"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void size(String componentName) {
+    @Test
+    public void size() {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/size")
                 .then()
                 .statusCode(200)
                 .body(is("0"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/size")
                 .then()
                 .statusCode(200)
                 .body(is("1"));
     }
 
-    @ParameterizedTest
-    @MethodSource("componentNames")
-    public void stats(String componentName) {
+    @Test
+    public void stats() {
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/stats")
                 .then()
                 .statusCode(200)
                 .body(is("0"));
 
         RestAssured.with()
-                .queryParam("component", componentName)
-                .body("Hello " + componentName)
+                .body("Hello Camel Infinispan")
                 .post("/infinispan/put")
                 .then()
                 .statusCode(204);
 
         RestAssured.with()
-                .queryParam("component", componentName)
                 .get("/infinispan/stats")
                 .then()
                 .statusCode(200)
@@ -466,19 +386,4 @@ public class InfinispanTest {
         }
         return path;
     }
-
-    public static String[] componentNames() {
-        return new String[] {
-                "infinispan",
-                "infinispan-quarkus"
-        };
-    }
-
-    public static Stream<Arguments> componentNamesWithSynchronicity() {
-        return Stream.of(
-                Arguments.of("infinispan", false),
-                Arguments.of("infinispan-quarkus", false),
-                Arguments.of("infinispan", true),
-                Arguments.of("infinispan-quarkus", true));
-    }
 }
diff --git a/integration-tests/infinispan/src/test/resources/infinispan.xml b/integration-tests/infinispan-common/src/test/resources/infinispan.xml
similarity index 81%
rename from integration-tests/infinispan/src/test/resources/infinispan.xml
rename to integration-tests/infinispan-common/src/test/resources/infinispan.xml
index 60acf4789f..a8cd049188 100644
--- a/integration-tests/infinispan/src/test/resources/infinispan.xml
+++ b/integration-tests/infinispan-common/src/test/resources/infinispan.xml
@@ -18,10 +18,10 @@
 
 -->
 <infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-            xsi:schemaLocation="urn:infinispan:config:13.0 https://infinispan.org/schemas/infinispan-config-13.0.xsd
-                            urn:infinispan:server:13.0 https://infinispan.org/schemas/infinispan-server-13.0.xsd"
-            xmlns="urn:infinispan:config:13.0"
-            xmlns:server="urn:infinispan:server:13.0">
+            xsi:schemaLocation="urn:infinispan:config:14.0 https://infinispan.org/schemas/infinispan-config-14.0.xsd
+                            urn:infinispan:server:14.0 https://infinispan.org/schemas/infinispan-server-14.0.xsd"
+            xmlns="urn:infinispan:config:14.0"
+            xmlns:server="urn:infinispan:server:14.0">
 
     <cache-container name="default" statistics="true">
         <metrics accurate-size="true"/>
@@ -31,17 +31,13 @@
             <authorization/>
         </security>
 
-        <!-- Used by tests where camel-infinispan manages its own cache container -->
-        <local-cache name="camel">
-        </local-cache>
-
-        <!-- Used by tests where camel-infinispan uses the Quarkus managed cache container -->
-        <local-cache name="quarkus">
+        <local-cache name="camel-infinispan">
+            <encoding media-type="application/x-protostream" />
         </local-cache>
     </cache-container>
 
 
-    <server xmlns="urn:infinispan:server:13.0">
+    <server xmlns="urn:infinispan:server:14.0">
         <interfaces>
             <interface name="public">
                 <inet-address value="${infinispan.bind.address:127.0.0.1}"/>
diff --git a/integration-tests/infinispan/pom.xml b/integration-tests/infinispan-quarkus-client/pom.xml
similarity index 57%
copy from integration-tests/infinispan/pom.xml
copy to integration-tests/infinispan-quarkus-client/pom.xml
index bca76cd9a0..631329c664 100644
--- a/integration-tests/infinispan/pom.xml
+++ b/integration-tests/infinispan-quarkus-client/pom.xml
@@ -26,26 +26,14 @@
         <relativePath>../../poms/build-parent-it/pom.xml</relativePath>
     </parent>
 
-    <artifactId>camel-quarkus-integration-test-infinispan</artifactId>
-    <name>Camel Quarkus :: Integration Tests :: Infinispan</name>
+    <artifactId>camel-quarkus-integration-test-infinispan-quarkus-client</artifactId>
+    <name>Camel Quarkus :: Integration Tests :: Infinispan Quarkus Client</name>
     <description>Integration tests for Camel Infinispan component</description>
 
     <dependencies>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-infinispan</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-log</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-direct</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-mock</artifactId>
+            <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
         </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
@@ -67,6 +55,12 @@
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.testcontainers</groupId>
             <artifactId>testcontainers</artifactId>
@@ -123,58 +117,6 @@
             </activation>
             <dependencies>
                 <!-- The following dependencies guarantee that this module is built after them. You can update them by running `mvn process-resources -Pformat -N` from the source tree root directory -->
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-direct-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-infinispan-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-log-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-mock-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
             </dependencies>
         </profile>
         <profile>
@@ -188,22 +130,6 @@
                 <skipTests>true</skipTests>
             </properties>
         </profile>
-        <profile>
-            <id>jdk17-build</id>
-            <activation>
-                <jdk>[17,)</jdk>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-surefire-plugin</artifactId>
-                        <configuration>
-                            <argLine>--add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent=ALL-UNNAMED</argLine>
-                        </configuration>
-                    </plugin>
-                </plugins>
-            </build>
-        </profile>
     </profiles>
 
 </project>
diff --git a/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java b/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
new file mode 100644
index 0000000000..7f4c291606
--- /dev/null
+++ b/integration-tests/infinispan-quarkus-client/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientRoutes.java
@@ -0,0 +1,68 @@
+/*
+ * 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.quarkus.component.infinispan;
+
+import java.util.Set;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
+import org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonRoutes;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.infinispan.client.hotrod.RemoteCacheManager;
+import org.infinispan.client.hotrod.configuration.Configuration;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
+import org.infinispan.commons.marshall.ProtoStreamMarshaller;
+
+public class InfinispanQuarkusClientRoutes extends InfinispanCommonRoutes {
+
+    @Override
+    protected Configuration getConfigurationBuilder() {
+        Config config = ConfigProvider.getConfig();
+        ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
+        String[] hostParts = config.getValue("quarkus.infinispan-client.server-list", String.class).split(":");
+
+        clientBuilder.addServer()
+                .host(hostParts[0])
+                .port(Integer.parseInt(hostParts[1]));
+
+        clientBuilder
+                .security()
+                .authentication()
+                .username(config.getValue("quarkus.infinispan-client.auth-username", String.class))
+                .password(config.getValue("quarkus.infinispan-client.auth-password", String.class))
+                .serverName(config.getValue("quarkus.infinispan-client.auth-server-name", String.class))
+                .saslMechanism(config.getValue("quarkus.infinispan-client.sasl-mechanism", String.class))
+                .realm(config.getValue("quarkus.infinispan-client.auth-realm", String.class))
+                .marshaller(new ProtoStreamMarshaller());
+
+        return clientBuilder.build();
+    }
+
+    @Override
+    protected InfinispanRemoteConfiguration getConfiguration() {
+        CamelContext camelContext = getCamelContext();
+        InfinispanRemoteComponent component = camelContext.getComponent("infinispan", InfinispanRemoteComponent.class);
+        InfinispanRemoteConfiguration configuration = component.getConfiguration().clone();
+        configuration.setCacheContainerConfiguration(getConfigurationBuilder());
+        Set<RemoteCacheManager> beans = camelContext.getRegistry().findByType(RemoteCacheManager.class);
+        RemoteCacheManager cacheManager = beans.iterator().next();
+        configuration.setCacheContainer(cacheManager);
+        return configuration;
+    }
+}
diff --git a/integration-tests/infinispan-quarkus-client/src/main/resources/application.properties b/integration-tests/infinispan-quarkus-client/src/main/resources/application.properties
new file mode 100644
index 0000000000..d07b4f4fef
--- /dev/null
+++ b/integration-tests/infinispan-quarkus-client/src/main/resources/application.properties
@@ -0,0 +1,20 @@
+## ---------------------------------------------------------------------------
+## 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.
+## ---------------------------------------------------------------------------
+quarkus.infinispan-client.devservices.enabled=false
+
+# Required by InfinispanRemoteAggregationRepository
+quarkus.camel.native.reflection.serialization-enabled=true
diff --git a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java b/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientIT.java
similarity index 92%
copy from integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java
copy to integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientIT.java
index 25a4208dc0..f100fd6ea4 100644
--- a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java
+++ b/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientIT.java
@@ -19,5 +19,5 @@ package org.apache.camel.quarkus.component.infinispan;
 import io.quarkus.test.junit.QuarkusIntegrationTest;
 
 @QuarkusIntegrationTest
-public class InfinispanIT extends InfinispanTest {
+public class InfinispanQuarkusClientIT extends InfinispanQuarkusClientTest {
 }
diff --git a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java b/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientTest.java
similarity index 54%
copy from integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java
copy to integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientTest.java
index 25a4208dc0..7852e71263 100644
--- a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java
+++ b/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanQuarkusClientTest.java
@@ -16,8 +16,25 @@
  */
 package org.apache.camel.quarkus.component.infinispan;
 
-import io.quarkus.test.junit.QuarkusIntegrationTest;
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonTest;
+import org.junit.jupiter.api.Test;
 
-@QuarkusIntegrationTest
-public class InfinispanIT extends InfinispanTest {
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+
+@QuarkusTest
+@QuarkusTestResource(InfinispanServerTestResource.class)
+public class InfinispanQuarkusClientTest extends InfinispanCommonTest {
+
+    @Test
+    public void inspect() {
+        RestAssured.when()
+                .get("/infinispan/inspect")
+                .then().body(
+                        "hosts", is("none"),
+                        "cache-manager", notNullValue());
+    }
 }
diff --git a/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java b/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java
new file mode 100644
index 0000000000..f92c42e3da
--- /dev/null
+++ b/integration-tests/infinispan-quarkus-client/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java
@@ -0,0 +1,42 @@
+/*
+ * 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.quarkus.component.infinispan;
+
+import java.util.Map;
+
+import org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonServerTestResource;
+import org.infinispan.commons.util.OS;
+
+public class InfinispanServerTestResource extends InfinispanCommonServerTestResource {
+
+    @Override
+    public Map<String, String> start() {
+        Map<String, String> config = super.start();
+        config.put("quarkus.infinispan-client.server-list", getServerList());
+        config.put("quarkus.infinispan-client.auth-username", USER);
+        config.put("quarkus.infinispan-client.auth-password", PASS);
+        config.put("quarkus.infinispan-client.auth-realm", "default");
+        config.put("quarkus.infinispan-client.sasl-mechanism", "DIGEST-MD5");
+        config.put("quarkus.infinispan-client.auth-server-name", "infinispan");
+
+        if (OS.getCurrentOs().equals(OS.MAC_OS) || OS.getCurrentOs().equals(OS.WINDOWS)) {
+            config.put("quarkus.infinispan-client.client-intelligence", "BASIC");
+        }
+
+        return config;
+    }
+}
diff --git a/integration-tests/infinispan/pom.xml b/integration-tests/infinispan/pom.xml
index bca76cd9a0..add5e8dd6a 100644
--- a/integration-tests/infinispan/pom.xml
+++ b/integration-tests/infinispan/pom.xml
@@ -33,20 +33,9 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-infinispan</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-log</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-direct</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.camel.quarkus</groupId>
-            <artifactId>camel-quarkus-mock</artifactId>
+            <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
         </dependency>
+
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-resteasy</artifactId>
@@ -67,6 +56,12 @@
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.camel.quarkus</groupId>
+            <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
         <dependency>
             <groupId>org.testcontainers</groupId>
             <artifactId>testcontainers</artifactId>
@@ -123,58 +118,6 @@
             </activation>
             <dependencies>
                 <!-- The following dependencies guarantee that this module is built after them. You can update them by running `mvn process-resources -Pformat -N` from the source tree root directory -->
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-direct-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-infinispan-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-log-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
-                <dependency>
-                    <groupId>org.apache.camel.quarkus</groupId>
-                    <artifactId>camel-quarkus-mock-deployment</artifactId>
-                    <version>${project.version}</version>
-                    <type>pom</type>
-                    <scope>test</scope>
-                    <exclusions>
-                        <exclusion>
-                            <groupId>*</groupId>
-                            <artifactId>*</artifactId>
-                        </exclusion>
-                    </exclusions>
-                </dependency>
             </dependencies>
         </profile>
         <profile>
diff --git a/integration-tests/infinispan/src/main/java/InfinispanRoutes.java b/integration-tests/infinispan/src/main/java/InfinispanRoutes.java
new file mode 100644
index 0000000000..7c9e26c8da
--- /dev/null
+++ b/integration-tests/infinispan/src/main/java/InfinispanRoutes.java
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+
+import java.util.Map;
+
+import jakarta.inject.Named;
+import jakarta.ws.rs.Produces;
+import org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
+import org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonRoutes;
+import org.eclipse.microprofile.config.Config;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.infinispan.client.hotrod.configuration.Configuration;
+import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
+import org.infinispan.commons.marshall.ProtoStreamMarshaller;
+import org.infinispan.commons.util.OS;
+
+import static org.infinispan.client.hotrod.impl.ConfigurationProperties.CLIENT_INTELLIGENCE;
+import static org.infinispan.client.hotrod.impl.ConfigurationProperties.MARSHALLER;
+
+public class InfinispanRoutes extends InfinispanCommonRoutes {
+
+    @Produces
+    @Named("additionalConfig")
+    Map<String, String> additionalInfinispanConfig() {
+        Map<String, String> config = Map.of(MARSHALLER, ProtoStreamMarshaller.class.getName());
+        if (OS.getCurrentOs().equals(OS.MAC_OS) || OS.getCurrentOs().equals(OS.WINDOWS)) {
+            config.put(CLIENT_INTELLIGENCE, "BASIC");
+        }
+        return config;
+    }
+
+    @Override
+    protected Configuration getConfigurationBuilder() {
+        Config config = ConfigProvider.getConfig();
+        ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
+        String[] hostParts = config.getValue("camel.component.infinispan.hosts", String.class).split(":");
+
+        clientBuilder.addServer()
+                .host(hostParts[0])
+                .port(Integer.parseInt(hostParts[1]));
+
+        clientBuilder
+                .security()
+                .authentication()
+                .username(config.getValue("camel.component.infinispan.username", String.class))
+                .password(config.getValue("camel.component.infinispan.password", String.class))
+                .serverName(config.getValue("camel.component.infinispan.security-server-name", String.class))
+                .saslMechanism(config.getValue("camel.component.infinispan.sasl-mechanism", String.class))
+                .realm(config.getValue("camel.component.infinispan.security-realm", String.class))
+                .marshaller(new ProtoStreamMarshaller());
+
+        return clientBuilder.build();
+    }
+
+    @Override
+    protected InfinispanRemoteConfiguration getConfiguration() {
+        InfinispanRemoteConfiguration configuration = new InfinispanRemoteConfiguration();
+        configuration.setCacheContainerConfiguration(getConfigurationBuilder());
+        return configuration;
+    }
+}
diff --git a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanResources.java b/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanResources.java
deleted file mode 100644
index 79823b038a..0000000000
--- a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanResources.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*
- * 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.quarkus.component.infinispan;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
-import jakarta.json.Json;
-import jakarta.json.JsonObject;
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.PATCH;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.QueryParam;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.Response;
-import org.apache.camel.CamelContext;
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.component.infinispan.InfinispanConstants;
-import org.apache.camel.component.infinispan.InfinispanQueryBuilder;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.quarkus.component.infinispan.model.Person;
-import org.apache.camel.util.CollectionHelper;
-import org.infinispan.client.hotrod.RemoteCacheManager;
-import org.infinispan.client.hotrod.ServerStatistics;
-
-import static org.apache.camel.quarkus.component.infinispan.InfinispanRoutes.CORRELATOR_HEADER;
-
-@Path("/infinispan")
-@ApplicationScoped
-public class InfinispanResources {
-    public static final String CACHE_NAME_CAMEL = "camel";
-    public static final String CACHE_NAME_QUARKUS = "quarkus";
-
-    @Inject
-    RemoteCacheManager cacheManager;
-
-    @Inject
-    ProducerTemplate template;
-
-    @Inject
-    CamelContext camelContext;
-
-    @Path("/inspect")
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public JsonObject inspectCamelInfinispanClientConfiguration() {
-        InfinispanRemoteComponent component = camelContext.getComponent("infinispan", InfinispanRemoteComponent.class);
-
-        return Json.createObjectBuilder()
-                .add("hosts", component.getConfiguration().getHosts())
-                .add("cache-manager", Objects.toString(component.getConfiguration().getCacheContainer(), "none"))
-                .build();
-    }
-
-    @Path("/aggregate")
-    @GET
-    public void aggregate(@QueryParam("component") String component) throws InterruptedException {
-        String mockEndpointUri = component.equals("infinispan") ? "mock:camelAggregationResult"
-                : "mock:quarkusAggregationResult";
-        MockEndpoint mockEndpoint = camelContext.getEndpoint(mockEndpointUri, MockEndpoint.class);
-        mockEndpoint.expectedMessageCount(2);
-        mockEndpoint.expectedBodiesReceived(1 + 3 + 4 + 5, 6 + 7 + 20 + 21);
-
-        try {
-            String uri = component.equals("infinispan") ? "direct:camelAggregation" : "direct:quarkusAggregation";
-            Map<String, Object> headers = getCommonHeaders(component);
-            headers.put(CORRELATOR_HEADER, CORRELATOR_HEADER);
-
-            Stream.of(1, 3, 4, 5, 6, 7, 20, 21).forEach(value -> template.sendBodyAndHeaders(uri, value, headers));
-
-            mockEndpoint.assertIsSatisfied(15000);
-        } finally {
-            mockEndpoint.reset();
-        }
-    }
-
-    @Path("/clear")
-    @DELETE
-    public void clear(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        template.sendBodyAndHeaders("direct:clear", null, headers);
-    }
-
-    @Path("/clearAsync")
-    @DELETE
-    public void clearAsync(@QueryParam("component") String component)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:clearAsync", null, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/compute")
-    @POST
-    public void compute(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        template.sendBodyAndHeaders("direct:compute", null, headers);
-    }
-
-    @Path("/computeAsync")
-    @POST
-    public void computeAsync(@QueryParam("component") String component)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:computeAsync", null, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/containsKey")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Boolean containsKey(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        return template.requestBodyAndHeaders("direct:containsKey", null, headers, Boolean.class);
-    }
-
-    @Path("/containsValue")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Boolean containsValue(@QueryParam("component") String component, @QueryParam("value") String value) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        return template.requestBodyAndHeaders("direct:containsValue", value, headers, Boolean.class);
-    }
-
-    @Path("/event/verify")
-    @GET
-    public void listener(
-            @QueryParam("component") String component,
-            @QueryParam("mockEndpointUri") String mockEndpointUri,
-            String content) throws InterruptedException {
-        MockEndpoint mockEndpoint = camelContext.getEndpoint(mockEndpointUri, MockEndpoint.class);
-        mockEndpoint.expectedMessageCount(1);
-        mockEndpoint.message(0).header(InfinispanConstants.EVENT_TYPE).isEqualTo("CLIENT_CACHE_ENTRY_CREATED");
-        mockEndpoint.message(0).header(InfinispanConstants.CACHE_NAME).isNotNull();
-        mockEndpoint.message(0).header(InfinispanConstants.KEY).isEqualTo("the-key");
-
-        try {
-            Map<String, Object> headers = getCommonHeaders(component);
-            template.sendBodyAndHeaders("direct:put", content, headers);
-            mockEndpoint.assertIsSatisfied(5000);
-        } finally {
-            mockEndpoint.reset();
-        }
-    }
-
-    @Path("/get")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String get(@QueryParam("component") String component, @QueryParam("key") String key) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        headers.put(InfinispanConstants.KEY, Objects.requireNonNullElse(key, "the-key"));
-        return template.requestBodyAndHeaders("direct:get", null, headers, String.class);
-    }
-
-    @Path("/getOrDefault")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public String getOrDefault(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        return template.requestBodyAndHeaders("direct:getOrDefault", null, headers, String.class);
-    }
-
-    @Path("/put")
-    @POST
-    @Consumes(MediaType.TEXT_PLAIN)
-    @Produces(MediaType.TEXT_PLAIN)
-    public String put(@QueryParam("component") String component, String content) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        return template.requestBodyAndHeaders("direct:put", content, headers, String.class);
-    }
-
-    @Path("/putAsync")
-    @POST
-    @Consumes(MediaType.TEXT_PLAIN)
-    public void putAsync(@QueryParam("component") String component, String content)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:putAsync", content, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/putAll")
-    @POST
-    public void putAll(@QueryParam("component") String component) {
-        Map<String, String> body = CollectionHelper.mapOf("key-1", "value-1", "key-2", "value-2");
-        Map<String, Object> headers = getCommonHeaders(component);
-        template.sendBodyAndHeaders("direct:putAll", body, headers);
-    }
-
-    @Path("/putAllAsync")
-    @POST
-    public void putAllAsync(@QueryParam("component") String component)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, String> body = CollectionHelper.mapOf("key-1", "value-1", "key-2", "value-2");
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:putAllAsync", body, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/putIdempotent")
-    @GET
-    public void putIdempotent(@QueryParam("component") String component) throws InterruptedException {
-        String mockEndpointUri = component.equals("infinispan") ? "mock:camelResultIdempotent" : "mock:quarkusResultIdempotent";
-        MockEndpoint mockEndpoint = camelContext.getEndpoint(mockEndpointUri, MockEndpoint.class);
-        mockEndpoint.expectedMessageCount(1);
-
-        String messageId = UUID.randomUUID().toString();
-        String uri = component.equals("infinispan") ? "direct:camelIdempotent" : "direct:quarkusIdempotent";
-        try {
-            IntStream.of(1, 10).forEach(value -> {
-                Map<String, Object> headers = getCommonHeaders(component);
-                headers.put("MessageId", messageId);
-                template.sendBodyAndHeaders(uri, "Message " + value, headers);
-            });
-
-            mockEndpoint.assertIsSatisfied(5000);
-        } finally {
-            mockEndpoint.reset();
-        }
-    }
-
-    @Path("/putIfAbsent")
-    @POST
-    @Consumes(MediaType.TEXT_PLAIN)
-    @Produces(MediaType.TEXT_PLAIN)
-    public String putIfAbsent(@QueryParam("component") String component, String content) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        return template.requestBodyAndHeaders("direct:putIfAbsent", content, headers, String.class);
-    }
-
-    @Path("/putIfAbsentAsync")
-    @POST
-    @Consumes(MediaType.TEXT_PLAIN)
-    public void putIfAbsentAsync(@QueryParam("component") String component, String content)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:putIfAbsentAsync", content, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/query")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    @SuppressWarnings("unchecked")
-    public Response query(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        String cacheName = (String) headers.get("cacheName");
-
-        cacheManager.getCache(cacheName).put("person", new Person("Test", "Person"));
-
-        String query = "FROM person.Person WHERE firstName = 'Test'";
-        InfinispanQueryBuilder builder = InfinispanQueryBuilder.create(query);
-
-        headers.put(InfinispanConstants.QUERY_BUILDER, builder);
-
-        List<String> result = template.requestBodyAndHeaders("direct:query", null, headers, List.class);
-        if (result.isEmpty()) {
-            return Response.status(404).build();
-        }
-        return Response.ok().entity(result.get(0)).build();
-    }
-
-    @Path("/remove")
-    @DELETE
-    public void remove(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        template.requestBodyAndHeaders("direct:remove", null, headers, String.class);
-    }
-
-    @Path("/removeAsync")
-    @DELETE
-    public void removeAsync(@QueryParam("component") String component)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:removeAsync", null, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/replace")
-    @PATCH
-    @Consumes(MediaType.TEXT_PLAIN)
-    public void replace(@QueryParam("component") String component, String content) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        template.sendBodyAndHeaders("direct:replace", content, headers);
-    }
-
-    @Path("/replaceAsync")
-    @PATCH
-    @Consumes(MediaType.TEXT_PLAIN)
-    public void replaceAsync(@QueryParam("component") String component, String content)
-            throws ExecutionException, InterruptedException, TimeoutException {
-        Map<String, Object> headers = getCommonHeaders(component);
-        CompletableFuture<?> future = template.requestBodyAndHeaders("direct:replaceAsync", content, headers,
-                CompletableFuture.class);
-        future.get(5, TimeUnit.SECONDS);
-    }
-
-    @Path("/size")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Integer size(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        return template.requestBodyAndHeaders("direct:size", null, headers, Integer.class);
-    }
-
-    @Path("/stats")
-    @GET
-    @Produces(MediaType.TEXT_PLAIN)
-    public Integer stats(@QueryParam("component") String component) {
-        Map<String, Object> headers = getCommonHeaders(component);
-        ServerStatistics statistics = template.requestBodyAndHeaders("direct:stats", null, headers, ServerStatistics.class);
-        return statistics.getIntStatistic(ServerStatistics.APPROXIMATE_ENTRIES);
-    }
-
-    @POST
-    @Path("consumer/{routeId}/{enabled}")
-    public void manageRoute(
-            @PathParam("routeId") String routeId,
-            @PathParam("enabled") boolean enabled) throws Exception {
-        if (enabled) {
-            camelContext.getRouteController().startRoute(routeId);
-        } else {
-            camelContext.getRouteController().stopRoute(routeId);
-        }
-    }
-
-    private Map<String, Object> getCommonHeaders(String componentName) {
-        Map<String, Object> headers = new HashMap<>();
-        headers.put("component", componentName);
-
-        if (componentName.equals("infinispan")) {
-            headers.put("cacheName", CACHE_NAME_CAMEL);
-        } else {
-            headers.put("cacheName", CACHE_NAME_QUARKUS);
-        }
-
-        return headers;
-    }
-}
diff --git a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanRoutes.java b/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanRoutes.java
deleted file mode 100644
index 967e9c1051..0000000000
--- a/integration-tests/infinispan/src/main/java/org/apache/camel/quarkus/component/infinispan/InfinispanRoutes.java
+++ /dev/null
@@ -1,305 +0,0 @@
-/*
- * 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.quarkus.component.infinispan;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-import jakarta.inject.Named;
-import org.apache.camel.AggregationStrategy;
-import org.apache.camel.CamelContext;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.infinispan.InfinispanConstants;
-import org.apache.camel.component.infinispan.InfinispanOperation;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteAggregationRepository;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponent;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteComponentConfigurer;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteConfiguration;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteCustomListener;
-import org.apache.camel.component.infinispan.remote.InfinispanRemoteIdempotentRepository;
-import org.eclipse.microprofile.config.Config;
-import org.eclipse.microprofile.config.ConfigProvider;
-import org.infinispan.client.hotrod.RemoteCacheManager;
-import org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated;
-import org.infinispan.client.hotrod.annotation.ClientListener;
-import org.infinispan.client.hotrod.configuration.Configuration;
-import org.infinispan.client.hotrod.configuration.ConfigurationBuilder;
-import org.infinispan.client.hotrod.event.ClientCacheEntryCreatedEvent;
-import org.infinispan.commons.marshall.StringMarshaller;
-
-import static org.apache.camel.quarkus.component.infinispan.InfinispanResources.CACHE_NAME_CAMEL;
-import static org.apache.camel.quarkus.component.infinispan.InfinispanResources.CACHE_NAME_QUARKUS;
-
-public class InfinispanRoutes extends RouteBuilder {
-    public static final int COMPLETION_SIZE = 4;
-    public static final String CORRELATOR_HEADER = "CORRELATOR_HEADER";
-
-    @Override
-    public void configure() {
-        from("direct:clear")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CLEAR)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:clearAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CLEARASYNC)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:compute")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.COMPUTE)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}?remappingFunction=#customMappingFunction");
-
-        from("direct:computeAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.COMPUTEASYNC)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}?remappingFunction=#customMappingFunction");
-
-        from("direct:containsKey")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CONTAINSKEY)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:containsValue")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.CONTAINSVALUE)
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:get")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GET)
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:getOrDefault")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.GETORDEFAULT)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.DEFAULT_VALUE).constant("default-value")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:put")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUT)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:putAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTASYNC)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:putAll")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTALL)
-                .setHeader(InfinispanConstants.MAP).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:putAllAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTALLASYNC)
-                .setHeader(InfinispanConstants.MAP).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:putIfAbsent")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTIFABSENT)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:putIfAbsentAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.PUTIFABSENTASYNC)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:query")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.QUERY)
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:remove")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REMOVE)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:removeAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REMOVEASYNC)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:replace")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REPLACE)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:replaceAsync")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.REPLACEASYNC)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .setHeader(InfinispanConstants.VALUE).body()
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:size")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.SIZE)
-                .setHeader(InfinispanConstants.KEY).constant("the-key")
-                .toD("${header.component}:${header.cacheName}");
-
-        from("direct:stats")
-                .setHeader(InfinispanConstants.OPERATION).constant(InfinispanOperation.STATS)
-                .toD("${header.component}:${header.cacheName}");
-
-        from("infinispan:camel?eventTypes=CLIENT_CACHE_ENTRY_CREATED")
-                .id("infinispan-events")
-                .autoStartup(false)
-                .to("mock:camelResultCreated");
-
-        from("direct:camelAggregation")
-                .aggregate(header(CORRELATOR_HEADER))
-                .aggregationRepository(createAggregationRepository("infinispan"))
-                .aggregationStrategy(createAggregationStrategy())
-                .completionSize(COMPLETION_SIZE)
-                .to("mock:camelAggregationResult");
-
-        from("direct:quarkusAggregation")
-                .aggregate(header(CORRELATOR_HEADER))
-                .aggregationRepository(createAggregationRepository("infinispan-quarkus"))
-                .aggregationStrategy(createAggregationStrategy())
-                .completionSize(COMPLETION_SIZE)
-                .to("mock:quarkusAggregationResult");
-
-        from("direct:camelIdempotent")
-                .idempotentConsumer(header("MessageID"), createIdempotentRepository("infinispan"))
-                .to("mock:camelResultIdempotent");
-
-        from("direct:quarkusIdempotent")
-                .idempotentConsumer(header("MessageID"), createIdempotentRepository("infinispan-quarkus"))
-                .to("mock:quarkusResultIdempotent");
-
-        from("infinispan-quarkus:quarkus?eventTypes=CLIENT_CACHE_ENTRY_CREATED")
-                .id("infinispan-quarkus-events")
-                .autoStartup(false)
-                .to("mock:quarkusResultCreated");
-
-        from("infinispan:camel?customListener=#customListener")
-                .id("infinispan-custom-listener")
-                .autoStartup(false)
-                .to("mock:camelResultCustomListener");
-
-        from("infinispan-quarkus:quarkus?customListener=#customListener")
-                .id("infinispan-quarkus-custom-listener")
-                .autoStartup(false)
-                .to("mock:quarkusResultCustomListener");
-    }
-
-    @Named("infinispan-quarkus")
-    public InfinispanRemoteComponent infinispanQuarkus() {
-        // This component will have its cacheContainer option autowired to use the one created by the Quarkus Infinispan extension
-        return new InfinispanRemoteComponent();
-    }
-
-    @Named("infinispan-quarkus-component")
-    public InfinispanRemoteComponentConfigurer quarkusInfinispanConfigurer() {
-        return new InfinispanRemoteComponentConfigurer();
-    }
-
-    @Named("customMappingFunction")
-    public BiFunction<String, String, String> mappingFunction() {
-        return (k, v) -> v + "-remapped";
-    }
-
-    @Named("customListener")
-    public InfinispanRemoteCustomListener customListener() {
-        return new CustomListener();
-    }
-
-    private InfinispanRemoteIdempotentRepository createIdempotentRepository(String componentName) {
-        String cacheName = componentName.equals("infinispan") ? CACHE_NAME_CAMEL : CACHE_NAME_QUARKUS;
-        InfinispanRemoteConfiguration configuration = getConfiguration(componentName);
-        InfinispanRemoteIdempotentRepository repository = new InfinispanRemoteIdempotentRepository(cacheName);
-        repository.setConfiguration(configuration);
-        return repository;
-    }
-
-    private InfinispanRemoteAggregationRepository createAggregationRepository(String componentName) {
-        String cacheName = componentName.equals("infinispan") ? CACHE_NAME_CAMEL : CACHE_NAME_QUARKUS;
-        InfinispanRemoteAggregationRepository aggregationRepository = new InfinispanRemoteAggregationRepository(cacheName);
-        InfinispanRemoteConfiguration configuration = getConfiguration(componentName);
-        aggregationRepository.setConfiguration(configuration);
-        return aggregationRepository;
-    }
-
-    private InfinispanRemoteConfiguration getConfiguration(String componentName) {
-        CamelContext camelContext = getCamelContext();
-        InfinispanRemoteComponent component = camelContext.getComponent(componentName, InfinispanRemoteComponent.class);
-        InfinispanRemoteConfiguration configuration = component.getConfiguration().clone();
-        configuration.setCacheContainerConfiguration(getConfigurationBuilder());
-        Set<RemoteCacheManager> beans = camelContext.getRegistry().findByType(RemoteCacheManager.class);
-        RemoteCacheManager cacheManager = beans.iterator().next();
-        configuration.setCacheContainer(cacheManager);
-        return configuration;
-    }
-
-    private Configuration getConfigurationBuilder() {
-        Config config = ConfigProvider.getConfig();
-        ConfigurationBuilder clientBuilder = new ConfigurationBuilder();
-        String[] hostParts = config.getValue("quarkus.infinispan-client.server-list", String.class).split(":");
-
-        clientBuilder.addServer()
-                .host(hostParts[0])
-                .port(Integer.parseInt(hostParts[1]));
-
-        clientBuilder
-                .security()
-                .authentication()
-                .username(config.getValue("quarkus.infinispan-client.auth-username", String.class))
-                .password(config.getValue("quarkus.infinispan-client.auth-password", String.class))
-                .serverName(config.getValue("quarkus.infinispan-client.auth-server-name", String.class))
-                .saslMechanism(config.getValue("quarkus.infinispan-client.sasl-mechanism", String.class))
-                .realm(config.getValue("quarkus.infinispan-client.auth-realm", String.class))
-                .marshaller(new StringMarshaller(StandardCharsets.UTF_8));
-
-        return clientBuilder.build();
-    }
-
-    private AggregationStrategy createAggregationStrategy() {
-        return (oldExchange, newExchange) -> {
-            if (oldExchange == null) {
-                return newExchange;
-            } else {
-                Integer n = newExchange.getIn().getBody(Integer.class);
-                Integer o = oldExchange.getIn().getBody(Integer.class);
-                Integer v = (o == null ? 0 : o) + (n == null ? 0 : n);
-                oldExchange.getIn().setBody(v, Integer.class);
-                return oldExchange;
-            }
-        };
-    }
-
-    @ClientListener
-    static final class CustomListener extends InfinispanRemoteCustomListener {
-
-        @ClientCacheEntryCreated
-        public void entryCreated(ClientCacheEntryCreatedEvent<?> event) {
-            if (isAccepted(event.getType())) {
-                getEventProcessor().processEvent(
-                        event.getType().toString(),
-                        getCacheName(),
-                        event.getKey(),
-                        null,
-                        null);
-            }
-        }
-    }
-}
diff --git a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java b/integration-tests/infinispan/src/test/java/InfinispanIT.java
similarity index 94%
rename from integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java
rename to integration-tests/infinispan/src/test/java/InfinispanIT.java
index 25a4208dc0..3f9b0daaaf 100644
--- a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanIT.java
+++ b/integration-tests/infinispan/src/test/java/InfinispanIT.java
@@ -14,7 +14,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.quarkus.component.infinispan;
 
 import io.quarkus.test.junit.QuarkusIntegrationTest;
 
diff --git a/integration-tests/infinispan/src/test/java/InfinispanServerTestResource.java b/integration-tests/infinispan/src/test/java/InfinispanServerTestResource.java
new file mode 100644
index 0000000000..e60b099eb9
--- /dev/null
+++ b/integration-tests/infinispan/src/test/java/InfinispanServerTestResource.java
@@ -0,0 +1,40 @@
+/*
+ * 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.
+ */
+
+import java.util.Map;
+
+import org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonServerTestResource;
+
+public class InfinispanServerTestResource extends InfinispanCommonServerTestResource {
+
+    @Override
+    public Map<String, String> start() {
+        Map<String, String> config = super.start();
+
+        config.put("camel.component.infinispan.autowired-enabled", "false");
+        config.put("camel.component.infinispan.hosts", getServerList());
+        config.put("camel.component.infinispan.username", USER);
+        config.put("camel.component.infinispan.password", PASS);
+        config.put("camel.component.infinispan.secure", "true");
+        config.put("camel.component.infinispan.security-realm", "default");
+        config.put("camel.component.infinispan.sasl-mechanism", "DIGEST-MD5");
+        config.put("camel.component.infinispan.security-server-name", "infinispan");
+        config.put("camel.component.infinispan.configuration-properties", "#additionalConfig");
+
+        return config;
+    }
+}
diff --git a/integration-tests/infinispan/src/test/java/InfinispanTest.java b/integration-tests/infinispan/src/test/java/InfinispanTest.java
new file mode 100644
index 0000000000..c363e71e70
--- /dev/null
+++ b/integration-tests/infinispan/src/test/java/InfinispanTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+import io.quarkus.test.common.QuarkusTestResource;
+import io.quarkus.test.junit.QuarkusTest;
+import io.restassured.RestAssured;
+import org.apache.camel.quarkus.component.infinispan.common.InfinispanCommonTest;
+import org.eclipse.microprofile.config.ConfigProvider;
+import org.junit.jupiter.api.Disabled;
+
+import static org.hamcrest.Matchers.is;
+
+@QuarkusTest
+@QuarkusTestResource(InfinispanServerTestResource.class)
+public class InfinispanTest extends InfinispanCommonTest {
+    public void inspect() {
+        String hosts = ConfigProvider.getConfig().getValue("camel.component.infinispan.hosts", String.class);
+        RestAssured.when()
+                .get("/infinispan/inspect")
+                .then().body(
+                        "hosts", is(hosts),
+                        "cache-manager", is("none"));
+    }
+
+    @Disabled
+    @Override
+    public void query() {
+        super.query();
+    }
+}
diff --git a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java b/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java
deleted file mode 100644
index 0f229ec59c..0000000000
--- a/integration-tests/infinispan/src/test/java/org/apache/camel/quarkus/component/infinispan/InfinispanServerTestResource.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * 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.quarkus.component.infinispan;
-
-import java.util.Map;
-
-import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
-import org.apache.camel.util.CollectionHelper;
-import org.apache.commons.lang3.SystemUtils;
-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.TestcontainersConfiguration;
-
-public class InfinispanServerTestResource implements QuarkusTestResourceLifecycleManager {
-    private static final Logger LOGGER = LoggerFactory.getLogger(InfinispanServerTestResource.class);
-    private static final String CONTAINER_IMAGE = System.getProperty("infinispan.container.image", "infinispan/server:13.0");
-    private static final int HOTROD_PORT = 11222;
-    private static final String USER = "camel";
-    private static final String PASS = "camel";
-
-    private GenericContainer<?> container;
-
-    @Override
-    public Map<String, String> start() {
-        LOGGER.info(TestcontainersConfiguration.getInstance().toString());
-
-        try {
-            container = new GenericContainer<>(CONTAINER_IMAGE)
-                    .withExposedPorts(HOTROD_PORT)
-                    .withEnv("USER", USER)
-                    .withEnv("PASS", PASS)
-                    .withClasspathResourceMapping("infinispan.xml", "/user-config/infinispan.xml", BindMode.READ_ONLY)
-                    .withCommand("-c", "/user-config/infinispan.xml")
-                    .waitingFor(Wait.forListeningPort());
-
-            container.start();
-
-            String serverList = String.format("%s:%s", container.getHost(),
-                    container.getMappedPort(HOTROD_PORT));
-
-            // Create 2 sets of configuration to test scenarios:
-            // - Quarkus Infinispan client bean being autowired into the Camel Infinispan component
-            // - Component configuration where the Infinispan client is managed by Camel (E.g Infinispan client autowiring disabled)
-            Map<String, String> result = CollectionHelper.mapOf(
-                    // quarkus
-                    "quarkus.infinispan-client.server-list", serverList,
-                    "quarkus.infinispan-client.auth-username", USER,
-                    "quarkus.infinispan-client.auth-password", PASS,
-                    "quarkus.infinispan-client.auth-realm", "default",
-                    "quarkus.infinispan-client.sasl-mechanism", "DIGEST-MD5",
-                    "quarkus.infinispan-client.auth-server-name", "infinispan",
-                    // camel
-                    "camel.component.infinispan.autowired-enabled", "false",
-                    "camel.component.infinispan.hosts", serverList,
-                    "camel.component.infinispan.username", USER,
-                    "camel.component.infinispan.password", PASS,
-                    "camel.component.infinispan.secure", "true",
-                    "camel.component.infinispan.security-realm", "default",
-                    "camel.component.infinispan.sasl-mechanism", "DIGEST-MD5",
-                    "camel.component.infinispan.security-server-name",
-                    "infinispan");
-            if (SystemUtils.IS_OS_MAC || SystemUtils.IS_OS_WINDOWS) {
-                /* Fix for https://github.com/apache/camel-quarkus/issues/2840 */
-                result.put("quarkus.infinispan-client.client-intelligence", "BASIC");
-            }
-            return result;
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    @Override
-    public void stop() {
-        try {
-            if (container != null) {
-                container.stop();
-            }
-        } catch (Exception e) {
-            // ignored
-        }
-    }
-}
diff --git a/integration-tests/pom.xml b/integration-tests/pom.xml
index 73bde9a35d..f6fb866f22 100644
--- a/integration-tests/pom.xml
+++ b/integration-tests/pom.xml
@@ -111,7 +111,9 @@
         <module>headersmap</module>
         <module>hl7</module>
         <module>http</module>
-        <module>infinispan</module>
+	<module>infinispan</module>
+        <module>infinispan-common</module>
+        <module>infinispan-quarkus-client</module>
         <module>influxdb</module>
         <module>jackson-avro</module>
         <module>jackson-protobuf</module>
diff --git a/poms/bom-test/pom.xml b/poms/bom-test/pom.xml
index e22046db8f..78b177fe13 100644
--- a/poms/bom-test/pom.xml
+++ b/poms/bom-test/pom.xml
@@ -188,6 +188,17 @@
                 <version>${camel-quarkus.version}</version>
             </dependency>
 
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
+                <version>${camel-quarkus.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel.quarkus</groupId>
+                <artifactId>camel-quarkus-integration-test-infinispan-common</artifactId>
+                <version>${camel-quarkus.version}</version>
+                <type>test-jar</type>
+            </dependency>
             <dependency>
                 <groupId>org.apache.camel.quarkus</groupId>
                 <artifactId>camel-quarkus-integration-test-messaging-common</artifactId>
diff --git a/tooling/scripts/test-categories.yaml b/tooling/scripts/test-categories.yaml
index 937b91a79d..5658ae216b 100644
--- a/tooling/scripts/test-categories.yaml
+++ b/tooling/scripts/test-categories.yaml
@@ -22,6 +22,7 @@ group-01:
   - google-storage
   - http
   - infinispan
+  - infinispan-quarkus-client
   - jcache
   - jms-artemis-client
   - jsch
diff --git a/tooling/scripts/validate-github-workflows.groovy b/tooling/scripts/validate-github-workflows.groovy
index cab11d1e44..2b3bddc049 100644
--- a/tooling/scripts/validate-github-workflows.groovy
+++ b/tooling/scripts/validate-github-workflows.groovy
@@ -33,6 +33,7 @@ final Set<String> executedBaseNames = [] as Set
 
 // Add any ignored itest modules here. Or prefix the module name with '#' to disable it
 final List<String> excludedModules = [
+    'infinispan-common',
     'messaging',
     'nats'
 ] as List