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

[12/27] camel git commit: CAMEL-9766: camel-itest-karaf to get working on karaf 4

CAMEL-9766: camel-itest-karaf to get working on karaf 4


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/88f01405
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/88f01405
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/88f01405

Branch: refs/heads/jdk8-lambdas
Commit: 88f01405d5c644b3b9d297be1d5b3514a42abccb
Parents: ec9f12b
Author: Claus Ibsen <da...@apache.org>
Authored: Sun Mar 27 11:21:14 2016 +0200
Committer: Claus Ibsen <da...@apache.org>
Committed: Sun Mar 27 11:21:14 2016 +0200

----------------------------------------------------------------------
 .../camel/itest/karaf/AbstractFeatureTest.java  | 135 ++++++++++++++++---
 .../camel/itest/karaf/CamelCassandraqlTest.java |   2 +-
 .../test/resources/OSGI-INF/blueprint/camel.xml |  10 ++
 3 files changed, 126 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/88f01405/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/AbstractFeatureTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/AbstractFeatureTest.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/AbstractFeatureTest.java
index ee7d51f..29faff6 100644
--- a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/AbstractFeatureTest.java
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/AbstractFeatureTest.java
@@ -21,24 +21,39 @@ import java.io.InputStream;
 import java.lang.reflect.Field;
 import java.nio.charset.Charset;
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Dictionary;
+import java.util.EnumSet;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Properties;
 import javax.inject.Inject;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Component;
 import org.apache.camel.blueprint.BlueprintCamelContext;
 import org.apache.camel.impl.DefaultRouteContext;
 import org.apache.camel.model.DataFormatDefinition;
+import org.apache.karaf.features.FeaturesService;
 import org.junit.After;
 import org.junit.Before;
+import org.ops4j.pax.exam.CoreOptions;
 import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.ProbeBuilder;
+import org.ops4j.pax.exam.TestProbeBuilder;
 import org.ops4j.pax.exam.karaf.options.KarafDistributionOption;
 import org.ops4j.pax.exam.karaf.options.LogLevelOption;
 import org.ops4j.pax.exam.options.MavenArtifactProvisionOption;
 import org.ops4j.pax.exam.options.UrlReference;
-import org.ops4j.pax.exam.rbc.Constants;
 import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkUtil;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
 import org.osgi.service.blueprint.container.BlueprintContainer;
+import org.osgi.util.tracker.ServiceTracker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -58,12 +73,19 @@ public abstract class AbstractFeatureTest {
     @Inject
     protected BlueprintContainer blueprintContainer;
 
+    @Inject
+    protected FeaturesService featuresService;
+
+    @ProbeBuilder
+    public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
+        // makes sure the generated Test-Bundle contains this import!
+        probe.setHeader(Constants.DYNAMICIMPORT_PACKAGE, "*");
+        return probe;
+    }
+
     @Before
     public void setUp() throws Exception {
         LOG.info("setUp() using BundleContext: {}", bundleContext);
-
-        // give time for karaf to install
-        Thread.sleep(3000);
     }
 
     @After
@@ -72,19 +94,25 @@ public abstract class AbstractFeatureTest {
     }
 
     protected void testComponent(String component) throws Exception {
-        long max = System.currentTimeMillis() + 10000;
-        while (true) {
-            try {
-                assertNotNull("Cannot get component with name: " + component, createCamelContext().getComponent(component));
-                return;
-            } catch (Throwable t) {
-                if (System.currentTimeMillis() < max) {
-                    Thread.sleep(1000);
-                } else {
-                    throw t;
-                }
-            }
-        }
+        testComponent("camel-" + component, component);
+    }
+
+    protected void testComponent(String mainFeature, String component) throws Exception {
+        LOG.info("Looking up CamelContext(myCamel) in OSGi Service Registry");
+
+        LOG.info("Install main feature: {}", mainFeature);
+        // do not refresh bundles causing out bundle context to be invalid
+        // TODO: see if we can find a way maybe to install camel.xml as bundle/feature instead of part of unit test (see src/test/resources/OSGI-INF/blueprint)
+        featuresService.installFeature(mainFeature, EnumSet.of(FeaturesService.Option.NoAutoRefreshBundles));
+
+        CamelContext camelContext = getOsgiService(bundleContext, CamelContext.class, "(camel.context.name=myCamel)", 20000);
+        assertNotNull("Cannot find CamelContext with name myCamel", camelContext);
+
+        LOG.info("Getting Camel component: {}", component);
+        Component comp = camelContext.getComponent(component);
+        assertNotNull("Cannot get component with name: " + component, comp);
+
+        LOG.info("Found Camel component: {} instance: {} with className: {}", component, comp, comp.getClass());
     }
 
     protected void testComponent() throws Exception {
@@ -129,6 +157,7 @@ public abstract class AbstractFeatureTest {
         }
     }
 
