You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by jk...@apache.org on 2022/07/25 14:49:02 UTC

[unomi] branch migrationTests created (now b63144ac6)

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

jkevan pushed a change to branch migrationTests
in repository https://gitbox.apache.org/repos/asf/unomi.git


      at b63144ac6 UNOMI-203: improve integration test to use KarafTestSupport

This branch includes the following new commits:

     new b63144ac6 UNOMI-203: improve integration test to use KarafTestSupport

The 1 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.



[unomi] 01/01: UNOMI-203: improve integration test to use KarafTestSupport

Posted by jk...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

jkevan pushed a commit to branch migrationTests
in repository https://gitbox.apache.org/repos/asf/unomi.git

commit b63144ac63a3a8770a22912e9208a41b06e7bebc
Author: Kevan <ke...@jahia.com>
AuthorDate: Mon Jul 25 16:48:48 2022 +0200

    UNOMI-203: improve integration test to use KarafTestSupport
---
 itests/pom.xml                                     | 138 ++++++++++-----------
 .../test/java/org/apache/unomi/itests/BaseIT.java  | 132 +++++++-------------
 .../test/java/org/apache/unomi/itests/BasicIT.java |  32 +++--
 .../org/apache/unomi/itests/ContextServletIT.java  |  64 +++++-----
 .../org/apache/unomi/itests/InputValidationIT.java |  34 ++---
 .../java/org/apache/unomi/itests/JSONSchemaIT.java |   6 +-
 .../itests/ProfileServiceWithoutOverwriteIT.java   |   2 +-
 .../java/org/apache/unomi/itests/SecurityIT.java   |   4 +-
 .../apache/unomi/itests/graphql/BaseGraphQLIT.java |  10 +-
 .../unomi/itests/graphql/GraphQLEventIT.java       |   8 +-
 .../unomi/itests/graphql/GraphQLProfileIT.java     |   4 +-
 .../unomi/itests/graphql/GraphQLSegmentIT.java     |   2 +-
 .../unomi/itests/graphql/GraphQLSourceIT.java      |   2 +-
 .../unomi/itests/graphql/GraphQLTopicIT.java       |   2 +-
 .../unomi/itests/graphql/GraphQLWebSocketIT.java   |   4 +-
 .../ElasticSearchPersistenceServiceImpl.java       |  11 --
 pom.xml                                            |   1 +
 17 files changed, 195 insertions(+), 261 deletions(-)

