/** * 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.component.rabbitmq; import java.io.IOException; import java.util.Calendar; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeoutException; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import org.apache.camel.Endpoint; import org.apache.camel.EndpointInject; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.impl.JndiRegistry; import org.junit.Test; public class RabbitMQConsumerIntTest extends AbstractRabbitMQIntTest { private static final String EXCHANGE = "ex1"; private static final String HEADERS_EXCHANGE = "ex8"; private static final String QUEUE = "q1"; private static final String MSG = "hello world"; @EndpointInject(uri = "rabbitmq:localhost:5672/" + EXCHANGE + "?username=cameltest&password=cameltest") private Endpoint from; @EndpointInject(uri = "mock:result") private MockEndpoint to; @EndpointInject(uri = "rabbitmq:localhost:5672/" + HEADERS_EXCHANGE + "?username=cameltest&password=cameltest&exchangeType=headers&queue=" + QUEUE + "&bindingArgs=#bindArgs") private Endpoint headersExchangeWithQueue; @EndpointInject(uri = "rabbitmq:localhost:5672/" + "ex7" + "?username=cameltest&password=cameltest&exchangeType=headers&autoDelete=false&durable=true&queue=q7&arg.binding.fizz=buzz") private Endpoint headersExchangeWithQueueDefiniedInline; @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from(from).to(to); from(headersExchangeWithQueue).to(to); from(headersExchangeWithQueueDefiniedInline).to(to); } }; } @Override protected JndiRegistry createRegistry() throws Exception { JndiRegistry jndi = super.createRegistry(); Map<String, Object> bindingArgs = new HashMap<>(); jndi.bind("bindArgs", bindingArgs); return jndi; } @Test public void sentMessageIsReceived() throws InterruptedException, IOException, TimeoutException { to.expectedMessageCount(1); to.expectedHeaderReceived(RabbitMQConstants.REPLY_TO, "myReply"); AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder(); properties.replyTo("myReply"); Channel channel = connection().createChannel(); channel.basicPublish(EXCHANGE, "", properties.build(), MSG.getBytes()); to.assertIsSatisfied(); } @Test public void sentMessageWithTimestampIsReceived() throws InterruptedException, IOException, TimeoutException { Date timestamp = currentTimestampWithoutMillis(); to.expectedMessageCount(1); to.expectedHeaderReceived(RabbitMQConstants.TIMESTAMP, timestamp); AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder(); properties.timestamp(timestamp); Channel channel = connection().createChannel(); channel.basicPublish(EXCHANGE, "", properties.build(), MSG.getBytes()); to.assertIsSatisfied(); } /** * Tests the proper rabbit binding arguments are in place when the headersExchangeWithQueue is created. * Should only receive messages with the header [foo=bar] */ @Test public void sentMessageIsReceivedWithHeadersRouting() throws InterruptedException, IOException, TimeoutException { //should only be one message that makes it through because only //one has the correct header set to.expectedMessageCount(1); Channel channel = connection().createChannel(); channel.basicPublish(HEADERS_EXCHANGE, "", propertiesWithHeader("foo", "bar"), MSG.getBytes()); channel.basicPublish(HEADERS_EXCHANGE, "", null, MSG.getBytes()); channel.basicPublish(HEADERS_EXCHANGE, "", propertiesWithHeader("foo", "bra"), MSG.getBytes()); to.assertIsSatisfied(); } @Test public void sentMessageIsReceivedWithHeadersRoutingMultiValueMapBindings() throws Exception { to.expectedMessageCount(3); Channel channel = connection().createChannel(); channel.basicPublish("ex7", "", propertiesWithHeader("fizz", "buzz"), MSG.getBytes()); channel.basicPublish("ex7", "", propertiesWithHeader("fizz", "buzz"), MSG.getBytes()); channel.basicPublish("ex7", "", propertiesWithHeader("fizz", "buzz"), MSG.getBytes()); channel.basicPublish("ex7", "", propertiesWithHeader("fizz", "nope"), MSG.getBytes()); to.assertIsSatisfied(); } private AMQP.BasicProperties propertiesWithHeader(String headerName, String headerValue) { AMQP.BasicProperties.Builder properties = new AMQP.BasicProperties.Builder(); properties.headers(Collections.singletonMap(headerName, headerValue)); return properties.build(); } private Date currentTimestampWithoutMillis() { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.MILLISECOND, 0); return calendar.getTime(); } }