You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2016/01/15 14:44:12 UTC

[4/9] camel git commit: CAMEL-9201: Improved Camel CDI component

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AdvisedRouteTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AdvisedRouteTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AdvisedRouteTest.java
new file mode 100644
index 0000000..61c33bb
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AdvisedRouteTest.java
@@ -0,0 +1,105 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.Properties;
+import java.util.concurrent.TimeUnit;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.AdviceWithRouteBuilder;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.ManualStartupCamelContext;
+import org.apache.camel.cdi.bean.PropertyEndpointRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.component.properties.PropertiesComponent;
+import org.apache.camel.model.ModelCamelContext;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class AdvisedRouteTest {
+
+    @Inject
+    @Uri("direct:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint outbound;
+
+    @Produces
+    @ApplicationScoped
+    @Named("properties")
+    private static PropertiesComponent configuration() {
+        Properties properties = new Properties();
+        properties.put("from", "inbound");
+        properties.put("to", "direct:outbound");
+        properties.put("header.message", "n/a");
+        PropertiesComponent component = new PropertiesComponent();
+        component.setInitialProperties(properties);
+        return component;
+    }
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(ManualStartupCamelContext.class, PropertyEndpointRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void adviseCamelContext(ModelCamelContext context) throws Exception {
+        context.getRouteDefinition("route").adviceWith(context, new AdviceWithRouteBuilder() {
+            @Override
+            public void configure() {
+                interceptSendToEndpoint("{{to}}").skipSendToOriginalEndpoint().to("mock:outbound");
+            }
+        });
+        context.startAllRoutes();
+    }
+
+    @Test
+    @InSequence(2)
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+        outbound.expectedHeaderReceived("header", "n/a");
+        
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AmbiguousCamelContextTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AmbiguousCamelContextTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AmbiguousCamelContextTest.java
new file mode 100644
index 0000000..808c363
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/AmbiguousCamelContextTest.java
@@ -0,0 +1,55 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.bean.CustomPropertiesCamelContext;
+import org.apache.camel.cdi.bean.ManualStartupCamelContext;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class AmbiguousCamelContextTest {
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(ManualStartupCamelContext.class, CustomPropertiesCamelContext.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void test(ManualStartupCamelContext lifecycleCamelContext, CustomPropertiesCamelContext propertiesCamelContext) {
+        assertThat(lifecycleCamelContext.getStatus(), is(equalTo(ServiceStatus.Started)));
+        assertThat(propertiesCamelContext.getStatus(), is(equalTo(ServiceStatus.Started)));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/BeanInjectTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/BeanInjectTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/BeanInjectTest.java
new file mode 100644
index 0000000..f5447ea
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/BeanInjectTest.java
@@ -0,0 +1,88 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.Properties;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.bean.BeanInjectBean;
+import org.apache.camel.cdi.bean.NamedCamelBean;
+import org.apache.camel.cdi.bean.PropertyInjectBean;
+import org.apache.camel.component.properties.PropertiesComponent;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class BeanInjectTest {
+
+    @Inject
+    private BeanInjectBean bean;
+
+    @Produces
+    @ApplicationScoped
+    @Named("properties")
+    private static PropertiesComponent configuration() {
+        Properties properties = new Properties();
+        properties.put("property", "value");
+        PropertiesComponent component = new PropertiesComponent();
+        component.setInitialProperties(properties);
+        return component;
+    }
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(BeanInjectBean.class, PropertyInjectBean.class, NamedCamelBean.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void beanInjectField() {
+        assertThat(bean.getInjectBeanField(), is(notNullValue()));
+        assertThat(bean.getInjectBeanField().getProperty(), is(equalTo("value")));
+    }
+
+    @Test
+    public void beanInjectMethod() {
+        assertThat(bean.getInjectBeanMethod(), is(notNullValue()));
+        assertThat(bean.getInjectBeanMethod().getProperty(), is(equalTo("value")));
+    }
+
+    @Test
+    public void beanInjectNamed() {
+        assertThat(bean.getInjectBeanNamed(), is(notNullValue()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextAwareTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextAwareTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextAwareTest.java
new file mode 100644
index 0000000..5b432ec
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextAwareTest.java
@@ -0,0 +1,57 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import javax.inject.Inject;
+
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.bean.CamelContextAwareBean;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class CamelContextAwareTest {
+
+    @Inject
+    private CamelContextAwareBean bean;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(CamelContextAwareBean.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void camelContextAware() {
+        assertThat(bean.getCamelContext(), is(notNullValue()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerFieldTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerFieldTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerFieldTest.java
new file mode 100644
index 0000000..656ad5a
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerFieldTest.java
@@ -0,0 +1,97 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+import javax.inject.Named;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.NamedCamelBean;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class CamelContextProducerFieldTest {
+
+    @Named
+    @Produces
+    @ApplicationScoped
+    private static CamelContext context = new DefaultCamelContext();
+
+    @Inject
+    @Uri("direct:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(NamedCamelBean.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void verifyProducedCamelContext(CamelContext context) {
+        assertThat("The producer field sets the context name!", context.getName(), is(equalTo("context")));
+        assertThat("The producer field starts the Camel context!", context.getStatus(), is(equalTo(ServiceStatus.Started)));
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test-processed");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+
+    private static class NamedBeanRoute extends RouteBuilder {
+        @Override
+        public void configure() {
+            from("direct:inbound").bean("beanName").to("mock:outbound");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerMethodTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerMethodTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerMethodTest.java
new file mode 100644
index 0000000..24e9319
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelContextProducerMethodTest.java
@@ -0,0 +1,89 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.CamelContextProducerMethod;
+import org.apache.camel.cdi.bean.NamedCamelBean;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class CamelContextProducerMethodTest {
+
+    @Inject
+    @Uri("direct:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(CamelContextProducerMethod.class, NamedCamelBean.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void verifyProducedCamelContext(CamelContext context) {
+        assertThat("The producer method sets the context name!", context.getName(), is(equalTo("camel-producer-method")));
+        assertThat("The producer method starts the Camel context!", context.getStatus(), is(equalTo(ServiceStatus.Started)));
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test-processed");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+
+    private static class NamedBeanRoute extends RouteBuilder {
+        @Override
+        public void configure() {
+            from("direct:inbound").bean("beanName").to("mock:outbound");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java
new file mode 100644
index 0000000..f298546
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventEndpointTest.java
@@ -0,0 +1,143 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.EventObject;
+import javax.inject.Inject;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.CdiEventEndpoint;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.management.event.CamelContextStartedEvent;
+import org.apache.camel.management.event.ExchangeCompletedEvent;
+import org.apache.camel.management.event.ExchangeCreatedEvent;
+import org.apache.camel.management.event.ExchangeSendingEvent;
+import org.apache.camel.management.event.ExchangeSentEvent;
+import org.apache.camel.management.event.RouteStartedEvent;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.contains;
+import static org.hamcrest.Matchers.either;
+import static org.hamcrest.Matchers.hasProperty;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class CamelEventEndpointTest {
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(CamelEventRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void camelStartedEvent(@Uri("mock:started") MockEndpoint started) {
+        assertThat("Event fired is incorrect!", started.getExchanges(),
+            contains(
+                hasProperty("in",
+                    hasProperty("body", instanceOf(CamelContextStartedEvent.class)))));
+    }
+
+    @Test
+    public void camelAllEvents(@Uri("mock:events") MockEndpoint events) {
+        assertThat("Events fired are incorrect!", events.getExchanges(),
+            // We cannot rely on the delivery order of the camel context started event being fired and observed by both CDI event endpoints
+            either(
+                contains(
+                    // Started route: route1
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
+                    // Started route: route2
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
+                    // Started CamelContext: camel-cdi
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(CamelContextStartedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
+                    // Started CamelContext: camel-cdi (for CdiEventEndpoint<CamelContextStartedEvent> started)
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class)))
+            )).or(
+                contains(
+                    // Started route: route1
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
+                    // Started route: route2
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(RouteStartedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
+                    // Started CamelContext: camel-cdi (for CdiEventEndpoint<CamelContextStartedEvent> started)
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class))),
+                    // Started CamelContext: camel-cdi
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCreatedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSendingEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(CamelContextStartedEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeSentEvent.class))),
+                    hasProperty("in", hasProperty("body", instanceOf(ExchangeCompletedEvent.class)))
+                )
+            )
+        );
+    }
+}
+
+class CamelEventRoute extends RouteBuilder {
+
+    @Inject
+    private CdiEventEndpoint<CamelContextStartedEvent> started;
+
+    @Inject
+    private CdiEventEndpoint<EventObject> events;
+
+    @Override
+    public void configure() {
+        from(events).startupOrder(1).to("mock:events");
+        from(started).startupOrder(2).to("mock:started");
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventNotifierTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventNotifierTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventNotifierTest.java
new file mode 100644
index 0000000..3a07d9f
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CamelEventNotifierTest.java
@@ -0,0 +1,151 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.SimpleCamelRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.management.event.AbstractExchangeEvent;
+import org.apache.camel.management.event.CamelContextStartedEvent;
+import org.apache.camel.management.event.CamelContextStartingEvent;
+import org.apache.camel.management.event.CamelContextStoppedEvent;
+import org.apache.camel.management.event.CamelContextStoppingEvent;
+import org.apache.camel.management.event.ExchangeCompletedEvent;
+import org.apache.camel.management.event.ExchangeCreatedEvent;
+import org.apache.camel.management.event.ExchangeSendingEvent;
+import org.apache.camel.management.event.ExchangeSentEvent;
+import org.hamcrest.Matchers;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class CamelEventNotifierTest {
+
+    @Inject
+    @Uri("direct:start")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:result")
+    private MockEndpoint outbound;
+
+    @Produces
+    @ApplicationScoped
+    private List<Class> firedEvents = new ArrayList<>();
+
+    private void onCamelContextStartingEvent(@Observes CamelContextStartingEvent event, List<Class> events) {
+        events.add(CamelContextStartingEvent.class);
+    }
+
+    private void onCamelContextStartedEvent(@Observes CamelContextStartedEvent event, List<Class> events) {
+        events.add(CamelContextStartedEvent.class);
+    }
+
+    private void onExchangeEvent(@Observes AbstractExchangeEvent event, List<Class> events) {
+        events.add(event.getClass());
+    }
+
+    private void onCamelContextStoppingEvent(@Observes CamelContextStoppingEvent event, List<Class> events) {
+        events.add(CamelContextStoppingEvent.class);
+    }
+
+    private void onCamelContextStoppedEvent(@Observes CamelContextStoppedEvent event, List<Class> events) {
+        events.add(CamelContextStoppedEvent.class);
+    }
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(SimpleCamelRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void startedCamelContext(List<Class> events) throws Exception {
+        assertThat("Events fired are incorrect", events,
+            Matchers.<Class>contains(
+                CamelContextStartingEvent.class,
+                CamelContextStartedEvent.class));
+    }
+
+    @Test
+    @InSequence(2)
+    public void sendMessageToInbound(List<Class> events) throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+
+        assertThat("Events fired are incorrect", events,
+            Matchers.<Class>contains(
+                CamelContextStartingEvent.class,
+                CamelContextStartedEvent.class,
+                ExchangeSendingEvent.class,
+                ExchangeCreatedEvent.class,
+                ExchangeSendingEvent.class,
+                ExchangeSentEvent.class,
+                ExchangeCompletedEvent.class,
+                ExchangeSentEvent.class));
+    }
+
+    @Test
+    @InSequence(3)
+    public void stopCamelContext(CamelContext context, List<Class> events) throws Exception {
+        context.stop();
+
+        assertThat("Events fired are incorrect", events,
+            Matchers.<Class>contains(
+                CamelContextStartingEvent.class,
+                CamelContextStartedEvent.class,
+                ExchangeSendingEvent.class,
+                ExchangeCreatedEvent.class,
+                ExchangeSendingEvent.class,
+                ExchangeSentEvent.class,
+                ExchangeCompletedEvent.class,
+                ExchangeSentEvent.class,
+                CamelContextStoppingEvent.class,
+                CamelContextStoppedEvent.class));
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumeMethodTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumeMethodTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumeMethodTest.java
new file mode 100644
index 0000000..3f112c9
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ConsumeMethodTest.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.ConsumeMethodBean;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class ConsumeMethodTest {
+
+    @Inject
+    @Uri("seda:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(ConsumeMethodBean.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void consumeAnnotation() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ContextComponentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ContextComponentTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ContextComponentTest.java
new file mode 100644
index 0000000..fe1a80e
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/ContextComponentTest.java
@@ -0,0 +1,92 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.DefaultCamelContextBean;
+import org.apache.camel.cdi.bean.FirstNamedCamelContextBean;
+import org.apache.camel.cdi.bean.FirstNamedCamelContextRoute;
+import org.apache.camel.cdi.bean.SecondNamedCamelContextBean;
+import org.apache.camel.cdi.bean.SecondNamedCamelContextRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(Arquillian.class)
+public class ContextComponentTest {
+
+    @Inject
+    private CamelContext main;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(
+                DefaultCamelContextBean.class,
+                FirstNamedCamelContextBean.class,
+                FirstNamedCamelContextRoute.class,
+                SecondNamedCamelContextBean.class,
+                SecondNamedCamelContextRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void addRouteToMainContext() throws Exception {
+        main.addRoutes(new RouteBuilder() {
+            @Override
+            public void configure() {
+                from("direct:inbound").to("first:in");
+                // FIXME: The context component does not support multiple logical endpoints
+                // with the same remaining defined in two distinct Camel contexts.
+                // See https://issues.apache.org/jira/browse/CAMEL-9200.
+                // from("first:out").to("second:in");
+                from("first:out").to("mock:outbound");
+            }
+        });
+    }
+
+    @Test
+    @InSequence(2)
+    public void sendMessageToInbound(@Uri("direct:inbound") ProducerTemplate inbound,
+                                     @Uri("mock:outbound") MockEndpoint outbound) throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("first-test");
+
+        inbound.sendBody("test");
+
+        MockEndpoint.assertIsSatisfied(1L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CustomCamelContextTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CustomCamelContextTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CustomCamelContextTest.java
new file mode 100644
index 0000000..cf46c74
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/CustomCamelContextTest.java
@@ -0,0 +1,90 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.ServiceStatus;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.ManualStartupCamelContext;
+import org.apache.camel.cdi.bean.UriEndpointRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.junit.InSequence;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class CustomCamelContextTest {
+
+    @Inject
+    @Uri("direct:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(ManualStartupCamelContext.class, UriEndpointRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    @InSequence(1)
+    public void verifyCamelContext(CamelContext context) {
+        assertThat(context.getName(), is(equalTo("manual-startup")));
+
+        assertThat(inbound.getCamelContext().getName(), is(equalTo(context.getName())));
+        assertThat(outbound.getCamelContext().getName(), is(equalTo(context.getName())));
+
+        assertThat(context.getRouteStatus("uri-route"), is(equalTo(ServiceStatus.Stopped)));
+    }
+
+    @Test
+    @InSequence(2)
+    public void sendMessageToInbound(CamelContext context) throws Exception {
+        context.startAllRoutes();
+
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultCamelContextTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultCamelContextTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultCamelContextTest.java
new file mode 100644
index 0000000..761ea8e
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/DefaultCamelContextTest.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.SimpleCamelRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class DefaultCamelContextTest {
+
+    @Inject
+    @Uri("direct:start")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:result")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(SimpleCamelRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EndpointInjectTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EndpointInjectTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EndpointInjectTest.java
new file mode 100644
index 0000000..a49dca4
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EndpointInjectTest.java
@@ -0,0 +1,69 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.EndpointInjectRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class EndpointInjectTest {
+
+    @Inject
+    @Uri("direct:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    @Uri("mock:outbound")
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(EndpointInjectRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+        
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventComponentTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventComponentTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventComponentTest.java
new file mode 100644
index 0000000..424a7a8
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventComponentTest.java
@@ -0,0 +1,91 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import javax.enterprise.context.ApplicationScoped;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.instanceOf;
+import static org.hamcrest.Matchers.is;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+
+@RunWith(Arquillian.class)
+public class EventComponentTest {
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    // We should ideally use an ExpectedException JUnit rule to assert the content of the exception
+    // thrown at deployment time. Unfortunately, OpenWebBeans does not enable access to the underlying
+    // cause added as deployment exception. To work-around that, we delay the start of the Camel context
+    // at runtime.
+
+    @Test
+    public void createEventEndpointByUri(NotStartedCamelContext context) {
+        try {
+            context.start(true);
+        } catch (Exception exception) {
+            Throwable cause = exception.getCause().getCause();
+            assertThat("Exception cause is not an UnsupportedOperationException!", cause, is(instanceOf(UnsupportedOperationException.class)));
+            assertThat("Incorrect exception message!", cause.getMessage(), is(equalTo("Creating CDI event endpoint isn't supported. Use @Inject CdiEventEndpoint instead")));
+            return;
+        }
+        fail("CDI event endpoint creation by URI should throw an exception!");
+    }
+
+    static class CdiEventComponentRoute extends RouteBuilder {
+
+        @Override
+        public void configure() {
+            from("cdi-event://Object").log("Unsupported operation!");
+        }
+    }
+
+    @ApplicationScoped
+    static class NotStartedCamelContext extends DefaultCamelContext {
+
+        @Override
+        public void start() throws Exception {
+            start(false);
+        }
+
+        void start(boolean start) throws Exception {
+            if (start) {
+                super.start();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointCdi12Test.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointCdi12Test.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointCdi12Test.java
new file mode 100644
index 0000000..bf78aa3
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointCdi12Test.java
@@ -0,0 +1,277 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Event;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Default;
+import javax.enterprise.util.TypeLiteral;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.EventConsumingRoute;
+import org.apache.camel.cdi.bean.EventProducingRoute;
+import org.apache.camel.cdi.pojo.EventPayload;
+import org.apache.camel.cdi.qualifier.BarQualifier;
+import org.apache.camel.cdi.qualifier.FooQualifier;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+import static org.hamcrest.Matchers.contains;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class EventEndpointCdi12Test {
+
+    @Inject
+    @Uri("mock:consumeObject")
+    private MockEndpoint consumeObject;
+
+    @Inject
+    @Uri("mock:consumeString")
+    private MockEndpoint consumeString;
+
+    @Inject
+    @Uri("mock:consumeStringPayload")
+    private MockEndpoint consumeStringPayload;
+
+    @Inject
+    @Uri("mock:consumeIntegerPayload")
+    private MockEndpoint consumeIntegerPayload;
+
+    @Inject
+    @Uri("mock:consumeFooQualifier")
+    private MockEndpoint consumeFooQualifier;
+
+    @Inject
+    @Uri("mock:consumeBarQualifier")
+    private MockEndpoint consumeBarQualifier;
+
+    @Inject
+    @Uri("direct:produceObject")
+    private ProducerTemplate produceObject;
+
+    @Inject
+    @Uri("direct:produceString")
+    private ProducerTemplate produceString;
+
+    @Inject
+    @Uri("direct:produceStringPayload")
+    private ProducerTemplate produceStringPayload;
+
+    @Inject
+    @Uri("direct:produceIntegerPayload")
+    private ProducerTemplate produceIntegerPayload;
+
+    @Inject
+    @Uri("direct:produceFooQualifier")
+    private ProducerTemplate produceFooQualifier;
+
+    @Inject
+    @Uri("direct:produceBarQualifier")
+    private ProducerTemplate produceBarQualifier;
+
+    @Inject
+    private Event<Object> objectEvent;
+
+    @Inject
+    private Event<EventPayload<String>> stringPayloadEvent;
+
+    @Inject
+    private Event<EventPayload<Integer>> integerPayloadEvent;
+
+    @Inject
+    private EventObserver observer;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(EventConsumingRoute.class, EventProducingRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Before
+    public void resetCollectedEventsAndMockEndpoints() {
+        observer.reset();
+        consumeObject.reset();
+        consumeString.reset();
+        consumeStringPayload.reset();
+        consumeIntegerPayload.reset();
+        consumeFooQualifier.reset();
+        consumeBarQualifier.reset();
+    }
+
+    @Test
+    public void sendEventsToConsumers() throws InterruptedException {
+        consumeObject.expectedMessageCount(8);
+        consumeObject.expectedBodiesReceived(1234, new EventPayload<>("foo"), new EventPayload<>("bar"), "test", new EventPayload<>(1), new EventPayload<>(2), 123L, 987L);
+
+        consumeString.expectedMessageCount(1);
+        consumeString.expectedBodiesReceived("test");
+
+        consumeStringPayload.expectedMessageCount(2);
+        consumeStringPayload.expectedBodiesReceived(new EventPayload<>("foo"), new EventPayload<>("bar"));
+
+        consumeIntegerPayload.expectedMessageCount(2);
+        consumeIntegerPayload.expectedBodiesReceived(new EventPayload<>(1), new EventPayload<>(2));
+
+        consumeFooQualifier.expectedMessageCount(1);
+        consumeFooQualifier.expectedBodiesReceived(123L);
+
+        consumeBarQualifier.expectedMessageCount(1);
+        consumeBarQualifier.expectedBodiesReceived(987L);
+
+        objectEvent.select(Integer.class).fire(1234);
+        objectEvent.select(new TypeLiteral<EventPayload<String>>() {
+        }).fire(new EventPayload<>("foo"));
+        stringPayloadEvent.select(new BarQualifier.Literal()).fire(new EventPayload<>("bar"));
+        objectEvent.select(String.class).fire("test");
+        integerPayloadEvent.fire(new EventPayload<>(1));
+        integerPayloadEvent.fire(new EventPayload<>(2));
+        objectEvent.select(Long.class, new FooQualifier.Literal()).fire(123L);
+        objectEvent.select(Long.class, new BarQualifier.Literal()).fire(987L);
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, consumeObject, consumeString, consumeStringPayload, consumeIntegerPayload, consumeFooQualifier, consumeBarQualifier);
+    }
+
+    @Test
+    public void sendMessagesToProducers() {
+        produceObject.sendBody("string");
+        EventPayload foo = new EventPayload<>("foo");
+        produceStringPayload.sendBody(foo);
+        produceObject.sendBody(1234);
+        produceString.sendBody("test");
+        EventPayload<Integer> bar = new EventPayload<>(2);
+        produceIntegerPayload.sendBody(bar);
+        EventPayload<Integer> baz = new EventPayload<>(12);
+        produceIntegerPayload.sendBody(baz);
+        produceFooQualifier.sendBody(456L);
+        produceBarQualifier.sendBody(495L);
+        produceObject.sendBody(777L);
+
+        assertThat(observer.getObjectEvents(), contains("string", foo, 1234, "test", bar, baz, 456L, 495L, 777L));
+        assertThat(observer.getStringEvents(), contains("string", "test"));
+        assertThat(observer.getStringPayloadEvents(), contains(foo));
+        assertThat(observer.getIntegerPayloadEvents(), contains(bar, baz));
+        assertThat(observer.getDefaultQualifierEvents(), contains("string", foo, 1234, "test", bar, baz, 777L));
+        assertThat(observer.getFooQualifierEvents(), contains(456L));
+        assertThat(observer.getBarQualifierEvents(), contains(495L));
+    }
+
+    @ApplicationScoped
+    static class EventObserver {
+
+        private final List<Object> objectEvents = new ArrayList<>();
+
+        private final List<Object> defaultQualifierEvents = new ArrayList<>();
+
+        private final List<String> stringEvents = new ArrayList<>();
+
+        private final List<EventPayload<String>> stringPayloadEvents = new ArrayList<>();
+
+        private final List<EventPayload<Integer>> integerPayloadEvents = new ArrayList<>();
+
+        private final List<Long> fooQualifierEvents = new ArrayList<>();
+
+        private final List<Long> barQualifierEvents = new ArrayList<>();
+
+        void collectObjectEvents(@Observes Object event) {
+            objectEvents.add(event);
+        }
+
+        void collectStringEvents(@Observes String event) {
+            stringEvents.add(event);
+        }
+
+        void collectStringPayloadEvents(@Observes EventPayload<String> event) {
+            stringPayloadEvents.add(event);
+        }
+
+        void collectIntegerPayloadEvents(@Observes EventPayload<Integer> event) {
+            integerPayloadEvents.add(event);
+        }
+
+        void collectDefaultQualifierEvents(@Observes @Default Object event) {
+            defaultQualifierEvents.add(event);
+        }
+
+        void collectFooQualifierEvents(@Observes @FooQualifier Long event) {
+            fooQualifierEvents.add(event);
+        }
+
+        void collectBarQualifierEvents(@Observes @BarQualifier Long event) {
+            barQualifierEvents.add(event);
+        }
+
+        List<Object> getObjectEvents() {
+            return objectEvents;
+        }
+
+        List<String> getStringEvents() {
+            return stringEvents;
+        }
+
+        List<EventPayload<String>> getStringPayloadEvents() {
+            return stringPayloadEvents;
+        }
+
+        List<EventPayload<Integer>> getIntegerPayloadEvents() {
+            return integerPayloadEvents;
+        }
+
+        List<Object> getDefaultQualifierEvents() {
+            return defaultQualifierEvents;
+        }
+
+        List<Long> getFooQualifierEvents() {
+            return fooQualifierEvents;
+        }
+
+        List<Long> getBarQualifierEvents() {
+            return barQualifierEvents;
+        }
+
+        void reset() {
+            objectEvents.clear();
+            stringEvents.clear();
+            stringPayloadEvents.clear();
+            integerPayloadEvents.clear();
+            defaultQualifierEvents.clear();
+            fooQualifierEvents.clear();
+            barQualifierEvents.clear();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointTest.java
new file mode 100644
index 0000000..fde16fe
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/EventEndpointTest.java
@@ -0,0 +1,282 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.event.Event;
+import javax.enterprise.event.Observes;
+import javax.enterprise.inject.Default;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.EventConsumingRouteCdi10;
+import org.apache.camel.cdi.bean.EventProducingRouteCdi10;
+import org.apache.camel.cdi.pojo.EventPayload;
+import org.apache.camel.cdi.pojo.EventPayloadInteger;
+import org.apache.camel.cdi.pojo.EventPayloadString;
+import org.apache.camel.cdi.qualifier.BarQualifier;
+import org.apache.camel.cdi.qualifier.FooQualifier;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+import static org.hamcrest.Matchers.contains;
+import static org.junit.Assert.assertThat;
+
+@RunWith(Arquillian.class)
+public class EventEndpointTest {
+
+    @Inject
+    @Uri("mock:consumeObject")
+    private MockEndpoint consumeObject;
+
+    @Inject
+    @Uri("mock:consumeString")
+    private MockEndpoint consumeString;
+
+    @Inject
+    @Uri("mock:consumeStringPayload")
+    private MockEndpoint consumeStringPayload;
+
+    @Inject
+    @Uri("mock:consumeIntegerPayload")
+    private MockEndpoint consumeIntegerPayload;
+
+    @Inject
+    @Uri("mock:consumeFooQualifier")
+    private MockEndpoint consumeFooQualifier;
+
+    @Inject
+    @Uri("mock:consumeBarQualifier")
+    private MockEndpoint consumeBarQualifier;
+
+    @Inject
+    @Uri("direct:produceObject")
+    private ProducerTemplate produceObject;
+
+    @Inject
+    @Uri("direct:produceString")
+    private ProducerTemplate produceString;
+
+    @Inject
+    @Uri("direct:produceStringPayload")
+    private ProducerTemplate produceStringPayload;
+
+    @Inject
+    @Uri("direct:produceIntegerPayload")
+    private ProducerTemplate produceIntegerPayload;
+
+    @Inject
+    @Uri("direct:produceFooQualifier")
+    private ProducerTemplate produceFooQualifier;
+
+    @Inject
+    @Uri("direct:produceBarQualifier")
+    private ProducerTemplate produceBarQualifier;
+
+    @Inject
+    private Event<Object> objectEvent;
+
+    @Inject
+    private Event<EventPayload<String>> stringPayloadEvent;
+
+    @Inject
+    private Event<EventPayload<Integer>> integerPayloadEvent;
+
+    @Inject
+    private EventObserver observer;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test classes
+            .addClasses(
+                EventConsumingRouteCdi10.class,
+                EventProducingRouteCdi10.class,
+                EventPayloadString.class,
+                EventPayloadInteger.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Before
+    public void resetCollectedEventsAndMockEndpoints() {
+        observer.reset();
+        consumeObject.reset();
+        consumeString.reset();
+        consumeStringPayload.reset();
+        consumeIntegerPayload.reset();
+        consumeFooQualifier.reset();
+        consumeBarQualifier.reset();
+    }
+
+    @Test
+    public void sendEventsToConsumers() throws InterruptedException {
+        consumeObject.expectedMessageCount(8);
+        consumeObject.expectedBodiesReceived(1234, new EventPayloadString("foo"), new EventPayloadString("bar"), "test", new EventPayloadInteger(1), new EventPayloadInteger(2), 123L, 987L);
+
+        consumeString.expectedMessageCount(1);
+        consumeString.expectedBodiesReceived("test");
+
+        consumeStringPayload.expectedMessageCount(2);
+        consumeStringPayload.expectedBodiesReceived(new EventPayloadString("foo"), new EventPayloadString("bar"));
+
+        consumeIntegerPayload.expectedMessageCount(2);
+        consumeIntegerPayload.expectedBodiesReceived(new EventPayloadInteger(1), new EventPayloadInteger(2));
+
+        consumeFooQualifier.expectedMessageCount(1);
+        consumeFooQualifier.expectedBodiesReceived(123L);
+
+        consumeBarQualifier.expectedMessageCount(1);
+        consumeBarQualifier.expectedBodiesReceived(987L);
+
+        objectEvent.select(Integer.class).fire(1234);
+        objectEvent.select(EventPayloadString.class).fire(new EventPayloadString("foo"));
+        stringPayloadEvent.select(new BarQualifier.Literal()).fire(new EventPayloadString("bar"));
+        objectEvent.select(String.class).fire("test");
+        integerPayloadEvent.fire(new EventPayloadInteger(1));
+        integerPayloadEvent.fire(new EventPayloadInteger(2));
+        objectEvent.select(Long.class, new FooQualifier.Literal()).fire(123L);
+        objectEvent.select(Long.class, new BarQualifier.Literal()).fire(987L);
+
+        //assertIsSatisfied(2L, TimeUnit.SECONDS, consumeObject, consumeString, consumeStringPayload, consumeIntegerPayload, consumeFooQualifier, consumeBarQualifier);
+        assertIsSatisfied(2L, TimeUnit.SECONDS, consumeObject, consumeString,  consumeFooQualifier, consumeBarQualifier);
+    }
+
+    @Test
+    public void sendMessagesToProducers() {
+        produceObject.sendBody("string");
+        EventPayload foo = new EventPayloadString("foo");
+        produceStringPayload.sendBody(foo);
+        produceObject.sendBody(1234);
+        produceString.sendBody("test");
+        EventPayload<Integer> bar = new EventPayloadInteger(2);
+        produceIntegerPayload.sendBody(bar);
+        EventPayload<Integer> baz = new EventPayloadInteger(12);
+        produceIntegerPayload.sendBody(baz);
+        produceFooQualifier.sendBody(456L);
+        produceBarQualifier.sendBody(495L);
+        produceObject.sendBody(777L);
+
+        assertThat(observer.getObjectEvents(), contains("string", foo, 1234, "test", bar, baz, 456L, 495L, 777L));
+        // assertThat(observer.getStringEvents(), contains("string", "test"));
+        assertThat(observer.getStringPayloadEvents(), contains(foo));
+        assertThat(observer.getIntegerPayloadEvents(), contains(bar, baz));
+        assertThat(observer.getDefaultQualifierEvents(), contains("string", foo, 1234, "test", bar, baz, 777L));
+        assertThat(observer.getFooQualifierEvents(), contains(456L));
+        assertThat(observer.getBarQualifierEvents(), contains(495L));
+    }
+
+    @ApplicationScoped
+    static class EventObserver {
+
+        private final List<Object> objectEvents = new ArrayList<>();
+
+        private final List<Object> defaultQualifierEvents = new ArrayList<>();
+
+        private final List<String> stringEvents = new ArrayList<>();
+
+        private final List<EventPayloadString> stringPayloadEvents = new ArrayList<>();
+
+        private final List<EventPayloadInteger> integerPayloadEvents = new ArrayList<>();
+
+        private final List<Long> fooQualifierEvents = new ArrayList<>();
+
+        private final List<Long> barQualifierEvents = new ArrayList<>();
+
+        void collectObjectEvents(@Observes Object event) {
+            objectEvents.add(event);
+        }
+
+        void collectStringEvents(@Observes String event) {
+            stringEvents.add(event);
+        }
+
+        void collectStringPayloadEvents(@Observes EventPayloadString event) {
+            stringPayloadEvents.add(event);
+        }
+
+        void collectIntegerPayloadEvents(@Observes EventPayloadInteger event) {
+            integerPayloadEvents.add(event);
+        }
+
+        void collectDefaultQualifierEvents(@Observes @Default Object event) {
+            defaultQualifierEvents.add(event);
+        }
+
+        void collectFooQualifierEvents(@Observes @FooQualifier Long event) {
+            fooQualifierEvents.add(event);
+        }
+
+        void collectBarQualifierEvents(@Observes @BarQualifier Long event) {
+            barQualifierEvents.add(event);
+        }
+
+        List<Object> getObjectEvents() {
+            return objectEvents;
+        }
+
+        List<String> getStringEvents() {
+            return stringEvents;
+        }
+
+        List<EventPayloadString> getStringPayloadEvents() {
+            return stringPayloadEvents;
+        }
+
+        List<EventPayloadInteger> getIntegerPayloadEvents() {
+            return integerPayloadEvents;
+        }
+
+        List<Object> getDefaultQualifierEvents() {
+            return defaultQualifierEvents;
+        }
+
+        List<Long> getFooQualifierEvents() {
+            return fooQualifierEvents;
+        }
+
+        List<Long> getBarQualifierEvents() {
+            return barQualifierEvents;
+        }
+
+        void reset() {
+            objectEvents.clear();
+            stringEvents.clear();
+            stringPayloadEvents.clear();
+            integerPayloadEvents.clear();
+            defaultQualifierEvents.clear();
+            fooQualifierEvents.clear();
+            barQualifierEvents.clear();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/camel/blob/0421c24d/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/InjectedEndpointTest.java
----------------------------------------------------------------------
diff --git a/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/InjectedEndpointTest.java b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/InjectedEndpointTest.java
new file mode 100644
index 0000000..45ee927
--- /dev/null
+++ b/components/camel-cdi/src/test/java/org/apache/camel/cdi/test/InjectedEndpointTest.java
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.cdi.test;
+
+import java.util.concurrent.TimeUnit;
+import javax.inject.Inject;
+
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.cdi.CdiCamelExtension;
+import org.apache.camel.cdi.Uri;
+import org.apache.camel.cdi.bean.InjectedEndpointRoute;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.shrinkwrap.api.Archive;
+import org.jboss.shrinkwrap.api.ShrinkWrap;
+import org.jboss.shrinkwrap.api.asset.EmptyAsset;
+import org.jboss.shrinkwrap.api.spec.JavaArchive;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.apache.camel.component.mock.MockEndpoint.assertIsSatisfied;
+
+@RunWith(Arquillian.class)
+public class InjectedEndpointTest {
+
+    @Inject
+    @Uri("direct:inbound")
+    private ProducerTemplate inbound;
+
+    @Inject
+    private MockEndpoint outbound;
+
+    @Deployment
+    public static Archive<?> deployment() {
+        return ShrinkWrap.create(JavaArchive.class)
+            // Camel CDI
+            .addPackage(CdiCamelExtension.class.getPackage())
+            // Test class
+            .addClass(InjectedEndpointRoute.class)
+            // Bean archive deployment descriptor
+            .addAsManifestResource(EmptyAsset.INSTANCE, "beans.xml");
+    }
+
+    @Test
+    public void sendMessageToInbound() throws InterruptedException {
+        outbound.expectedMessageCount(1);
+        outbound.expectedBodiesReceived("test");
+        
+        inbound.sendBody("test");
+
+        assertIsSatisfied(2L, TimeUnit.SECONDS, outbound);
+    }
+}