io.vertx.camel.OutboundEndpointTest.java Source code

Java tutorial

Introduction

Here is the source code for io.vertx.camel.OutboundEndpointTest.java

Source

/*
 *  Copyright (c) 2011-2015 The original author or authors
 *  ------------------------------------------------------
 *  All rights reserved. This program and the accompanying materials
 *  are made available under the terms of the Eclipse Public License v1.0
 *  and Apache License v2.0 which accompanies this distribution.
 *
 *       The Eclipse Public License is available at
 *       http://www.eclipse.org/legal/epl-v10.html
 *
 *       The Apache License v2.0 is available at
 *       http://www.opensource.org/licenses/apache2.0.php
 *
 *  You may elect to redistribute this code under either of these licenses.
 */
package io.vertx.camel;

import com.jayway.awaitility.Duration;
import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.eventbus.DeliveryOptions;
import io.vertx.ext.unit.Async;
import io.vertx.ext.unit.TestContext;
import io.vertx.ext.unit.junit.VertxUnitRunner;
import org.apache.camel.Endpoint;
import org.apache.camel.Exchange;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.commons.io.FileUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.File;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;

import static com.jayway.awaitility.Awaitility.await;
import static io.vertx.camel.OutboundMapping.fromVertx;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.data.MapEntry.entry;
import static org.hamcrest.CoreMatchers.is;

/**
 * Tests that event bus messages are propagated to Camel
 *
 * @author <a href="http://escoffier.me">Clement Escoffier</a>
 */
@RunWith(VertxUnitRunner.class)
public class OutboundEndpointTest {

    private static final Duration DEFAULT_TIMEOUT = Duration.TEN_SECONDS;

    private Vertx vertx;
    private DefaultCamelContext camel;
    private CamelBridge bridge;

    @Before
    public void setUp() {
        vertx = Vertx.vertx();
        camel = new DefaultCamelContext();
    }

    @After
    public void tearDown(TestContext context) throws Exception {
        BridgeHelper.stopBlocking(bridge);
        camel.stop();
        vertx.close(context.asyncAssertSuccess());
    }

    @Test
    public void testWithMockWithASingleMessage() throws Exception {
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", "hello");

        await().atMost(DEFAULT_TIMEOUT).until(() -> !endpoint.getExchanges().isEmpty());
        endpoint.expectedBodiesReceived("hello");

        Exchange exchange = endpoint.getExchanges().get(0);
        assertThat(exchange.getIn().getBody()).isEqualTo("hello");
        assertThat(exchange.getIn().getHeaders()).hasSize(0);
    }

    @Test
    public void testWithMockWithASingleMessageUsingByteArray() throws Exception {
        byte[] bytes = getRandomBytes();
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", bytes);

        await().atMost(DEFAULT_TIMEOUT).until(() -> !endpoint.getExchanges().isEmpty());
        Exchange exchange = endpoint.getExchanges().get(0);
        assertThat((byte[]) exchange.getIn().getBody()).isEqualTo(bytes);
    }

    @Test
    public void testWithMockWithASingleMessageUsingBuffer() throws Exception {
        byte[] bytes = getRandomBytes();
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", Buffer.buffer(bytes));

        await().atMost(DEFAULT_TIMEOUT).until(() -> !endpoint.getExchanges().isEmpty());
        Exchange exchange = endpoint.getExchanges().get(0);
        assertThat(exchange.getIn().getBody()).isEqualTo(Buffer.buffer(bytes));
    }

    private byte[] getRandomBytes() {
        Random random = new Random();
        byte[] bytes = new byte[1024];
        random.nextBytes(bytes);
        return bytes;
    }

    @Test
    public void testWithMockWithASingleMessageHeadersNotCopied() throws Exception {
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx, new CamelBridgeOptions(camel)
                .addOutboundMapping(fromVertx("test").toCamel("output").withoutHeadersCopy()));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", "hello", new DeliveryOptions().addHeader("key", "value"));

        await().atMost(DEFAULT_TIMEOUT).until(() -> !endpoint.getExchanges().isEmpty());
        endpoint.expectedBodiesReceived("hello");