diff --git a/itests/pom.xml b/itests/pom.xml
index b65bce832..c808b5c63 100644
--- a/itests/pom.xml
+++ b/itests/pom.xml
@@ -28,127 +28,112 @@
     <name>Apache Unomi :: Integration Tests</name>
     <description>Apache Unomi Context Server integration tests</description>
 
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.apache.karaf</groupId>
+                <artifactId>karaf-bom</artifactId>
+                <version>${karaf.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+
     <dependencies>
+        <!-- Provide the KarafTestSupport -->
         <dependency>
-            <groupId>org.apache.unomi</groupId>
-            <artifactId>unomi</artifactId>
-            <version>${project.version}</version>
-            <type>tar.gz</type>
+            <groupId>org.apache.karaf.itests</groupId>
+            <artifactId>common</artifactId>
+            <version>${karaf.version}</version>
             <scope>test</scope>
         </dependency>
+        <!-- Define the Apache Karaf version to download and use for the test -->
+        <!-- We use a released version here to avoid SNAPSHOT resolution -->
         <dependency>
             <groupId>org.apache.unomi</groupId>
-            <artifactId>unomi-router-karaf-feature</artifactId>
-            <classifier>features</classifier>
+            <artifactId>unomi</artifactId>
             <version>${project.version}</version>
-            <type>xml</type>
+            <type>tar.gz</type>
             <scope>test</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.apache.karaf</groupId>
+                    <artifactId>org.apache.karaf.client</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.apache.httpcomponents</groupId>
+                    <artifactId>httpclient-osgi</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
+        <!-- Required to use shell commands in the tests -->
         <dependency>
-            <groupId>org.apache.unomi</groupId>
-            <artifactId>cdp-graphql-feature</artifactId>
-            <classifier>features</classifier>
-            <version>${project.version}</version>
-            <type>xml</type>
+            <groupId>org.apache.karaf.shell</groupId>
+            <artifactId>org.apache.karaf.shell.core</artifactId>
             <scope>test</scope>
         </dependency>
+        <!-- Provide the PaxExam Karaf support -->
         <dependency>
-            <groupId>org.apache.unomi</groupId>
-            <artifactId>unomi-persistence-spi</artifactId>
-            <version>${project.version}</version>
-            <scope>provided</scope>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-container-karaf</artifactId>
+            <scope>test</scope>
         </dependency>
+        <!-- Provide the PaxExam JUnit extension -->
         <dependency>
-            <groupId>org.apache.unomi</groupId>
-            <artifactId>unomi-wab</artifactId>
-            <version>${project.version}</version>
+            <groupId>org.ops4j.pax.exam</groupId>
+            <artifactId>pax-exam-junit4</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.unomi</groupId>
-            <artifactId>unomi-lifecycle-watcher</artifactId>
-            <version>${project.version}</version>
+            <groupId>org.apache.geronimo.specs</groupId>
+            <artifactId>geronimo-atinject_1.0_spec</artifactId>
+            <version>1.2</version>
             <scope>test</scope>
         </dependency>
-
         <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-api</artifactId>
-            <scope>provided</scope>
+            <groupId>org.awaitility</groupId>
+            <artifactId>awaitility</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.codehaus.groovy</groupId>
-            <artifactId>groovy</artifactId>
-            <version>${groovy.version}</version>
-            <scope>provided</scope>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.hamcrest</artifactId>
+            <version>1.3_1</version>
+            <scope>runtime</scope>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpclient-osgi</artifactId>
-            <type>bundle</type>
+            <version>4.5.5</version>
         </dependency>
         <dependency>
             <groupId>org.apache.httpcomponents</groupId>
             <artifactId>httpcore-osgi</artifactId>
+            <version>4.4.9</version>
         </dependency>
         <dependency>
             <groupId>org.eclipse.jetty.websocket</groupId>
             <artifactId>websocket-client</artifactId>
             <version>9.4.28.v20200408</version>
-            <type>bundle</type>
-        </dependency>
-
-
-        <!-- Dependencies for pax exam karaf container -->
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-container-karaf</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam-junit4</artifactId>
-            <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.ops4j.pax.exam</groupId>
-            <artifactId>pax-exam</artifactId>
+            <groupId>org.apache.unomi</groupId>
+            <artifactId>unomi-lifecycle-watcher</artifactId>
+            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.ops4j.pax.url</groupId>
-            <artifactId>pax-url-aether</artifactId>
+            <groupId>org.apache.unomi</groupId>
+            <artifactId>unomi-persistence-spi</artifactId>
+            <version>${project.version}</version>
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>javax.inject</groupId>
-            <artifactId>javax.inject</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.osgi</groupId>
-            <artifactId>osgi.core</artifactId>
+            <groupId>org.codehaus.groovy</groupId>
+            <artifactId>groovy</artifactId>
+            <version>${groovy.version}</version>
             <scope>provided</scope>
         </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.slf4j</groupId>
-            <artifactId>slf4j-simple</artifactId>
-            <version>1.6.6</version>
-            <scope>test</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>org.ops4j.pax.url</groupId>
-            <artifactId>pax-url-wrap</artifactId>
-            <classifier>uber</classifier>
-            <version>2.5.4</version>
-            <scope>test</scope>
-        </dependency>
     </dependencies>
 
     <profiles>
@@ -249,6 +234,9 @@
                             <includes>
                                 <include>**/*AllITs.java</include>
                             </includes>
+                            <systemPropertyVariables>
+                                <my.system.property>foo</my.system.property>
+                            </systemPropertyVariables>
                         </configuration>
                         <executions>
                             <execution>
diff --git a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
index 0c400b920..ea632da58 100644
--- a/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/BaseIT.java
@@ -42,6 +42,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+import org.apache.karaf.itests.KarafTestSupport;
 import org.apache.unomi.api.Item;
 import org.apache.unomi.api.conditions.Condition;
 import org.apache.unomi.api.rules.Rule;
@@ -58,14 +59,11 @@ import org.ops4j.pax.exam.Configuration;
 import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.junit.PaxExam;
-import org.ops4j.pax.exam.karaf.container.internal.JavaVersionUtil;
 import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
 import org.ops4j.pax.exam.options.MavenArtifactUrlReference;
-import org.ops4j.pax.exam.options.extra.VMOption;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerSuite;
 import org.ops4j.pax.exam.util.Filter;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceListener;
@@ -81,9 +79,6 @@ import javax.net.ssl.X509TrustManager;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
@@ -97,15 +92,10 @@ import java.util.Objects;
 import java.util.concurrent.CountDownLatch;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
+import java.util.stream.Stream;
 
-import static org.ops4j.pax.exam.CoreOptions.maven;
 import static org.ops4j.pax.exam.CoreOptions.systemProperty;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.debugConfiguration;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRuntimeFolder;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
-import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceConfigurationFile;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.*;
 
 /**
  * Base class for integration tests.
@@ -114,13 +104,10 @@ import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.replaceCo
  */
 @RunWith(PaxExam.class)
 @ExamReactorStrategy(PerSuite.class)
-public abstract class BaseIT {
+public abstract class BaseIT extends KarafTestSupport {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(BaseIT.class);
 
-    protected static final String HTTP_PORT = "8181";
-    protected static final String URL = "http://localhost:" + HTTP_PORT;
-    protected static final String KARAF_DIR = "target/exam";
     protected static final String UNOMI_KEY = "670c26d1cc413346c3b2fd9ce65dab41";
     protected static final ContentType JSON_CONTENT_TYPE = ContentType.create("application/json");
     protected static final String BASE_URL = "http://localhost";
@@ -198,55 +185,53 @@ public abstract class BaseIT {
         Thread.sleep(1000);
     }
 
-    @Configuration
-    public Option[] config() throws InterruptedException {
-
-        MavenArtifactUrlReference karafUrl = maven().groupId("org.apache.unomi").artifactId("unomi").type("tar.gz").versionAsInProject();
-
-        List<Option> options = new ArrayList<>();
+    @Override
+    public MavenArtifactUrlReference getKarafDistribution() {
+        return CoreOptions.maven().groupId("org.apache.unomi").artifactId("unomi").versionAsInProject().type("tar.gz");
+    }
 
-        Option[] commonOptions = new Option[] {
-                karafDistributionConfiguration().frameworkUrl(karafUrl).unpackDirectory(new File(KARAF_DIR)).useDeployFolder(true),
+    @Configuration
+    public Option[] config() {
+        System.out.println("==== Configuring container");
+        Option[] options = new Option[]{
                 replaceConfigurationFile("etc/org.apache.unomi.router.cfg", new File("src/test/resources/org.apache.unomi.router.cfg")),
                 replaceConfigurationFile("data/tmp/1-basic-test.csv", new File("src/test/resources/1-basic-test.csv")),
                 replaceConfigurationFile("data/tmp/recurrent_import/2-surfers-test.csv", new File("src/test/resources/2-surfers-test.csv")),
-                replaceConfigurationFile("data/tmp/recurrent_import/3-surfers-overwrite-test.csv",
-                        new File("src/test/resources/3-surfers-overwrite-test.csv")),
-                replaceConfigurationFile("data/tmp/recurrent_import/4-surfers-delete-test.csv",
-                        new File("src/test/resources/4-surfers-delete-test.csv")),
+                replaceConfigurationFile("data/tmp/recurrent_import/3-surfers-overwrite-test.csv", new File("src/test/resources/3-surfers-overwrite-test.csv")),
+                replaceConfigurationFile("data/tmp/recurrent_import/4-surfers-delete-test.csv", new File("src/test/resources/4-surfers-delete-test.csv")),
                 replaceConfigurationFile("data/tmp/recurrent_import/5-ranking-test.csv", new File("src/test/resources/5-ranking-test.csv")),
                 replaceConfigurationFile("data/tmp/recurrent_import/6-actors-test.csv", new File("src/test/resources/6-actors-test.csv")),
                 replaceConfigurationFile("data/tmp/testLogin.json", new File("src/test/resources/testLogin.json")),
                 replaceConfigurationFile("data/tmp/testCopyProperties.json", new File("src/test/resources/testCopyProperties.json")),
-                replaceConfigurationFile("data/tmp/testCopyPropertiesWithoutSystemTags.json",
-                        new File("src/test/resources/testCopyPropertiesWithoutSystemTags.json")),
-                replaceConfigurationFile("data/tmp/testLoginEventCondition.json",
-                        new File("src/test/resources/testLoginEventCondition.json")),
-                replaceConfigurationFile("data/tmp/testClickEventCondition.json",
-                        new File("src/test/resources/testClickEventCondition.json")),
+                replaceConfigurationFile("data/tmp/testCopyPropertiesWithoutSystemTags.json", new File("src/test/resources/testCopyPropertiesWithoutSystemTags.json")),
+                replaceConfigurationFile("data/tmp/testLoginEventCondition.json", new File("src/test/resources/testLoginEventCondition.json")),
+                replaceConfigurationFile("data/tmp/testClickEventCondition.json", new File("src/test/resources/testClickEventCondition.json")),
                 replaceConfigurationFile("data/tmp/testRuleGroovyAction.json", new File("src/test/resources/testRuleGroovyAction.json")),
-                replaceConfigurationFile("data/tmp/groovy/UpdateAddressAction.groovy",
-                        new File("src/test/resources/groovy/UpdateAddressAction.groovy")), keepRuntimeFolder(),
-                // configureConsole().ignoreLocalConsole(),
-                logLevel(LogLevel.INFO),
-                editConfigurationFilePut("etc/custom.system.properties", "org.apache.unomi.graphql.feature.activated", "true"),
+                replaceConfigurationFile("data/tmp/groovy/UpdateAddressAction.groovy", new File("src/test/resources/groovy/UpdateAddressAction.groovy")),
+
                 editConfigurationFilePut("etc/org.ops4j.pax.logging.cfg", "log4j2.rootLogger.level", "INFO"),
                 editConfigurationFilePut("etc/org.apache.karaf.features.cfg", "serviceRequirements", "disable"),
-                //                editConfigurationFilePut("etc/org.ops4j.pax.web.cfg", "org.osgi.service.http.port", HTTP_PORT),
-                //                systemProperty("org.osgi.service.http.port").value(HTTP_PORT),
+                editConfigurationFilePut("etc/system.properties", "my.system.property", System.getProperty("my.system.property")),
+                editConfigurationFilePut("etc/custom.system.properties", "org.apache.unomi.graphql.feature.activated", "true"),
+                editConfigurationFilePut("etc/custom.system.properties", "org.apache.unomi.elasticsearch.cluster.name", "contextElasticSearchITests"),
+                editConfigurationFilePut("etc/custom.system.properties", "org.apache.unomi.elasticsearch.addresses", "localhost:9400"),
+                editConfigurationFilePut("etc/custom.system.properties", "org.apache.unomi.elasticsearch.index.prefix", "itest"),
+
                 systemProperty("org.ops4j.pax.exam.rbc.rmi.port").value("1199"),
-                systemProperty("org.apache.unomi.itests.elasticsearch.transport.port").value("9500"),
-                systemProperty("org.apache.unomi.itests.elasticsearch.cluster.name").value("contextElasticSearchITests"),
-                systemProperty("org.apache.unomi.itests.elasticsearch.http.port").value("9400"),
-                systemProperty("org.apache.unomi.itests.elasticsearch.bootstrap.seccomp").value("false"),
                 systemProperty("org.apache.unomi.hazelcast.group.name").value("cellar"),
                 systemProperty("org.apache.unomi.hazelcast.group.password").value("pass"),
                 systemProperty("org.apache.unomi.hazelcast.network.port").value("5701"),
                 systemProperty("org.apache.unomi.hazelcast.tcp-ip.members").value("127.0.0.1"),
                 systemProperty("org.apache.unomi.hazelcast.tcp-ip.interface").value("127.0.0.1"),
-                systemProperty("unomi.autoStart").value("true"), CoreOptions.bundleStartLevel(100), CoreOptions.frameworkStartLevel(100) };
+                systemProperty("unomi.autoStart").value("true"),
 
-        options.addAll(Arrays.asList(commonOptions));
+                logLevel(LogLevel.INFO),
+                keepRuntimeFolder(),
+                CoreOptions.bundleStartLevel(100),
+                CoreOptions.frameworkStartLevel(100)
+        };
+        List<Option> karafOptions = new ArrayList<>();
+        karafOptions.addAll(Arrays.asList(options));
 
         String karafDebug = System.getProperty("it.karaf.debug");
         if (karafDebug != null) {
@@ -265,52 +250,17 @@ public abstract class BaseIT {
                     }
                 }
             }
-            options.add(0, debugConfiguration(port, hold));
-        }
-
-        // Jacoco setup
-        final String agentFile = System.getProperty("user.dir") + "/target/jacoco/lib/jacocoagent.jar";
-        Path path = Paths.get(agentFile);
-        if (Files.exists(path)) {
-            final String jacocoOption = "-javaagent:" + agentFile + "=destfile=" + System.getProperty("user.dir")
-                    + "/target/jacoco.exec,includes=org.apache.unomi.*";
-            LOGGER.info("set jacoco java agent: {}", jacocoOption);
-            options.add(new VMOption(jacocoOption));
-        } else {
-            LOGGER.warn("Unable to set jacoco agent as {} was not found", agentFile);
+            karafOptions.add(0, debugConfiguration(port, hold));
         }
 
         String customLogging = System.getProperty("it.karaf.customLogging");
         if (customLogging != null) {
             String[] customLoggingParts = customLogging.split(":");
-            options.add(editConfigurationFilePut("etc/org.ops4j.pax.logging.cfg", "log4j2.logger.customLogging.name", customLoggingParts[0]));
-            options.add(editConfigurationFilePut("etc/org.ops4j.pax.logging.cfg", "log4j2.logger.customLogging.level", customLoggingParts[1]));
-        }
-
-        if (JavaVersionUtil.getMajorVersion() >= 9) {
-            Option[] jdk9PlusOptions = new Option[] { new VMOption("--add-reads=java.xml=java.logging"),
-                    new VMOption("--add-exports=java.base/org.apache.karaf.specs.locator=java.xml,ALL-UNNAMED"),
-                    new VMOption("--patch-module"),
-                    new VMOption("java.base=lib/endorsed/org.apache.karaf.specs.locator-" + System.getProperty("karaf.version") + ".jar"),
-                    new VMOption("--patch-module"),
-                    new VMOption("java.xml=lib/endorsed/org.apache.karaf.specs.java.xml-" + System.getProperty("karaf.version") + ".jar"),
-                    new VMOption("--add-opens"), new VMOption("java.base/java.security=ALL-UNNAMED"), new VMOption("--add-opens"),
-                    new VMOption("java.base/java.net=ALL-UNNAMED"), new VMOption("--add-opens"),
-                    new VMOption("java.base/java.lang=ALL-UNNAMED"), new VMOption("--add-opens"),
-                    new VMOption("java.base/java.util=ALL-UNNAMED"), new VMOption("--add-opens"),
-                    new VMOption("java.naming/javax.naming.spi=ALL-UNNAMED"), new VMOption("--add-opens"),
-                    new VMOption("java.rmi/sun.rmi.transport.tcp=ALL-UNNAMED"),
-                    new VMOption("--add-exports=java.base/sun.net.www.protocol.http=ALL-UNNAMED"),
-                    new VMOption("--add-exports=java.base/sun.net.www.protocol.https=ALL-UNNAMED"),
-                    new VMOption("--add-exports=java.base/sun.net.www.protocol.jar=ALL-UNNAMED"),
-                    new VMOption("--add-exports=jdk.naming.rmi/com.sun.jndi.url.rmi=ALL-UNNAMED"), new VMOption("-classpath"),
-                    new VMOption("lib/jdk9plus/*" + File.pathSeparator + "lib/boot/*")
-
-            };
-            options.addAll(Arrays.asList(jdk9PlusOptions));
+            karafOptions.add(editConfigurationFilePut("etc/org.ops4j.pax.logging.cfg", "log4j2.logger.customLogging.name", customLoggingParts[0]));
+            karafOptions.add(editConfigurationFilePut("etc/org.ops4j.pax.logging.cfg", "log4j2.logger.customLogging.level", customLoggingParts[1]));
         }
 
-        return options.toArray(new Option[0]);
+        return Stream.of(super.config(), karafOptions.toArray(new Option[karafOptions.size()])).flatMap(Stream::of).toArray(Option[]::new);
     }
 
     protected <T> T keepTrying(String failMessage, Supplier<T> call, Predicate<T> predicate, int timeout, int retries)
@@ -355,7 +305,11 @@ public abstract class BaseIT {
     protected String bundleResourceAsString(final String resourcePath) throws IOException {
         final java.net.URL url = bundleContext.getBundle().getResource(resourcePath);
         if (url != null) {
-            return IOUtils.toString(url);
+            try (InputStream stream = url.openStream()) {
+                return IOUtils.toString(stream);
+            } catch (final Exception e) {
+                throw new RuntimeException(e);
+            }
         } else {
             return null;
         }
@@ -445,7 +399,7 @@ public abstract class BaseIT {
     }
 
     public String getFullUrl(String url) throws Exception {
-        return BASE_URL + ":" + HTTP_PORT + url;
+        return BASE_URL + ":" + getHttpPort() + url;
     }
 
     protected <T> T get(final String url, Class<T> clazz) {
diff --git a/itests/src/test/java/org/apache/unomi/itests/BasicIT.java b/itests/src/test/java/org/apache/unomi/itests/BasicIT.java
index 819ce4495..8abdf0284 100644
--- a/itests/src/test/java/org/apache/unomi/itests/BasicIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/BasicIT.java
@@ -113,9 +113,15 @@ public class BasicIT extends BaseIT {
     }
 
     @Test
-    public void testContextJS() throws IOException {
+    public void simpleTest() throws Exception {
+        System.out.println("==== System Property in probe bundle: " + System.getProperty("my.system.property"));
+        assertContains("foo", System.getProperty("my.system.property"));
+    }
+
+    @Test
+    public void testContextJS() throws Exception {
         LOGGER.info("Start test testContextJS");
-        HttpUriRequest request = new HttpGet(URL + "/cxs/context.js?sessionId=" + SESSION_ID_0);
+        HttpUriRequest request = new HttpGet(getFullUrl("/cxs/context.js?sessionId=" + SESSION_ID_0));
         request.setHeader("Content-Type", "application/json");
         // The underlying HTTP connection is still held by the response object
         // to allow the response content to be streamed directly from the network socket.
@@ -137,10 +143,10 @@ public class BasicIT extends BaseIT {
     }
 
     @Test
-    public void testContextJSONWithUrlParameter() throws IOException, InterruptedException {
+    public void testContextJSONWithUrlParameter() throws Exception {
         LOGGER.info("Start test testContextJSONWithUrlParameter");
         ContextRequest contextRequest = new ContextRequest();
-        HttpPost request = new HttpPost(URL + "/cxs/context.json?sessionId=" + SESSION_ID_1);
+        HttpPost request = new HttpPost(getFullUrl("/cxs/context.json?sessionId=" + SESSION_ID_1));
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.create("application/json")));
 
         executeContextJSONRequest(request, SESSION_ID_1);
@@ -148,11 +154,11 @@ public class BasicIT extends BaseIT {
     }
 
     @Test
-    public void testContextJSON() throws IOException, InterruptedException {
+    public void testContextJSON() throws Exception {
         LOGGER.info("Start test testContextJSON");
         ContextRequest contextRequest = new ContextRequest();
         contextRequest.setSessionId(SESSION_ID_2);
-        HttpPost request = new HttpPost(URL + "/cxs/context.json");
+        HttpPost request = new HttpPost(getFullUrl("/cxs/context.json"));
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.create("application/json")));
 
         executeContextJSONRequest(request, SESSION_ID_2);
@@ -160,7 +166,7 @@ public class BasicIT extends BaseIT {
     }
 
     @Test
-    public void testMultipleLoginOnSameBrowser() throws IOException, InterruptedException {
+    public void testMultipleLoginOnSameBrowser() throws Exception {
         LOGGER.info("Start test testMultipleLoginOnSameBrowser");
 
         // Add login event condition
@@ -180,7 +186,7 @@ public class BasicIT extends BaseIT {
 
         // First page view with the first visitor aka VISITOR_1 and SESSION_ID_3
         ContextRequest contextRequestPageViewSession1 = getContextRequestWithPageViewEvent(sourceSite, SESSION_ID_3);
-        HttpPost requestPageView1 = new HttpPost(URL + "/cxs/context.json");
+        HttpPost requestPageView1 = new HttpPost(getFullUrl("/cxs/context.json"));
         requestPageView1.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequestPageViewSession1),
                 ContentType.create("application/json")));
         TestUtils.RequestResponse requestResponsePageView1 = executeContextJSONRequest(requestPageView1, SESSION_ID_3);
@@ -198,7 +204,7 @@ public class BasicIT extends BaseIT {
         // Create login event with VISITOR_1
         ContextRequest contextRequestLoginVisitor1 = getContextRequestWithLoginEvent(sourceSite, loginEventPropertiesVisitor1,
                 EMAIL_VISITOR_1, SESSION_ID_3);
-        HttpPost requestLoginVisitor1 = new HttpPost(URL + "/cxs/context.json");
+        HttpPost requestLoginVisitor1 = new HttpPost(getFullUrl("/cxs/context.json"));
         requestLoginVisitor1.addHeader("Cookie", requestResponsePageView1.getCookieHeaderValue());
         requestLoginVisitor1.addHeader("X-Unomi-Peer", UNOMI_KEY);
         requestLoginVisitor1.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequestLoginVisitor1),
@@ -212,7 +218,7 @@ public class BasicIT extends BaseIT {
         Thread.sleep(1000);
 
         // Lets add a page view with VISITOR_1 to simulate reloading the page after login and be able to check the profile properties
-        HttpPost requestPageView2 = new HttpPost(URL + "/cxs/context.json");
+        HttpPost requestPageView2 = new HttpPost(getFullUrl("/cxs/context.json"));
         requestPageView2.addHeader("Cookie", requestResponsePageView1.getCookieHeaderValue());
         requestPageView2.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequestPageViewSession1),
                 ContentType.create("application/json")));
@@ -227,7 +233,7 @@ public class BasicIT extends BaseIT {
         // Lets simulate a logout by requesting the context with a new page view event and a new session id
         // but we will send the cookie of the profile id from VISITOR_1
         ContextRequest contextRequestPageViewSession2 = getContextRequestWithPageViewEvent(sourceSite, SESSION_ID_4);
-        HttpPost requestPageView3 = new HttpPost(URL + "/cxs/context.json");
+        HttpPost requestPageView3 = new HttpPost(getFullUrl("/cxs/context.json"));
         requestPageView3.addHeader("Cookie", requestResponsePageView1.getCookieHeaderValue());
         requestPageView3.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequestPageViewSession2),
                 ContentType.create("application/json")));
@@ -252,7 +258,7 @@ public class BasicIT extends BaseIT {
         // Create login event with VISITOR_2
         ContextRequest contextRequestLoginVisitor2 = getContextRequestWithLoginEvent(sourceSite, loginEventPropertiesVisitor2,
                 EMAIL_VISITOR_2, SESSION_ID_4);
-        HttpPost requestLoginVisitor2 = new HttpPost(URL + "/cxs/context.json");
+        HttpPost requestLoginVisitor2 = new HttpPost(getFullUrl("/cxs/context.json"));
         requestLoginVisitor2.addHeader("Cookie", requestResponsePageView1.getCookieHeaderValue());
         requestLoginVisitor2.addHeader("X-Unomi-Peer", UNOMI_KEY);
         requestLoginVisitor2.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequestLoginVisitor2),
@@ -266,7 +272,7 @@ public class BasicIT extends BaseIT {
         Thread.sleep(1000);
 
         // Lets add a page view with VISITOR_2 to simulate reloading the page after login
-        HttpPost requestPageView4 = new HttpPost(URL + "/cxs/context.json");
+        HttpPost requestPageView4 = new HttpPost(getFullUrl("/cxs/context.json"));
         requestPageView4.addHeader("Cookie", requestResponseLoginVisitor2.getCookieHeaderValue());
         requestPageView4.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequestPageViewSession2),
                 ContentType.create("application/json")));
diff --git a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
index 830e995e7..edc09bb2b 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ContextServletIT.java
@@ -179,7 +179,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testUpdateEventFromContextAuthorizedThirdParty_Success() throws IOException, InterruptedException {
+    public void testUpdateEventFromContextAuthorizedThirdParty_Success() throws Exception {
         //Arrange
         String eventId = "test-event-id-" + System.currentTimeMillis();
         String sessionId = "test-session-id";
@@ -205,7 +205,7 @@ public class ContextServletIT extends BaseIT {
         ContextRequest contextRequest = new ContextRequest();
         contextRequest.setSessionId(session.getItemId());
         contextRequest.setEvents(Arrays.asList(event));
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.addHeader(THIRD_PARTY_HEADER_NAME, UNOMI_KEY);
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request, sessionId);
@@ -217,7 +217,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testUpdateEventFromContextUnAuthorizedThirdParty_Fail() throws IOException, InterruptedException {
+    public void testUpdateEventFromContextUnAuthorizedThirdParty_Fail() throws Exception {
         //Arrange
         String eventId = "test-event-id-" + System.currentTimeMillis();
         String sessionId = "test-session-id";
@@ -244,7 +244,7 @@ public class ContextServletIT extends BaseIT {
         ContextRequest contextRequest = new ContextRequest();
         contextRequest.setSessionId(session.getItemId());
         contextRequest.setEvents(Arrays.asList(event));
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request, sessionId);
 
@@ -255,7 +255,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testUpdateEventFromContextAuthorizedThirdPartyNoItemID_Fail() throws IOException, InterruptedException {
+    public void testUpdateEventFromContextAuthorizedThirdPartyNoItemID_Fail() throws Exception {
         //Arrange
         String eventId = "test-event-id-" + System.currentTimeMillis();
         String sessionId = "test-session-id";
@@ -276,7 +276,7 @@ public class ContextServletIT extends BaseIT {
         ContextRequest contextRequest = new ContextRequest();
         contextRequest.setSessionId(session.getItemId());
         contextRequest.setEvents(Arrays.asList(event));
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request, sessionId);
 
@@ -288,7 +288,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventsWithNoTimestampParam_profileAddedToSegment() throws IOException, InterruptedException {
+    public void testCreateEventsWithNoTimestampParam_profileAddedToSegment() throws Exception {
         //Arrange
         String sessionId = "test-session-id";
         String scope = TEST_SCOPE;
@@ -301,7 +301,7 @@ public class ContextServletIT extends BaseIT {
         contextRequest.setSessionId(sessionId);
         contextRequest.setRequireSegments(true);
         contextRequest.setEvents(Arrays.asList(event));
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         String cookieHeaderValue = TestUtils.executeContextJSONRequest(request, sessionId).getCookieHeaderValue();
 
@@ -320,14 +320,14 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventWithTimestampParam_pastEvent_profileIsNotAddedToSegment() throws IOException, InterruptedException {
+    public void testCreateEventWithTimestampParam_pastEvent_profileIsNotAddedToSegment() throws Exception {
         //Arrange
         String sessionId = "test-session-id";
         String scope = TEST_SCOPE;
         Event event = new Event();
         event.setEventType(TEST_EVENT_TYPE);
         event.setScope(scope);
-        String regularURI = URL + CONTEXT_URL;
+        String regularURI = getFullUrl(CONTEXT_URL);
         long oldTimestamp = LocalDateTime.now(ZoneId.of("UTC")).minusDays(SEGMENT_NUMBER_OF_DAYS + 1).toInstant(ZoneOffset.UTC)
                 .toEpochMilli();
         String customTimestampURI = regularURI + "?timestamp=" + oldTimestamp;
@@ -353,14 +353,14 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventWithTimestampParam_futureEvent_profileIsNotAddedToSegment() throws IOException, InterruptedException {
+    public void testCreateEventWithTimestampParam_futureEvent_profileIsNotAddedToSegment() throws Exception {
         //Arrange
         String sessionId = "test-session-id";
         String scope = TEST_SCOPE;
         Event event = new Event();
         event.setEventType(TEST_EVENT_TYPE);
         event.setScope(scope);
-        String regularURI = URL + CONTEXT_URL;
+        String regularURI = getFullUrl(CONTEXT_URL);
         long futureTimestamp = LocalDateTime.now(ZoneId.of("UTC")).plusDays(1).toInstant(ZoneOffset.UTC).toEpochMilli();
         String customTimestampURI = regularURI + "?timestamp=" + futureTimestamp;
 
@@ -386,7 +386,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventWithProfileId_Success() throws IOException, InterruptedException {
+    public void testCreateEventWithProfileId_Success() throws Exception {
         //Arrange
         String eventId = "test-event-id-" + System.currentTimeMillis();
         String eventType = "test-event-type";
@@ -399,7 +399,7 @@ public class ContextServletIT extends BaseIT {
         contextRequest.setEvents(Arrays.asList(event));
 
         //Act
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.addHeader(THIRD_PARTY_HEADER_NAME, UNOMI_KEY);
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request);
@@ -409,7 +409,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventWithPropertiesValidation_Success() throws IOException, InterruptedException {
+    public void testCreateEventWithPropertiesValidation_Success() throws Exception {
         //Arrange
         String eventId = "valid-event-id-" + System.currentTimeMillis();
         String profileId = "valid-profile-id";
@@ -426,7 +426,7 @@ public class ContextServletIT extends BaseIT {
         contextRequest.setEvents(Arrays.asList(event));
 
         //Act
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.addHeader(THIRD_PARTY_HEADER_NAME, UNOMI_KEY);
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request);
@@ -439,7 +439,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventWithPropertyValueValidation_Failure() throws IOException, InterruptedException {
+    public void testCreateEventWithPropertyValueValidation_Failure() throws Exception {
         //Arrange
         String eventId = "invalid-event-value-id-" + System.currentTimeMillis();
         String profileId = "invalid-profile-id";
@@ -456,7 +456,7 @@ public class ContextServletIT extends BaseIT {
         contextRequest.setEvents(Arrays.asList(event));
 
         //Act
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.addHeader(THIRD_PARTY_HEADER_NAME, UNOMI_KEY);
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request);
@@ -467,7 +467,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testCreateEventWithPropertyNameValidation_Failure() throws IOException, InterruptedException {
+    public void testCreateEventWithPropertyNameValidation_Failure() throws Exception {
         //Arrange
         String eventId = "invalid-event-prop-id-" + System.currentTimeMillis();
         String profileId = "invalid-profile-id";
@@ -483,7 +483,7 @@ public class ContextServletIT extends BaseIT {
         contextRequest.setEvents(Arrays.asList(event));
 
         //Act
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.addHeader(THIRD_PARTY_HEADER_NAME, UNOMI_KEY);
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request);
@@ -494,7 +494,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testOGNLVulnerability() throws IOException, InterruptedException {
+    public void testOGNLVulnerability() throws Exception {
 
         File vulnFile = new File("target/vuln-file.txt");
         if (vulnFile.exists()) {
@@ -505,7 +505,7 @@ public class ContextServletIT extends BaseIT {
 
         Map<String, String> parameters = new HashMap<>();
         parameters.put("VULN_FILE_PATH", vulnFileCanonicalPath);
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(
                 new StringEntity(getValidatedBundleJSON("security/ognl-payload-1.json", parameters), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request);
@@ -515,7 +515,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testMVELVulnerability() throws IOException, InterruptedException {
+    public void testMVELVulnerability() throws Exception {
 
         File vulnFile = new File("target/vuln-file.txt");
         if (vulnFile.exists()) {
@@ -526,7 +526,7 @@ public class ContextServletIT extends BaseIT {
 
         Map<String, String> parameters = new HashMap<>();
         parameters.put("VULN_FILE_PATH", vulnFileCanonicalPath);
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(
                 new StringEntity(getValidatedBundleJSON("security/mvel-payload-1.json", parameters), ContentType.APPLICATION_JSON));
         TestUtils.executeContextJSONRequest(request);
@@ -536,21 +536,21 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testPersonalization() throws IOException, InterruptedException {
+    public void testPersonalization() throws Exception {
 
         Map<String, String> parameters = new HashMap<>();
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(new StringEntity(getValidatedBundleJSON("personalization.json", parameters), ContentType.APPLICATION_JSON));
         TestUtils.RequestResponse response = TestUtils.executeContextJSONRequest(request);
         assertEquals("Invalid response code", 200, response.getStatusCode());
     }
 
     @Test
-    public void testPersonalizationWithControlGroup() throws IOException, InterruptedException {
+    public void testPersonalizationWithControlGroup() throws Exception {
 
         Map<String, String> parameters = new HashMap<>();
         parameters.put("storeInSession", "false");
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(
                 new StringEntity(getValidatedBundleJSON("personalization-controlgroup.json", parameters), ContentType.APPLICATION_JSON));
         TestUtils.RequestResponse response = TestUtils.executeContextJSONRequest(request);
@@ -576,7 +576,7 @@ public class ContextServletIT extends BaseIT {
 
         // now let's test with session storage
         parameters.put("storeInSession", "true");
-        request = new HttpPost(URL + CONTEXT_URL);
+        request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(
                 new StringEntity(getValidatedBundleJSON("personalization-controlgroup.json", parameters), ContentType.APPLICATION_JSON));
         response = TestUtils.executeContextJSONRequest(request);
@@ -627,7 +627,7 @@ public class ContextServletIT extends BaseIT {
     }
 
     @Test
-    public void testRequireScoring() throws IOException, InterruptedException {
+    public void testRequireScoring() throws Exception {
 
         Map<String, String> parameters = new HashMap<>();
         String scoringSource = getValidatedBundleJSON("score1.json", parameters);
@@ -639,7 +639,7 @@ public class ContextServletIT extends BaseIT {
 
         // first let's make sure everything works without the requireScoring parameter
         parameters = new HashMap<>();
-        HttpPost request = new HttpPost(URL + CONTEXT_URL);
+        HttpPost request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(new StringEntity(getValidatedBundleJSON("withoutRequireScores.json", parameters), ContentType.APPLICATION_JSON));
         TestUtils.RequestResponse response = TestUtils.executeContextJSONRequest(request);
         assertEquals("Invalid response code", 200, response.getStatusCode());
@@ -650,7 +650,7 @@ public class ContextServletIT extends BaseIT {
 
         // now let's test adding it.
         parameters = new HashMap<>();
-        request = new HttpPost(URL + CONTEXT_URL);
+        request = new HttpPost(getFullUrl(CONTEXT_URL));
         request.setEntity(new StringEntity(getValidatedBundleJSON("withRequireScores.json", parameters), ContentType.APPLICATION_JSON));
         response = TestUtils.executeContextJSONRequest(request);
         assertEquals("Invalid response code", 200, response.getStatusCode());
diff --git a/itests/src/test/java/org/apache/unomi/itests/InputValidationIT.java b/itests/src/test/java/org/apache/unomi/itests/InputValidationIT.java
index 3ca188796..8eed7b4c9 100644
--- a/itests/src/test/java/org/apache/unomi/itests/InputValidationIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/InputValidationIT.java
@@ -82,25 +82,25 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_param_EventsCollectorRequestNotNull() throws IOException {
+    public void test_param_EventsCollectorRequestNotNull() throws Exception {
         doPOSTRequestTest(EVENT_COLLECTOR_URL, null, null, 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doGETRequestTest(EVENT_COLLECTOR_URL, null, null, 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
     }
 
     @Test
-    public void test_param_EventsNotEmpty() throws IOException {
+    public void test_param_EventsNotEmpty() throws Exception {
         doPOSTRequestTest(EVENT_COLLECTOR_URL, null, "/validation/eventcollector_emptyEvents.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doGETRequestTest(EVENT_COLLECTOR_URL, null, "/validation/eventcollector_emptyEvents.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
     }
 
     @Test
-    public void test_param_SessionIDPattern() throws IOException {
+    public void test_param_SessionIDPattern() throws Exception {
         doPOSTRequestTest(EVENT_COLLECTOR_URL, null, "/validation/eventcollector_invalidSessionId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doGETRequestTest(EVENT_COLLECTOR_URL, null, "/validation/eventcollector_invalidSessionId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
     }
 
     @Test
-    public void test_eventCollector_valid() throws IOException, InterruptedException {
+    public void test_eventCollector_valid() throws Exception {
         // needed schema for event to be valid during tests
         schemaService.saveSchema(resourceAsString("schemas/schema-dummy.json"));
         schemaService.saveSchema(resourceAsString("schemas/schema-dummy-properties.json"));
@@ -122,7 +122,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_contextRequest_SessionIDPattern() throws IOException {
+    public void test_contextRequest_SessionIDPattern() throws Exception {
         doPOSTRequestTest(CONTEXT_JSON_URL, null, "/validation/contextRequest_invalidSessionId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doPOSTRequestTest(CONTEXT_JS_URL, null, "/validation/contextRequest_invalidSessionId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doGETRequestTest(CONTEXT_JSON_URL, null, "/validation/contextRequest_invalidSessionId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
@@ -130,7 +130,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_contextRequest_ProfileIDPattern() throws IOException {
+    public void test_contextRequest_ProfileIDPattern() throws Exception {
         doPOSTRequestTest(CONTEXT_JSON_URL, null, "/validation/contextRequest_invalidProfileId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doPOSTRequestTest(CONTEXT_JS_URL, null, "/validation/contextRequest_invalidProfileId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
         doGETRequestTest(CONTEXT_JSON_URL, null, "/validation/contextRequest_invalidProfileId.json", 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
@@ -138,7 +138,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_contextRequest_valid() throws IOException {
+    public void test_contextRequest_valid() throws Exception {
         doPOSTRequestTest(CONTEXT_JSON_URL, null, "/validation/contextRequest_valid.json", 200, null);
         doPOSTRequestTest(CONTEXT_JS_URL, null, "/validation/contextRequest_valid.json", 200, null);
         doGETRequestTest(CONTEXT_JSON_URL, null, "/validation/contextRequest_valid.json", 200, null);
@@ -146,7 +146,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_eventCollector_request_size_exceed_limit() throws IOException, InterruptedException {
+    public void test_eventCollector_request_size_exceed_limit() throws Exception {
         // needed schema for event to be valid during tests
         schemaService.saveSchema(resourceAsString("schemas/schema-dummy.json"));
         schemaService.saveSchema(resourceAsString("schemas/schema-dummy-properties.json"));
@@ -168,7 +168,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_contextJSON_SessionIDPattern() throws IOException {
+    public void test_contextJSON_SessionIDPattern() throws Exception {
         String baseUrl = CONTEXT_JS_URL;
         String queryString = "?sessionId=" + URLEncoder.encode("<script>alert();</script>", StandardCharsets.UTF_8.toString());
         doPOSTRequestTest(baseUrl + queryString, null, null, 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
@@ -189,7 +189,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_contextJSON_PersonaIdPattern() throws IOException {
+    public void test_contextJSON_PersonaIdPattern() throws Exception {
         String baseUrl = CONTEXT_JS_URL;
         String queryString = "?personaId=" + URLEncoder.encode("<script>alert();</script>", StandardCharsets.UTF_8.toString());
         doPOSTRequestTest(baseUrl + queryString, null, null, 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
@@ -210,7 +210,7 @@ public class InputValidationIT extends BaseIT {
     }
 
     @Test
-    public void test_cookie_profileIdPattern() throws IOException {
+    public void test_cookie_profileIdPattern() throws Exception {
         Map<String, String> headers = new HashMap<>();
         headers.put("Cookie", "context-profile-id=<script>alert();</script>");
         doPOSTRequestTest(CONTEXT_JSON_URL, headers, null, 400, ERROR_MESSAGE_INVALID_DATA_RECEIVED);
@@ -225,11 +225,11 @@ public class InputValidationIT extends BaseIT {
         doGETRequestTest(CONTEXT_JS_URL, headers, null, 200, null);
     }
 
-    private void doGETRequestTest(String uri, Map<String, String> headers, String entityResourcePath, int expectedHTTPStatusCode, String expectedErrorMessage) throws IOException {
+    private void doGETRequestTest(String uri, Map<String, String> headers, String entityResourcePath, int expectedHTTPStatusCode, String expectedErrorMessage) throws Exception {
         // test old servlets
-        performGETRequestTest(URL + uri, headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
+        performGETRequestTest(getFullUrl(uri), headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
         // test directly CXS endpoints
-        performGETRequestTest(URL + "/cxs" + uri, headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
+        performGETRequestTest(getFullUrl("/cxs" + uri), headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
     }
 
     private void performGETRequestTest(String url, Map<String, String> headers, String entityResourcePath, int expectedHTTPStatusCode, String expectedErrorMessage) throws IOException {
@@ -240,11 +240,11 @@ public class InputValidationIT extends BaseIT {
         performRequest(new HttpGet(url), headers, expectedHTTPStatusCode, expectedErrorMessage);
     }
 
-    private void doPOSTRequestTest(String uri, Map<String, String> headers, String entityResourcePath, int expectedHTTPStatusCode, String expectedErrorMessage) throws IOException {
+    private void doPOSTRequestTest(String uri, Map<String, String> headers, String entityResourcePath, int expectedHTTPStatusCode, String expectedErrorMessage) throws Exception {
         // test old servlets
-        performPOSTRequestTest(URL + uri, headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
+        performPOSTRequestTest(getFullUrl(uri), headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
         // test directly CXS endpoints
-        performPOSTRequestTest(URL + "/cxs" + uri, headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
+        performPOSTRequestTest(getFullUrl("/cxs" + uri), headers, entityResourcePath, expectedHTTPStatusCode, expectedErrorMessage);
     }
 
     private void performPOSTRequestTest(String url, Map<String, String> headers, String entityResourcePath, int expectedHTTPStatusCode, String expectedErrorMessage) throws IOException {
diff --git a/itests/src/test/java/org/apache/unomi/itests/JSONSchemaIT.java b/itests/src/test/java/org/apache/unomi/itests/JSONSchemaIT.java
index 75f7d1310..0bf7b53ae 100644
--- a/itests/src/test/java/org/apache/unomi/itests/JSONSchemaIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/JSONSchemaIT.java
@@ -329,7 +329,7 @@ public class JSONSchemaIT extends BaseIT {
         }
     }
 
-    private Event sendEventAndWaitItsIndexed(String eventResourcePath) throws IOException, InterruptedException {
+    private Event sendEventAndWaitItsIndexed(String eventResourcePath) throws Exception {
         // build event collector request
         String eventMarker = UUID.randomUUID().toString();
         HashMap<String, String> eventReplacements = new HashMap<>();
@@ -353,8 +353,8 @@ public class JSONSchemaIT extends BaseIT {
         return events.get(0);
     }
 
-    private void eventCollectorPost(String eventCollectorRequest) {
-        HttpPost request = new HttpPost(URL + EVENT_COLLECTOR_URL);
+    private void eventCollectorPost(String eventCollectorRequest) throws Exception {
+        HttpPost request = new HttpPost(getFullUrl(EVENT_COLLECTOR_URL));
         request.addHeader("Content-Type", "application/json");
         request.setEntity(new StringEntity(eventCollectorRequest, ContentType.create("application/json")));
         CloseableHttpResponse response;
diff --git a/itests/src/test/java/org/apache/unomi/itests/ProfileServiceWithoutOverwriteIT.java b/itests/src/test/java/org/apache/unomi/itests/ProfileServiceWithoutOverwriteIT.java
index aa3a34c2d..32f442d9c 100644
--- a/itests/src/test/java/org/apache/unomi/itests/ProfileServiceWithoutOverwriteIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/ProfileServiceWithoutOverwriteIT.java
@@ -49,7 +49,7 @@ public class ProfileServiceWithoutOverwriteIT extends BaseIT {
     private final static String TEST_PROFILE_ID = "test-profile-id";
 
     @Configuration
-    public Option[] config() throws InterruptedException {
+    public Option[] config() {
         List<Option> options = new ArrayList<>();
         options.addAll(Arrays.asList(super.config()));
         options.add(systemProperty("org.apache.unomi.elasticsearch.throwExceptions").value("true"));
diff --git a/itests/src/test/java/org/apache/unomi/itests/SecurityIT.java b/itests/src/test/java/org/apache/unomi/itests/SecurityIT.java
index f76c61231..69f64d6d8 100644
--- a/itests/src/test/java/org/apache/unomi/itests/SecurityIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/SecurityIT.java
@@ -54,7 +54,7 @@ public class SecurityIT extends BaseIT {
     }
 
     @Test
-    public void testOGNLInjection() throws IOException {
+    public void testOGNLInjection() throws Exception {
         ContextRequest contextRequest = new ContextRequest();
         List<PersonalizationService.PersonalizationRequest> personalizations = new ArrayList<>();
         PersonalizationService.PersonalizationRequest personalizationRequest = new PersonalizationService.PersonalizationRequest();
@@ -92,7 +92,7 @@ public class SecurityIT extends BaseIT {
         contextRequest.setPersonalizations(personalizations);
 
         contextRequest.setSessionId(SESSION_ID);
-        HttpPost request = new HttpPost(URL + "/cxs/context.json");
+        HttpPost request = new HttpPost(getFullUrl("/cxs/context.json"));
         request.setEntity(new StringEntity(objectMapper.writeValueAsString(contextRequest), ContentType.create("application/json")));
 
         TestUtils.RequestResponse response = executeContextJSONRequest(request, SESSION_ID);
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/BaseGraphQLIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/BaseGraphQLIT.java
index 9b8ff09cf..f1c4a077a 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/BaseGraphQLIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/BaseGraphQLIT.java
@@ -44,25 +44,23 @@ import java.util.regex.Pattern;
 @ExamReactorStrategy(PerSuite.class)
 public abstract class BaseGraphQLIT extends BaseIT {
 
-    protected static final String GRAPHQL_ENDPOINT = URL + "/graphql";
-
     protected static final ContentType JSON_CONTENT_TYPE = ContentType.create("application/json");
 
     @Inject
     protected BundleContext bundleContext;
 
-    protected CloseableHttpResponse postAnonymous(final String resource) throws IOException {
+    protected CloseableHttpResponse postAnonymous(final String resource) throws Exception {
         return postAs(resource, null, null);
     }
 
-    protected CloseableHttpResponse post(final String resource) throws IOException {
+    protected CloseableHttpResponse post(final String resource) throws Exception {
         return postAs(resource, "karaf", "karaf");
     }
 
-    protected CloseableHttpResponse postAs(final String resource, final String username, final String password) throws IOException {
+    protected CloseableHttpResponse postAs(final String resource, final String username, final String password) throws Exception {
         final String resourceAsString = resourceAsString(resource);
 
-        final HttpPost request = new HttpPost(GRAPHQL_ENDPOINT);
+        final HttpPost request = new HttpPost(getFullUrl("/graphql"));
 
         request.setEntity(new StringEntity(resourceAsString, JSON_CONTENT_TYPE));
 
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLEventIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLEventIT.java
index 5c9e02d0c..bd7e0e526 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLEventIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLEventIT.java
@@ -61,7 +61,7 @@ public class GraphQLEventIT extends BaseGraphQLIT {
 
 
     @Test
-    public void testGetEvent_notExists() throws IOException {
+    public void testGetEvent_notExists() throws Exception {
         try (CloseableHttpResponse response = post("graphql/event/get-event-not-exists.json")) {
             final ResponseContext context = ResponseContext.parse(response.getEntity());
 
@@ -70,7 +70,7 @@ public class GraphQLEventIT extends BaseGraphQLIT {
     }
 
     @Test
-    public void testGetEvent() throws IOException, InterruptedException {
+    public void testGetEvent() throws Exception {
         final Event event = createEvent(eventID, profile);
         refreshPersistence();
 
@@ -84,7 +84,7 @@ public class GraphQLEventIT extends BaseGraphQLIT {
     }
 
     @Test
-    public void testFindEvents() throws IOException, InterruptedException {
+    public void testFindEvents() throws Exception {
         createEvent(eventID, profile);
         createEvent("event-2", profile);
         final Profile profile2 = new Profile("profile-2");
@@ -102,7 +102,7 @@ public class GraphQLEventIT extends BaseGraphQLIT {
     }
 
     @Test
-    public void testProcessEvents() throws IOException {
+    public void testProcessEvents() throws Exception {
         final Profile originalProfile = persistenceService.load(profileID, Profile.class);
         Assert.assertNull(originalProfile.getProperty("firstName"));
         Assert.assertNull(originalProfile.getProperty("lastName"));
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfileIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfileIT.java
index 867b6543e..1ea820509 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfileIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLProfileIT.java
@@ -40,7 +40,7 @@ public class GraphQLProfileIT extends BaseGraphQLIT {
     }
 
     @Test
-    public void testGetProfile_WithoutCreation() throws IOException {
+    public void testGetProfile_WithoutCreation() throws Exception {
         try (CloseableHttpResponse response = post("graphql/profile/get-profile-without-creation.json")) {
             final ResponseContext context = ResponseContext.parse(response.getEntity());
 
@@ -49,7 +49,7 @@ public class GraphQLProfileIT extends BaseGraphQLIT {
     }
 
     @Test
-    public void testGetProfile_WithCreation() throws IOException {
+    public void testGetProfile_WithCreation() throws Exception {
         try (CloseableHttpResponse response = post("graphql/profile/get-profile-with-creation.json")) {
             final ResponseContext context = ResponseContext.parse(response.getEntity());
 
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSegmentIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSegmentIT.java
index bed6367b4..5b6b9f88b 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSegmentIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSegmentIT.java
@@ -48,7 +48,7 @@ public class GraphQLSegmentIT extends BaseGraphQLIT {
     }
 
     @Test
-    public void testCreateThenGetAndDeleteSegment() throws IOException, InterruptedException {
+    public void testCreateThenGetAndDeleteSegment() throws Exception {
         try (CloseableHttpResponse response = post("graphql/segment/create-or-update-segment.json")) {
             final ResponseContext context = ResponseContext.parse(response.getEntity());
 
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSourceIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSourceIT.java
index a5a828fb3..a1d433135 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSourceIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLSourceIT.java
@@ -33,7 +33,7 @@ public class GraphQLSourceIT extends BaseGraphQLIT {
     ScopeService scopeService;
 
     @Test
-    public void testCRUD() throws IOException, InterruptedException {
+    public void testCRUD() throws Exception {
         try (CloseableHttpResponse response = post("graphql/source/create-source.json")) {
             final ResponseContext context = ResponseContext.parse(response.getEntity());
 
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLTopicIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLTopicIT.java
index 96274c4b7..954d5c1b4 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLTopicIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLTopicIT.java
@@ -32,7 +32,7 @@ public class GraphQLTopicIT extends BaseGraphQLIT {
     protected TopicService topicService;
 
     @Test
-    public void testCRUD() throws IOException, InterruptedException {
+    public void testCRUD() throws Exception {
         try (CloseableHttpResponse response = post("graphql/topic/create-topic.json")) {
             final ResponseContext context = ResponseContext.parse(response.getEntity());
 
diff --git a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLWebSocketIT.java b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLWebSocketIT.java
index 74a4ad8a4..bcef7ebc0 100644
--- a/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLWebSocketIT.java
+++ b/itests/src/test/java/org/apache/unomi/itests/graphql/GraphQLWebSocketIT.java
@@ -42,8 +42,6 @@ public class GraphQLWebSocketIT extends BaseGraphQLIT {
 
     private final static Logger LOGGER = LoggerFactory.getLogger(GraphQLWebSocketIT.class);
 
-    private static final String SUBSCRIPTION_ENDPOINT = "ws://localhost:" + HTTP_PORT + "/graphql";
-
     @Test
     public void testWebSocketConnectionSegment() throws Exception {
         WebSocketClient client = new WebSocketClient();
@@ -52,7 +50,7 @@ public class GraphQLWebSocketIT extends BaseGraphQLIT {
             LOGGER.info("Starting web socket client...");
             client.start();
 
-            URI echoUri = new URI(SUBSCRIPTION_ENDPOINT);
+            URI echoUri = new URI("ws://localhost:" + getHttpPort() + "/graphql");
             ClientUpgradeRequest request = new ClientUpgradeRequest();
 
             Future<Session> onConnected = client.connect(socket, echoUri, request);
diff --git a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
index bf6efd9fa..cd5183232 100644
--- a/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
+++ b/persistence-elasticsearch/core/src/main/java/org/apache/unomi/persistence/elasticsearch/ElasticSearchPersistenceServiceImpl.java
@@ -459,17 +459,6 @@ public class ElasticSearchPersistenceServiceImpl implements PersistenceService,
                 bulkProcessorFlushInterval = System.getProperty(BULK_PROCESSOR_FLUSH_INTERVAL, bulkProcessorFlushInterval);
                 bulkProcessorBackoffPolicy = System.getProperty(BULK_PROCESSOR_BACKOFF_POLICY, bulkProcessorBackoffPolicy);
                 itemsMonthlyIndexed = itemsMonthlyIndexedOverride.equals("none") ? Collections.emptyList() : Arrays.asList(System.getProperty(MONTHLY_INDEX_ITEMS_MONTHLY_INDEXED, itemsMonthlyIndexedOverride).split(",").clone());
-                // this property is used for integration tests, to make sure we don't conflict with an already running ElasticSearch instance.
-                if (System.getProperty("org.apache.unomi.itests.elasticsearch.http.port") != null) {
-                    elasticSearchAddressList.clear();
-                    elasticSearchAddressList.add("localhost:" + System.getProperty("org.apache.unomi.itests.elasticsearch.http.port"));
-                    logger.info("Overriding ElasticSearch address list from system property=" + elasticSearchAddressList);
-                }
-                // this property is used for integration tests, to make sure we don't conflict with an already running ElasticSearch instance.
-                if (System.getProperty("org.apache.unomi.itests.elasticsearch.cluster.name") != null) {
-                    clusterName = System.getProperty("org.apache.unomi.itests.elasticsearch.cluster.name");
-                    logger.info("Overriding cluster name from system property=" + clusterName);
-                }
 
                 buildClient();
 
diff --git a/pom.xml b/pom.xml
index f9d867ca9..e801b3085 100644
--- a/pom.xml
+++ b/pom.xml
@@ -63,6 +63,7 @@
     <inceptionYear>2014</inceptionYear>
 
     <properties>
+        <karaf.version>4.2.15</karaf.version>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
         <cxf.version>3.3.11</cxf.version>
         <version.jackson.core>2.10.5</version.jackson.core>