-1

Problem:

The unit test, provided below, fails with message:

java.lang.RuntimeException: Gave up waiting for BlueprintContainer from bundle "RouteXmlTest"

The exception is vague and there is no cogent documentation or examples that illustrate how to unit test this scenario.

Therefore, need help :-)

Below, I've listed the code used in my failed attempt, thus far, i.e., extending test file with "CamelBlueprintTestSupport.java".

Please note that the application (code also supplied, below) runs successfully when deployed to Red Hat Fuse 7.2 container.

Any guidance/solution appreciated.

Thx!

Here is the unit test class...

src/main/test/aaa/bbb.ccc.jar/RouteXmlTest.java

package aaa.bbb.ccc.jar;

import java.io.File;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

import org.apache.camel.Consume;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.blueprint.CamelBlueprintTestSupport;
//import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;

public class RouteXmlTest extends CamelBlueprintTestSupport {  //CamelTestSupport {

    protected Object[] expectedBodies = {}; // empty to start

    @Produce(uri = "file:work/cbr/input")
    protected ProducerTemplate inputEndpoint;

    @Consume(uri = "jms:queue:myFromQueueA")
    protected MockEndpoint myFromQueueA;

    @Consume(uri = "jms:queue:myToQueueB")
    protected MockEndpoint myToQueueB;

    @Consume(uri = "jms:queue:myToQueueC")
    protected MockEndpoint myToQueueC;

    @Consume(uri = "jms:queue:myToQueueD")
    protected MockEndpoint myToQueueD;

    @Override
    protected RouteBuilder createRouteBuilder() throws Exception {
        return new CamelRoute();
    }

    @Override
    public String isMockEndpoints() {
        return "*";
    }

    @Test
    public void testCamelRoute() throws Exception {
        // Define some input data based on the files we have to test against
        String value1 = getFileContents("src/test/resources/data/order1.xml");
        String value2 = getFileContents("src/test/resources/data/order2.xml");
        String value3 = getFileContents("src/test/resources/data/order3.xml");
        String value4 = getFileContents("src/test/resources/data/order4.xml");
        String value5 = getFileContents("src/test/resources/data/order5.xml");

        expectedBodies = new Object[]{value1, value2, value3, value4, value5};

        // Define some expectations
        getMockEndpoint("mock:jms:queue:myToQueueB").expectedMinimumMessageCount(5);
        getMockEndpoint("mock:jms:queue:myToQueueC").expectedMinimumMessageCount(5);
        getMockEndpoint("mock:jms:queue:myToQueueD").expectedMinimumMessageCount(5);

        // Send some messages to input endpoints
        for (Object expectedBody : expectedBodies) {
            inputEndpoint.sendBody(expectedBody);
        }

        // Validate our expectations
        assertMockEndpointsSatisfied();
    }

    @Override
    protected String getBlueprintDescriptor() {
        return "OSGI-INF/blueprint/camel-route.xml";
    }

    private String getFileContents(String path) throws Exception {
        Path filePath = new File(path).toPath();
        return new String(Files.readAllBytes(filePath), StandardCharsets.UTF_8);
    }
}

here is the camel-route.xml...

src/main/resources/OSGI-INF/blueprint/camel-route

<?xml version="1.0" encoding="UTF-8"?>
<blueprint  xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xsi:schemaLocation="http://www.osgi.org/xmlns/blueprint/v1.0.0 
                                https://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd              
                                http://camel.apache.org/schema/blueprint 
                                http://camel.apache.org/schema/blueprint/camel-blueprint.xsd">

    <reference id="transactionManager" interface="org.springframework.transaction.PlatformTransactionManager"/>  

    <bean id="jms" class="org.apache.camel.component.jms.JmsComponent">
        <property name="connectionFactory">
            <reference interface="javax.jms.ConnectionFactory" />
        </property>
        <property name="transactionManager" ref="transactionManager"/>
    </bean>    

    <bean class="aaa.bbb.ccc.jar.CamelRoute" id="myRouteBuilder"/>

    <camelContext id="cbr-example-context" xmlns="http://camel.apache.org/schema/blueprint">
        <routeBuilder ref="myRouteBuilder"/>
    </camelContext>
</blueprint>

Below is the exception received when attempting the unit test...

