[cxf] branch master updated: org.apache.cxf.osgi.itests: improve test stability

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[cxf] branch master updated: org.apache.cxf.osgi.itests: improve test stability

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

buhhunyx pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new b5ba5a7  org.apache.cxf.osgi.itests: improve test stability
b5ba5a7 is described below

commit b5ba5a7d58b2fc4ea767effb24bf3d26737586b2
Author: amarkevich <[hidden email]>
AuthorDate: Wed Jan 9 18:26:48 2019 +0300

    org.apache.cxf.osgi.itests: improve test stability
---
 .../cxf/osgi/itests/AbstractServerActivator.java   |  63 +++++++++++
 .../cxf/osgi/itests/BundlesAndNamespacesTest.java  |  18 +--
 .../apache/cxf/osgi/itests/CXFOSGiTestSupport.java | 123 +++++----------------
 .../cxf/osgi/itests/jaxrs/JaxRsServiceTest.java    |  36 +++---
 .../cxf/osgi/itests/jaxrs/JaxRsTestActivator.java  |  24 ++--
 .../cxf/osgi/itests/soap/HttpServiceTest.java      |  13 ++-
 .../cxf/osgi/itests/soap/HttpTestActivator.java    |  13 +--
 .../cxf/osgi/itests/soap/JmsServiceTest.java       |  24 ++--
 .../cxf/osgi/itests/soap/JmsTestActivator.java     |   2 -
 9 files changed, 148 insertions(+), 168 deletions(-)

diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/AbstractServerActivator.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/AbstractServerActivator.java
new file mode 100644
index 0000000..66a6e8f
--- /dev/null
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/AbstractServerActivator.java
@@ -0,0 +1,63 @@
+/**
+ * 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.cxf.osgi.itests;
+
+import org.apache.cxf.endpoint.Server;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.util.tracker.ServiceTracker;
+
+public abstract class AbstractServerActivator implements BundleActivator {
+
+    private Server server;
+
+    public static void awaitService(BundleContext bundleContext, String filter, long timeout)
+            throws InvalidSyntaxException, InterruptedException {
+        Filter serviceFilter = bundleContext.createFilter(filter);
+        ServiceTracker<Object, ?> tracker = new ServiceTracker<>(bundleContext, serviceFilter, null);
+        tracker.open();
+        Object service = tracker.waitForService(timeout);
+        tracker.close();
+        if (service == null) {
+            throw new IllegalStateException("Expected service with filter " + filter + " was not found");
+        }
+    }
+
+    private static void awaitCxfServlet(BundleContext bundleContext)
+            throws InvalidSyntaxException, InterruptedException {
+        awaitService(bundleContext, "(" + Constants.OBJECTCLASS + "=javax.servlet.ServletContext)", 60000L);
+    }
+
+    @Override
+    public void start(BundleContext bundleContext) throws Exception {
+        awaitCxfServlet(bundleContext);
+        server = createServer();
+    }
+
+    protected abstract Server createServer();
+
+    @Override
+    public void stop(BundleContext bundleContext) throws Exception {
+        server.destroy();
+    }
+
+}
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BundlesAndNamespacesTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BundlesAndNamespacesTest.java
index 5640197..05b7025 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BundlesAndNamespacesTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/BundlesAndNamespacesTest.java
@@ -38,23 +38,23 @@ public class BundlesAndNamespacesTest extends CXFOSGiTestSupport {
     @Test
     public void test() throws Exception {
         assertBundleStarted("org.apache.cxf.cxf-core");
-        assertBlueprintNamespacePublished("http://cxf.apache.org/blueprint/core", 1000);
-        assertBlueprintNamespacePublished("http://cxf.apache.org/configuration/beans", 1000);
-        assertBlueprintNamespacePublished("http://cxf.apache.org/configuration/parameterized-types", 1000);
-        assertBlueprintNamespacePublished("http://cxf.apache.org/configuration/security", 1000);
-        assertBlueprintNamespacePublished("http://schemas.xmlsoap.org/wsdl/", 1000);
+        assertBlueprintNamespacePublished("http://cxf.apache.org/blueprint/core", 1000L);
+        assertBlueprintNamespacePublished("http://cxf.apache.org/configuration/beans", 1000L);
+        assertBlueprintNamespacePublished("http://cxf.apache.org/configuration/parameterized-types", 1000L);
+        assertBlueprintNamespacePublished("http://cxf.apache.org/configuration/security", 1000L);
+        assertBlueprintNamespacePublished("http://schemas.xmlsoap.org/wsdl/", 1000L);
 
         assertBundleStarted("org.apache.cxf.cxf-rt-frontend-jaxws");
-        assertBlueprintNamespacePublished("http://cxf.apache.org/blueprint/jaxws", 1000);
-        assertBlueprintNamespacePublished("http://cxf.apache.org/blueprint/simple", 1000);
+        assertBlueprintNamespacePublished("http://cxf.apache.org/blueprint/jaxws", 1000L);
+        assertBlueprintNamespacePublished("http://cxf.apache.org/blueprint/simple", 1000L);
     }
 
     @Configuration
     public Option[] config() {
         return new Option[]{
                 cxfBaseConfig(),
-
-                features(cxfUrl, "aries-blueprint", "cxf-core", "cxf-jaxws"),
+                features(karafUrl, "aries-blueprint"),
+                features(cxfUrl, "cxf-core", "cxf-jaxws"),
                 logLevel(LogLevel.INFO)};
     }
 }
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
index 4224671..cffd4d6 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/CXFOSGiTestSupport.java
@@ -22,27 +22,22 @@ package org.apache.cxf.osgi.itests;
 
 
 import java.io.File;
-import java.io.IOException;
-import java.net.DatagramSocket;
-import java.net.ServerSocket;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.net.URISyntaxException;
 
 import javax.inject.Inject;
 
-import org.apache.karaf.features.FeaturesService;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.util.tracker.ServiceTracker;
+import org.osgi.framework.InvalidSyntaxException;
 
-import org.junit.Assert;
 import org.ops4j.pax.exam.MavenUtils;
 import org.ops4j.pax.exam.Option;
 import org.ops4j.pax.exam.karaf.container.internal.JavaVersionUtil;
 import org.ops4j.pax.exam.options.MavenUrlReference;
 import org.ops4j.pax.exam.options.extra.VMOption;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.ops4j.pax.exam.CoreOptions.composite;
 import static org.ops4j.pax.exam.CoreOptions.maven;
 import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
@@ -60,11 +55,6 @@ public class CXFOSGiTestSupport {
     @Inject
     protected BundleContext bundleContext;
 
-    @Inject
-    protected FeaturesService featureService;
-
-    protected ExecutorService executor = Executors.newCachedThreadPool();
-
     protected MavenUrlReference cxfUrl;
     protected MavenUrlReference karafUrl;
     protected MavenUrlReference amqUrl;
@@ -81,16 +71,21 @@ public class CXFOSGiTestSupport {
      */
     protected Option cxfBaseConfig() {
         karafUrl = maven().groupId("org.apache.karaf").artifactId("apache-karaf-minimal").version(getKarafVersion())
-            .type("tar.gz");
+                .type("tar.gz");
         cxfUrl = maven().groupId("org.apache.cxf.karaf").artifactId("apache-cxf").versionAsInProject()
-            .type("xml").classifier("features");
+                .type("xml").classifier("features");
         amqUrl = maven().groupId("org.apache.activemq")
-        .artifactId("activemq-karaf").type("xml").classifier("features").versionAsInProject();
-        springLegacyUrl = maven().groupId("org.apache.karaf.features").
-            artifactId("spring-legacy").version(getKarafVersion())
-            .type("xml").classifier("features");
+                .artifactId("activemq-karaf").type("xml").classifier("features").versionAsInProject();
+        springLegacyUrl = maven().groupId("org.apache.karaf.features").artifactId("spring-legacy")
+                .version(getKarafVersion()).type("xml").classifier("features");
         String localRepo = System.getProperty("localRepository");
         Object urp = System.getProperty("cxf.useRandomFirstPort");
+        final File loggingCfg;
+        try {
+            loggingCfg = new File(getClass().getResource("/etc/org.ops4j.pax.logging.cfg").toURI());
+        } catch (URISyntaxException e) {
+            throw new RuntimeException(e);
+        }
         if (JavaVersionUtil.getMajorVersion() >= 9) {
             return composite(karafDistributionConfiguration()
                              .frameworkUrl(karafUrl)
@@ -103,8 +98,7 @@ public class CXFOSGiTestSupport {
                          //debugConfiguration(), // nor this
                          systemProperty("pax.exam.osgi.unresolved.fail").value("true"),
                          systemProperty("java.awt.headless").value("true"),
-                         replaceConfigurationFile("etc/org.ops4j.pax.logging.cfg",
-                                                  new File("src/test/resources/etc/org.ops4j.pax.logging.cfg")),
+                         replaceConfigurationFile("etc/org.ops4j.pax.logging.cfg", loggingCfg),
                          when(localRepo != null)
                              .useOptions(editConfigurationFilePut("etc/org.ops4j.pax.url.mvn.cfg",
                                                                   "org.ops4j.pax.url.mvn.localRepository",
@@ -149,8 +143,7 @@ public class CXFOSGiTestSupport {
                          //debugConfiguration(), // nor this
                          systemProperty("pax.exam.osgi.unresolved.fail").value("true"),
                          systemProperty("java.awt.headless").value("true"),
-                         replaceConfigurationFile("etc/org.ops4j.pax.logging.cfg",
-                                                  new File("src/test/resources/etc/org.ops4j.pax.logging.cfg")),
+                         replaceConfigurationFile("etc/org.ops4j.pax.logging.cfg", loggingCfg),
                          when(localRepo != null)
                              .useOptions(editConfigurationFilePut("etc/org.ops4j.pax.url.mvn.cfg",
                                                                   "org.ops4j.pax.url.mvn.localRepository",
@@ -159,66 +152,14 @@ public class CXFOSGiTestSupport {
         }
     }
 
-    protected Option testUtils() {
+    protected static Option testUtils() {
         return mavenBundle().groupId("org.apache.cxf").artifactId("cxf-testutils").versionAsInProject();
     }
 
-    protected Bundle getInstalledBundle(String symbolicName) {
-        for (Bundle b : bundleContext.getBundles()) {
-            if (b.getSymbolicName().equals(symbolicName)) {
-                return b;
-            }
-        }
-        for (Bundle b : bundleContext.getBundles()) {
-            System.err.println("Bundle: " + b.getSymbolicName());
-        }
-        throw new RuntimeException("Bundle " + symbolicName + " does not exist");
-    }
-
-    /**
-     * Finds a free port starting from the give port numner.
-     *
-     * @return
-     */
-    protected int getFreePort(int port) {
-        while (!isPortAvailable(port)) {
-            port++;
-        }
-        return port;
-    }
-
-    /**
-     * Returns true if port is available for use.
-     *
-     * @param port
-     * @return
-     */
-    public static boolean isPortAvailable(int port) {
-        ServerSocket ss = null;
-        try (DatagramSocket ds = new DatagramSocket(port)) {
-            ss = new ServerSocket(port);
-            ss.setReuseAddress(true);
-            ds.setReuseAddress(true);
-            return true;
-        } catch (IOException e) {
-            // ignore
-        } finally {
-            if (ss != null) {
-                try {
-                    ss.close();
-                } catch (IOException e) {
-                    /* should not be thrown */
-                }
-            }
-        }
-
-        return false;
-    }
-
     protected void assertBundleStarted(String name) {
         Bundle bundle = findBundleByName(name);
-        Assert.assertNotNull("Bundle " + name + " should be installed", bundle);
-        Assert.assertEquals("Bundle " + name + " should be started", Bundle.ACTIVE, bundle.getState());
+        assertNotNull("Bundle " + name + " should be installed", bundle);
+        assertEquals("Bundle " + name + " should be started", Bundle.ACTIVE, bundle.getState());
     }
 
     protected Bundle findBundleByName(String symbolicName) {
@@ -230,24 +171,12 @@ public class CXFOSGiTestSupport {
         return null;
     }
 
-    public void assertServicePublished(String filter, int timeout) {
-        try {
-            Filter serviceFilter = bundleContext.createFilter(filter);
-            ServiceTracker<Object, ?> tracker = new ServiceTracker<>(bundleContext, serviceFilter, null);
-            tracker.open();
-            Object service = tracker.waitForService(timeout);
-            tracker.close();
-            if (service == null) {
-                throw new IllegalStateException("Expected service with filter " + filter + " was not found");
-            }
-        } catch (Exception e) {
-            throw new RuntimeException("Unexpected exception occured", e);
-        }
-    }
-
-    public void assertBlueprintNamespacePublished(String namespace, int timeout) {
-        assertServicePublished(String.format("(&(objectClass=org.apache.aries.blueprint.NamespaceHandler)"
-                                             + "(osgi.service.blueprint.namespace=%s))", namespace), timeout);
+    protected void assertBlueprintNamespacePublished(String namespace, long timeout)
+            throws InvalidSyntaxException, InterruptedException {
+        AbstractServerActivator.awaitService(bundleContext,
+                String.format("(&(objectClass=org.apache.aries.blueprint.NamespaceHandler)"
+                        + "(osgi.service.blueprint.namespace=%s))", namespace),
+                timeout);
     }
 
 }
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
index 05a1847..b59f96c 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsServiceTest.java
@@ -20,17 +20,16 @@ package org.apache.cxf.osgi.itests.jaxrs;
 
 import java.io.InputStream;
 
-import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
 import javax.ws.rs.client.Entity;
 import javax.ws.rs.client.WebTarget;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import org.apache.cxf.osgi.itests.AbstractServerActivator;
 import org.apache.cxf.osgi.itests.CXFOSGiTestSupport;
 import org.osgi.framework.Constants;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -41,7 +40,8 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.tinybundles.core.TinyBundles;
 
-
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
@@ -53,17 +53,12 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
 
     private static final String BASE_URL = "http://localhost:8181/cxf/jaxrs/bookstore";
 
-    private final WebTarget wt;
-
-    public JaxRsServiceTest() {
-        Client client = ClientBuilder.newClient();
-        wt = client.target(BASE_URL);
-    }
+    private final WebTarget wt = ClientBuilder.newClient().target(BASE_URL);
 
     @Test
     public void testJaxRsGet() throws Exception {
         Book book = wt.path("/books/123").request("application/xml").get(Book.class);
-        Assert.assertNotNull(book);
+        assertNotNull(book);
     }
 
     @Test
@@ -71,7 +66,7 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
         Book book = new Book("New Book", 321);
         Response response = wt.path("/books/").request("application/xml").post(Entity.xml(book));
         assertStatus(Status.CREATED, response);
-        Assert.assertNotNull(response.getLocation());
+        assertNotNull(response.getLocation());
     }
     
     @Test
@@ -86,7 +81,7 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
         Book book = new Book("A Book", 3212);
         Response response = wt.path("/books-validate/").request("application/xml").post(Entity.xml(book));
         assertStatus(Status.CREATED, response);
-        Assert.assertNotNull(response.getLocation());
+        assertNotNull(response.getLocation());
     }
 
     @Test
@@ -102,25 +97,24 @@ public class JaxRsServiceTest extends CXFOSGiTestSupport {
         assertStatus(Status.OK, response);
     }
 
+    private static void assertStatus(Status expectedStatus, Response response) {
+        assertEquals(expectedStatus.getStatusCode(), response.getStatus());
+    }
+
     @Configuration
     public Option[] config() {
         return new Option[] {
             cxfBaseConfig(),
-            features(cxfUrl, "aries-blueprint", "cxf-core", "cxf-wsdl", "cxf-jaxrs", "http",
-                    "cxf-bean-validation-core",
-                    "cxf-bean-validation"),
-            testUtils(),
+            features(karafUrl, "aries-blueprint", "http"),
+            features(cxfUrl, "cxf-core", "cxf-wsdl", "cxf-jaxrs", "cxf-bean-validation-core", "cxf-bean-validation"),
             logLevel(LogLevel.INFO),
             provision(serviceBundle())
         };
     }
 
-    private void assertStatus(Status expectedStatus, Response response) {
-        Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus());
-    }
-
-    private InputStream serviceBundle() {
+    private static InputStream serviceBundle() {
         return TinyBundles.bundle()
+                  .add(AbstractServerActivator.class)
                   .add(JaxRsTestActivator.class)
                   .add(Book.class)
                   .add(BookStore.class)
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
index 6a73a29..8f4b286 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/jaxrs/JaxRsTestActivator.java
@@ -18,31 +18,21 @@
  */
 package org.apache.cxf.osgi.itests.jaxrs;
 
-import org.apache.cxf.Bus;
-import org.apache.cxf.BusFactory;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
+import org.apache.cxf.osgi.itests.AbstractServerActivator;
 
-public class JaxRsTestActivator implements BundleActivator {
-//    public static final String PORT = TestUtil.getPortNumber(JaxRsTestActivator.class);
-    private Server server;
+public class JaxRsTestActivator extends AbstractServerActivator {
 
     @Override
-    public void start(BundleContext arg0) throws Exception {
-        Bus bus = BusFactory.newInstance().createBus();
-        bus.setExtension(JaxRsTestActivator.class.getClassLoader(), ClassLoader.class);
+    protected Server createServer() {
+//        Bus bus = BusFactory.newInstance().createBus();
+//        bus.setExtension(JaxRsTestActivator.class.getClassLoader(), ClassLoader.class);
         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();
-        sf.setBus(bus);
+//        sf.setBus(bus);
         sf.setResourceClasses(BookStore.class);
         sf.setAddress("/jaxrs");
-        server = sf.create();
-    }
-
-    @Override
-    public void stop(BundleContext arg0) throws Exception {
-        server.destroy();
+        return sf.create();
     }
 
 }
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpServiceTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpServiceTest.java
index c2894d0..307d1f8 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpServiceTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpServiceTest.java
@@ -21,10 +21,10 @@ package org.apache.cxf.osgi.itests.soap;
 import java.io.InputStream;
 
 import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
+import org.apache.cxf.osgi.itests.AbstractServerActivator;
 import org.apache.cxf.osgi.itests.CXFOSGiTestSupport;
 import org.osgi.framework.Constants;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -35,6 +35,7 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.tinybundles.core.TinyBundles;
 
+import static org.junit.Assert.assertEquals;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
@@ -47,14 +48,14 @@ public class HttpServiceTest extends CXFOSGiTestSupport {
     public void testHttpEndpoint() throws Exception {
         Greeter greeter = greeterHttpProxy("8181");
         String res = greeter.greetMe("Chris");
-        Assert.assertEquals("Hi Chris", res);
+        assertEquals("Hi Chris", res);
     }
 
     @Test
     public void testHttpEndpointJetty() throws Exception {
         Greeter greeter = greeterHttpProxy(HttpTestActivator.PORT);
         String res = greeter.greetMe("Chris");
-        Assert.assertEquals("Hi Chris", res);
+        assertEquals("Hi Chris", res);
     }
 
     private Greeter greeterHttpProxy(String port) {
@@ -68,15 +69,17 @@ public class HttpServiceTest extends CXFOSGiTestSupport {
     public Option[] config() {
         return new Option[] {
             cxfBaseConfig(),
-            features(cxfUrl, "cxf-jaxws", "cxf-http-jetty", "http"),
+            features(karafUrl, "http"),
+            features(cxfUrl, "cxf-jaxws", "cxf-http-jetty"),
             testUtils(),
             logLevel(LogLevel.INFO),
             provision(serviceBundle())
         };
     }
 
-    private InputStream serviceBundle() {
+    private static InputStream serviceBundle() {
         return TinyBundles.bundle()
+                  .add(AbstractServerActivator.class)
                   .add(HttpTestActivator.class)
                   .add(Greeter.class)
                   .add(GreeterImpl.class)
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpTestActivator.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpTestActivator.java
index 8d46c1a..56b8b79 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpTestActivator.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/HttpTestActivator.java
@@ -20,19 +20,18 @@ package org.apache.cxf.osgi.itests.soap;
 
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
+import org.apache.cxf.osgi.itests.AbstractServerActivator;
 import org.apache.cxf.testutil.common.TestUtil;
-import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
-public class HttpTestActivator implements BundleActivator {
+public class HttpTestActivator extends AbstractServerActivator {
     public static final String PORT = TestUtil.getPortNumber(HttpTestActivator.class);
-    private Server server;
     private Server serverJetty;
 
     @Override
-    public void start(BundleContext arg0) throws Exception {
-        server = createTestServer("/greeter");
+    protected Server createServer() {
         serverJetty = createTestServer("http://localhost:" + PORT + "/cxf/greeter");
+        return createTestServer("/greeter");
     }
 
     private Server createTestServer(String url) {
@@ -44,8 +43,8 @@ public class HttpTestActivator implements BundleActivator {
     }
 
     @Override
-    public void stop(BundleContext arg0) throws Exception {
-        server.destroy();
+    public void stop(BundleContext bundleContext) throws Exception {
+        super.stop(bundleContext);
         serverJetty.destroy();
     }
 
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsServiceTest.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsServiceTest.java
index a97fbcc..dcde114 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsServiceTest.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsServiceTest.java
@@ -29,7 +29,6 @@ import org.apache.cxf.osgi.itests.CXFOSGiTestSupport;
 import org.apache.cxf.transport.jms.ConnectionFactoryFeature;
 import org.osgi.framework.Constants;
 
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.Configuration;
@@ -39,6 +38,7 @@ import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
 import org.ops4j.pax.tinybundles.core.TinyBundles;
 
+import static org.junit.Assert.assertEquals;
 import static org.ops4j.pax.exam.CoreOptions.provision;
 import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
 
@@ -50,10 +50,10 @@ public class JmsServiceTest extends CXFOSGiTestSupport {
     public void testJmsEndpoint() throws Exception {
         Greeter greeter = greeterJms();
         String res = greeter.greetMe("Chris");
-        Assert.assertEquals("Hi Chris", res);
+        assertEquals("Hi Chris", res);
     }
 
-    private Greeter greeterJms() {
+    private static Greeter greeterJms() {
         JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
         factory.setServiceClass(Greeter.class);
         factory.setAddress("jms:queue:greeter");
@@ -62,7 +62,7 @@ public class JmsServiceTest extends CXFOSGiTestSupport {
         return factory.create(Greeter.class);
     }
 
-    private ActiveMQConnectionFactory createConnectionFactory() {
+    private static ActiveMQConnectionFactory createConnectionFactory() {
         ActiveMQConnectionFactory connectionFactory
             = new ActiveMQConnectionFactory("vm://JmsServiceTest");
         connectionFactory.setUserName("karaf");
@@ -74,17 +74,21 @@ public class JmsServiceTest extends CXFOSGiTestSupport {
     public Option[] config() {
         return new Option[] {
             cxfBaseConfig(),
-            testUtils(),
-            features(springLegacyUrl, "spring/4.3.18.RELEASE_1"),
+            features(karafUrl, "aries-blueprint", "shell-compat"),
             features(cxfUrl, "cxf-core", "cxf-jaxws", "cxf-transports-jms"),
-            features(amqUrl, "aries-blueprint", "shell-compat", "activemq-broker-noweb"),
+            features(springLegacyUrl, "spring/4.3.18.RELEASE_1"),
+            features(amqUrl, "activemq-broker-noweb"),
             provision(serviceBundle())
         };
     }
 
-    private InputStream serviceBundle() {
-        return TinyBundles.bundle().add(JmsTestActivator.class).add(Greeter.class).add(GreeterImpl.class)
-            .set(Constants.BUNDLE_ACTIVATOR, JmsTestActivator.class.getName()).build(TinyBundles.withBnd());
+    private static InputStream serviceBundle() {
+        return TinyBundles.bundle()
+                .add(JmsTestActivator.class)
+                .add(Greeter.class)
+                .add(GreeterImpl.class)
+                .set(Constants.BUNDLE_ACTIVATOR, JmsTestActivator.class.getName())
+                .build(TinyBundles.withBnd());
     }
 
 }
diff --git a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsTestActivator.java b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsTestActivator.java
index 44fc44f..e9a97ce 100644
--- a/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsTestActivator.java
+++ b/osgi/itests/src/test/java/org/apache/cxf/osgi/itests/soap/JmsTestActivator.java
@@ -25,13 +25,11 @@ import javax.jms.ConnectionFactory;
 import org.apache.activemq.ActiveMQConnectionFactory;
 import org.apache.cxf.endpoint.Server;
 import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
-import org.apache.cxf.testutil.common.TestUtil;
 import org.apache.cxf.transport.jms.ConnectionFactoryFeature;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 
 public class JmsTestActivator implements BundleActivator {
-    public static final String PORT = TestUtil.getPortNumber(JmsTestActivator.class);
     private Server server;
 
     @Override