+    @Deprecated
     protected CamelContext createCamelContext() throws Exception {
         LOG.info("Creating CamelContext using BundleContext: {} and BlueprintContainer: {}", bundleContext, blueprintContainer);
         setThreadContextClassLoader();
@@ -207,7 +236,8 @@ public abstract class AbstractFeatureTest {
         List<String> list = new ArrayList<String>();
         list.add("camel-core");
         list.add("camel-blueprint");
-        list.add("camel-" + mainFeature);
+        list.add("camel-spring");
+        // we install main feature later
         for (String extra : extraFeatures) {
             list.add("camel-" + extra);
         }
@@ -232,8 +262,7 @@ public abstract class AbstractFeatureTest {
 
             vmOption("-Dfile.encoding=UTF-8"),
 
-            // install junit
-            getJUnitBundle(),
+            CoreOptions.junitBundles(),
 
             // install the features
             KarafDistributionOption.features(getCamelKarafFeatureUrl(), features)
@@ -246,4 +275,70 @@ public abstract class AbstractFeatureTest {
         return configure(extractName(getClass()));
     }
 
+    @SuppressWarnings("unchecked")
+    public static <T> T getOsgiService(BundleContext bundleContext, Class<T> type, String filter, long timeout) {
+        ServiceTracker tracker;
+        try {
+            String flt;
+            if (filter != null) {
+                if (filter.startsWith("(")) {
+                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")" + filter + ")";
+                } else {
+                    flt = "(&(" + Constants.OBJECTCLASS + "=" + type.getName() + ")(" + filter + "))";
+                }
+            } else {
+                flt = "(" + Constants.OBJECTCLASS + "=" + type.getName() + ")";
+            }
+            Filter osgiFilter = FrameworkUtil.createFilter(flt);
+            tracker = new ServiceTracker(bundleContext, osgiFilter, null);
+            tracker.open(true);
+            // Note that the tracker is not closed to keep the reference
+            // This is buggy, as the service reference may change i think
+            Object svc = tracker.waitForService(timeout);
+
+            if (svc == null) {
+                Dictionary<?, ?> dic = bundleContext.getBundle().getHeaders();
+                LOG.warn("Test bundle headers: " + explode(dic));
+
+                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, null))) {
+                    LOG.warn("ServiceReference: " + ref + ", bundle: " + ref.getBundle() + ", symbolicName: " + ref.getBundle().getSymbolicName());
+                }
+
+                for (ServiceReference ref : asCollection(bundleContext.getAllServiceReferences(null, flt))) {
+                    LOG.warn("Filtered ServiceReference: " + ref + ", bundle: " + ref.getBundle() + ", symbolicName: " + ref.getBundle().getSymbolicName());
+                }
+
+                throw new RuntimeException("Gave up waiting for service " + flt);
+            }
+            return type.cast(svc);
+        } catch (InvalidSyntaxException e) {
+            throw new IllegalArgumentException("Invalid filter", e);
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * Explode the dictionary into a <code>,</code> delimited list of <code>key=value</code> pairs.
+     */
+    private static String explode(Dictionary<?, ?> dictionary) {
+        Enumeration<?> keys = dictionary.keys();
+        StringBuilder result = new StringBuilder();
+        while (keys.hasMoreElements()) {
+            Object key = keys.nextElement();
+            result.append(String.format("%s=%s", key, dictionary.get(key)));
+            if (keys.hasMoreElements()) {
+                result.append(", ");
+            }
+        }
+        return result.toString();
+    }
+
+    /**
+     * Provides an iterable collection of references, even if the original array is <code>null</code>.
+     */
+    private static Collection<ServiceReference> asCollection(ServiceReference[] references) {
+        return references  == null ? new ArrayList<ServiceReference>(0) : Arrays.asList(references);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/88f01405/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelCassandraqlTest.java
----------------------------------------------------------------------
diff --git a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelCassandraqlTest.java b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelCassandraqlTest.java
index 32be3f6..5412188 100644
--- a/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelCassandraqlTest.java
+++ b/tests/camel-itest-karaf/src/test/java/org/apache/camel/itest/karaf/CamelCassandraqlTest.java
@@ -29,7 +29,7 @@ public class CamelCassandraqlTest extends AbstractFeatureTest {
 
     @Test
     public void test() throws Exception {
-        testComponent("cql");
+        testComponent(COMPONENT, "cql");
     }
 
     @Configuration

http://git-wip-us.apache.org/repos/asf/camel/blob/88f01405/tests/camel-itest-karaf/src/test/resources/OSGI-INF/blueprint/camel.xml
----------------------------------------------------------------------
diff --git a/tests/camel-itest-karaf/src/test/resources/OSGI-INF/blueprint/camel.xml b/tests/camel-itest-karaf/src/test/resources/OSGI-INF/blueprint/camel.xml
new file mode 100644
index 0000000..997f6db
--- /dev/null
+++ b/tests/camel-itest-karaf/src/test/resources/OSGI-INF/blueprint/camel.xml
@@ -0,0 +1,10 @@
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+           xmlns:camel="http://camel.apache.org/schema/blueprint"
+           xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0
+             http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">
+
+  <camelContext id="myCamel" xmlns="http://camel.apache.org/schema/blueprint">
+    <!-- empty -->
+  </camelContext>
+
+</blueprint>
\ No newline at end of file