-
-
-
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running aaa.bbb.ccc.jar.RouteXmlTest
[                          main] CamelBlueprintHelper           INFO  Using Blueprint XML file: /C:/tools/rfhpoc/target/classes/OSGI-INF/blueprint/camel-route.xml
[                      Thread-0] RawBuilder                     INFO  Copy thread finished.
[                      Thread-1] RawBuilder                     INFO  Copy thread finished.
[                          main] Activator                      INFO  Camel activator starting
[                          main] Activator                      INFO  Camel activator started
[         Blueprint Extender: 1] BlueprintContainerImpl         INFO  Bundle RouteXmlTest/1.0.0 is waiting for namespace handlers [http://camel.apache.org/schema/blueprint]
[         Blueprint Extender: 1] BlueprintContainerImpl         INFO  Bundle RouteXmlTest/1.0.0 is waiting for dependencies [(objectClass=javax.jms.ConnectionFactory), (objectClass=org.springframework.transaction.PlatformTransactionManager)]
[                          main] RouteXmlTest                   INFO  ********************************************************************************
[                          main] RouteXmlTest                   INFO  Testing done: testCamelRoute(aaa.bbb.ccc.jar.RouteXmlTest)
[                          main] RouteXmlTest                   INFO  Took: 32.815 seconds (32815 millis)
[                          main] RouteXmlTest                   INFO  ********************************************************************************
[                          main] CamelBlueprintHelper           INFO  Deleting work directory target/bundles/1549574455436
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 33.338 s <<< FAILURE! - in aaa.bbb.ccc.jar.RouteXmlTest
testCamelRoute(aaa.bbb.ccc.jar.RouteXmlTest)  Time elapsed: 32.952 s  <<< ERROR!
java.lang.RuntimeException: Gave up waiting for BlueprintContainer from bundle "RouteXmlTest"


Results:

Errors: 
  RouteXmlTest>CamelBlueprintTestSupport.setUp:241->CamelBlueprintTestSupport.createBundleContext:175 » Runtime

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

------------------------------------------------------------------------
BUILD FAILURE
------------------------------------------------------------------------
Total time: 01:13 min
Finished at: 2019-02-07T16:21:28-05:00
------------------------------------------------------------------------
-
-
-

OTHER RELEVANT FILES BELOW

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <groupId>aaa.bbb.ccc</groupId>
    <artifactId>rfhpoc</artifactId>
    <version>1.0</version>
    <packaging>bundle</packaging>
    <name>rfhpoc</name>
    <description>rfhpoc - show dsl routing from queue to multiple queues ("spray")</description>
    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>http://www.apache.org/licenses/LICENSE-2.0.html</url>
            <distribution>repo</distribution>
        </license>
    </licenses>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.test.skip>false</maven.test.skip>
    </properties>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.redhat-fuse</groupId>
                <artifactId>fuse-karaf-bom</artifactId>
                <version>7.1.0.fuse-710019-redhat-00002</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>artemis-core-client</artifactId>
        </dependency> 
        <dependency>
            <groupId>org.apache.activemq</groupId>
            <artifactId>artemis-jms-client</artifactId>
        </dependency>  
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jms</artifactId>
        </dependency>     
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-blueprint</artifactId>
            <scope>provided</scope> <!--***-->
        </dependency>                    
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12.0.redhat-003</version>
        </dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-test-blueprint</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <defaultGoal>install</defaultGoal>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>3.2.0</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-SymbolicName>rfhpoc</Bundle-SymbolicName>
                        <Bundle-Name>rfhpoc</Bundle-Name>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <configuration>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

src/main/java/aaa.bbb.ccc.jar/CamelRoute.java

package aaa.bbb.ccc.jar;

import org.apache.camel.builder.RouteBuilder;

public class CamelRoute extends RouteBuilder {

    @Override
    public void configure() throws Exception {

        System.getProperties().list(System.out);

        from("file:work/cbr/input")
                .log("from ${file:name}")
                .to("jms:queue:myFromQueueA");

        from("jms:queue:myFromQueueA")
                //.transacted()
                .log("from jms:queue:myFromQueueA")
                .to("jms:queue:myToQueueB")
                .to("jms:queue:myToQueueC")
                .to("jms:queue:myToQueueD");                
    }   
}

environment

red hat fuse 7.2
java 8
active mq 7.2.3
apache maven 3.5.3
sairn
  • 461
  • 3
  • 24
  • 58
  • your container is waiting for OSGi service with `objectClass=javax.jms.ConnectionFactory` - did you deploy a bundle that registers such connection factory? How it is provided in Fuse containers? – Grzegorz Grzybek Feb 08 '19 at 06:04
  • Puzzling to me. Although the RouteBuilder application works fine, when deployed to Fuse, I've been unable to find documentation/guidance to make the unittest work. As you seem to be hinting - I am looking for other jars to use with "test" scope that might alleviate this issue. No luck yet. thx again. – sairn Feb 08 '19 at 15:58
  • In Fuse container, `javax.jms.ConnectionFactory` service is (may be) provided by other blueprint files, by other bundles, by SCR components or even etc/org.ops4j.connectionfactory-xyz.cfg files. In unit test, everything comes from bundles from your Maven classpath - and in this case you're missing _something_ that registers JMS connection factory. – Grzegorz Grzybek Feb 08 '19 at 16:31
  • Thank you for the kind attention, G! Actually, been working on that. -Only, a bit frustrating that unit test examples that include ActiveMQ do not *appear* to be readily available (after much googling). :-) – sairn Feb 08 '19 at 20:14

1 Answers1

0

I'm facing with similar error in my CamelBlueprintTestSupport test. After I add transacted behavior via using code below to my blueprint.xml file error was occure.

<reference id="osgiPlatformTransactionManager" interface="org.springframework.transaction.PlatformTransactionManager" />

<bean id="XA_TX_REQUIRED" class="org.apache.camel.spring.spi.SpringTransactionPolicy">
    <property name="transactionManager" ref="osgiPlatformTransactionManager"/>
</bean>

<route id="transactedRoute">
   <from uri="direct:transactedRoute" />
   ...
   <transacted ref="XA_TX_REQUIRED"/>
   ...
</route>