/* * Copyright 2015-2016 the original author or authors. * * Licensed 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.springframework.amqp.rabbit.core; import static org.hamcrest.Matchers.anyOf; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.UUID; import org.junit.After; import org.junit.ClassRule; import org.junit.Test; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.BindingBuilder; import org.springframework.amqp.core.DirectExchange; import org.springframework.amqp.core.Exchange; import org.springframework.amqp.core.Queue; import org.springframework.amqp.core.QueueBuilder; import org.springframework.amqp.rabbit.connection.CachingConnectionFactory; import org.springframework.amqp.rabbit.junit.BrokerRunning; import com.rabbitmq.client.Channel; import com.rabbitmq.client.DefaultConsumer; import com.rabbitmq.http.client.domain.QueueInfo; /** * @author Gary Russell * @since 1.5 * */ public class RabbitManagementTemplateTests { private final CachingConnectionFactory connectionFactory = new CachingConnectionFactory("localhost"); private final RabbitManagementTemplate template = new RabbitManagementTemplate(); @ClassRule public static BrokerRunning brokerAndManagementRunning = BrokerRunning.isBrokerAndManagementRunning(); @After public void tearDown() { connectionFactory.destroy(); } @Test public void testExchanges() { List<Exchange> list = this.template.getExchanges(); assertTrue(list.size() > 0); } @Test public void testExchangesVhost() { List<Exchange> list = this.template.getExchanges("/"); assertTrue(list.size() > 0); } @Test public void testBindings() { List<Binding> list = this.template.getBindings(); assertTrue(list.size() > 0); } @Test public void testBindingsVhost() { List<Binding> list = this.template.getBindings("/"); assertTrue(list.size() > 0); } @Test public void testQueues() { List<Queue> list = this.template.getQueues(); assertTrue(list.size() > 0); } @Test public void testQueuesVhost() { List<Queue> list = this.template.getQueues("/"); assertTrue(list.size() > 0); } @Test public void testBindingsDetail() { RabbitAdmin admin = new RabbitAdmin(connectionFactory); Map<String, Object> args = Collections.<String, Object>singletonMap("alternate-exchange", ""); Exchange exchange1 = new DirectExchange(UUID.randomUUID().toString(), false, true, args); admin.declareExchange(exchange1); Exchange exchange2 = new DirectExchange(UUID.randomUUID().toString(), false, true, args); admin.declareExchange(exchange2); Queue queue = admin.declareQueue(); Binding binding1 = BindingBuilder .bind(queue) .to(exchange1) .with("foo") .and(args); admin.declareBinding(binding1); Binding binding2 = BindingBuilder .bind(exchange2) .to((DirectExchange) exchange1) .with("bar"); admin.declareBinding(binding2); List<Binding> bindings = this.template.getBindingsForExchange("/", exchange1.getName()); assertEquals(2, bindings.size()); assertEquals(exchange1.getName(), bindings.get(0).getExchange()); assertThat("foo", anyOf(equalTo(bindings.get(0).getRoutingKey()), equalTo(bindings.get(1).getRoutingKey()))); Binding qout = null; Binding eout = null; if (bindings.get(0).getRoutingKey().equals("foo")) { qout = bindings.get(0); eout = bindings.get(1); } else { eout = bindings.get(0); qout = bindings.get(1); } assertEquals(Binding.DestinationType.QUEUE, qout.getDestinationType()); assertEquals(queue.getName(), qout.getDestination()); assertNotNull(qout.getArguments()); assertEquals("", qout.getArguments().get("alternate-exchange")); assertEquals(Binding.DestinationType.EXCHANGE, eout.getDestinationType()); assertEquals(exchange2.getName(), eout.getDestination()); admin.deleteExchange(exchange1.getName()); admin.deleteExchange(exchange2.getName()); } @Test public void testSpecificExchange() { RabbitAdmin admin = new RabbitAdmin(connectionFactory); Map<String, Object> args = Collections.<String, Object>singletonMap("alternate-exchange", ""); Exchange exchange = new DirectExchange(UUID.randomUUID().toString(), true, true, args); admin.declareExchange(exchange); Exchange exchangeOut = this.template.getExchange("/", exchange.getName()); assertTrue(exchangeOut.isDurable()); assertTrue(exchangeOut.isAutoDelete()); assertEquals(exchange.getName(), exchangeOut.getName()); assertEquals(args, exchangeOut.getArguments()); admin.deleteExchange(exchange.getName()); } @Test public void testSpecificQueue() throws Exception { RabbitAdmin admin = new RabbitAdmin(connectionFactory); Map<String, Object> args = Collections.<String, Object>singletonMap("foo", "bar"); Queue queue1 = QueueBuilder.nonDurable(UUID.randomUUID().toString()) .autoDelete() .withArguments(args) .build(); admin.declareQueue(queue1); Queue queue2 = QueueBuilder.durable(UUID.randomUUID().toString()) .withArguments(args) .build(); admin.declareQueue(queue2); Channel channel = this.connectionFactory.createConnection().createChannel(false); String consumer = channel.basicConsume(queue1.getName(), false, "", false, true, null, new DefaultConsumer(channel)); QueueInfo qi = this.template.getClient().getQueue("/", queue1.getName()); int n = 0; while (n++ < 100 && (qi.getExclusiveConsumerTag() == null || qi.getExclusiveConsumerTag().equals(""))) { Thread.sleep(100); qi = this.template.getClient().getQueue("/", queue1.getName()); } Queue queueOut = this.template.getQueue("/", queue1.getName()); assertFalse(queueOut.isDurable()); assertFalse(queueOut.isExclusive()); assertTrue(queueOut.isAutoDelete()); assertEquals(queue1.getName(), queueOut.getName()); assertEquals(args, queueOut.getArguments()); assertEquals(consumer, qi.getExclusiveConsumerTag()); channel.basicCancel(consumer); channel.close(); queueOut = this.template.getQueue("/", queue2.getName()); assertTrue(queueOut.isDurable()); assertFalse(queueOut.isExclusive()); assertFalse(queueOut.isAutoDelete()); assertEquals(queue2.getName(), queueOut.getName()); assertEquals(args, queueOut.getArguments()); admin.deleteQueue(queue1.getName()); admin.deleteQueue(queue2.getName()); } }