        Exchange exchange = endpoint.getExchanges().get(0);
        assertThat(exchange.getIn().getBody()).isEqualTo("hello");
        assertThat(exchange.getIn().getHeaders()).doesNotContainKey("key");
    }

    @Test
    public void testWithMockWithASingleMessageHeadersCopied() throws Exception {
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", "hello", new DeliveryOptions().addHeader("key", "value"));

        await().atMost(DEFAULT_TIMEOUT).until(() -> !endpoint.getExchanges().isEmpty());
        endpoint.expectedBodiesReceived("hello");

        Exchange exchange = endpoint.getExchanges().get(0);
        assertThat(exchange.getIn().getBody()).isEqualTo("hello");
        assertThat(exchange.getIn().getHeaders()).contains(entry("key", "value")).hasSize(1);
    }

    @Test
    public void testWithMockWithMultipleMessages() throws Exception {
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", "hello");
        vertx.eventBus().send("test", "hello2");

        await().atMost(DEFAULT_TIMEOUT).until(() -> endpoint.getExchanges().size() == 2);
        endpoint.expectedBodiesReceived("hello", "hello2");
    }

    @Test
    public void testWithMockUsingOptions() throws Exception {
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo?retainLast=2");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("test", "hello");
        vertx.eventBus().send("test", "hello2");

        await().atMost(DEFAULT_TIMEOUT).until(() -> endpoint.getExchanges().size() == 2);
    }

    @Test
    public void testWithSeveralEndpoints() throws Exception {
        MockEndpoint endpoint = (MockEndpoint) camel.getComponent("mock").createEndpoint("mock:foo");
        MockEndpoint endpoint2 = (MockEndpoint) camel.getEndpoint("mock:foo2");

        camel.addEndpoint("output", endpoint);
        camel.addEndpoint("output2", endpoint2);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output"))
                        .addOutboundMapping(fromVertx("test").setEndpoint(endpoint2)));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().publish("test", "hello");
        vertx.eventBus().publish("test", "hello2");

        await().atMost(DEFAULT_TIMEOUT).until(() -> endpoint.getExchanges().size() == 2);
        await().atMost(DEFAULT_TIMEOUT).until(() -> endpoint2.getExchanges().size() == 2);

        endpoint.expectedBodiesReceived("hello", "hello2");
        endpoint2.expectedBodiesReceived("hello", "hello2");
    }

    @Test
    public void testWithStreams() throws Exception {
        File root = new File("target/junk");
        File file = new File(root, "foo.txt");
        if (file.exists()) {
            file.delete();
        }
        root.mkdirs();

        Endpoint endpoint = camel.getEndpoint("stream:file?fileName=target/junk/foo.txt");
        camel.addEndpoint("output", endpoint);

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("output")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        long date = System.currentTimeMillis();
        vertx.eventBus().send("test", date);

        await().atMost(DEFAULT_TIMEOUT).until(() -> file.isFile() && FileUtils.readFileToString(file).length() > 0);
        String string = FileUtils.readFileToString(file);
        assertThat(string).contains(Long.toString(date));

        long date2 = System.currentTimeMillis();
        vertx.eventBus().send("test", date2);

        await().atMost(DEFAULT_TIMEOUT).until(() -> FileUtils.readFileToString(file).length() > string.length());
        assertThat(FileUtils.readFileToString(file)).containsSequence(Long.toString(date), Long.toString(date2));
    }

    @Test
    public void testReply(TestContext context) throws Exception {
        camel.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:start").transform(constant("OK"));
            }
        });

        bridge = CamelBridge.create(vertx,
                new CamelBridgeOptions(camel).addOutboundMapping(fromVertx("test").toCamel("direct:start")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        Async async = context.async();
        vertx.eventBus().send("test", "hello", reply -> {
            context.assertEquals("OK", reply.result().body());
            async.complete();
        });
    }

    @Test
    public void testWithRoute() throws Exception {
        AtomicBoolean calledSpy = new AtomicBoolean();
        AtomicBoolean startedSpy = new AtomicBoolean();
        vertx.createHttpServer().requestHandler(request -> {
            calledSpy.set(true);
            request.response().end("Alright");
        }).listen(8081, ar -> {
            startedSpy.set(ar.succeeded());
        });

        await().atMost(DEFAULT_TIMEOUT).untilAtomic(startedSpy, is(true));

        camel.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:my-route").to("seda:next").to("http://localhost:8081");
            }
        });

        bridge = CamelBridge.create(vertx, new CamelBridgeOptions(camel)
                .addOutboundMapping(fromVertx("camel-route").toCamel("direct:my-route")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("camel-route", "hello");

        await().atMost(DEFAULT_TIMEOUT).untilAtomic(calledSpy, is(true));
    }

    @Test
    public void testWithRouteWithFailure() throws Exception {
        AtomicReference<String> calledSpy = new AtomicReference<>();

        camel.addRoutes(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("direct:my-route").to("http://localhost:8081");
            }
        });

        bridge = CamelBridge.create(vertx, new CamelBridgeOptions(camel)
                .addOutboundMapping(fromVertx("camel-route").toCamel("direct:my-route")));

        camel.start();
        BridgeHelper.startBlocking(bridge);

        vertx.eventBus().send("camel-route", "hello", reply -> {
            calledSpy.set(reply.cause().getMessage());
        });

        await().atMost(DEFAULT_TIMEOUT).untilAtomic(calledSpy, is("Connection refused"));
    }

}