// Copyright (c) 2007-Present Pivotal Software, Inc. All rights reserved. // // This software, the RabbitMQ Java client library, is triple-licensed under the // Mozilla Public License 1.1 ("MPL"), the GNU General Public License version 2 // ("GPL") and the Apache License version 2 ("ASL"). For the MPL, please see // LICENSE-MPL-RabbitMQ. For the GPL, please see LICENSE-GPL2. For the ASL, // please see LICENSE-APACHE2. // // This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, // either express or implied. See the LICENSE file for specific language governing // rights and limitations of this software. // // If you have any questions regarding licensing, please contact us at // info@rabbitmq.com. package com.rabbitmq.client.test.functional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.fail; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeoutException; import org.junit.Test; import com.rabbitmq.client.AMQP; import com.rabbitmq.client.AMQP.BasicProperties; import com.rabbitmq.client.GetResponse; import com.rabbitmq.client.test.BrokerTestCase; public class CcRoutes extends BrokerTestCase { static private final String[] queues = new String[]{"queue1", "queue2", "queue3"}; protected final String exDirect = "direct_cc_exchange"; protected final String exTopic = "topic_cc_exchange"; protected BasicProperties.Builder propsBuilder; protected Map<String, Object> headers; protected List<String> ccList; protected List<String> bccList; @Override public void setUp() throws IOException, TimeoutException { super.setUp(); propsBuilder = new BasicProperties.Builder(); headers = new HashMap<String, Object>(); ccList = new ArrayList<String>(); bccList = new ArrayList<String>(); } @Override protected void createResources() throws IOException, TimeoutException { super.createResources(); for (String q : queues) { channel.queueDeclare(q, false, true, true, null); } channel.exchangeDeclare(exDirect, "direct", false, true, null); channel.exchangeDeclare(exTopic, "topic", false, true, null); } @Test public void ccList() throws IOException { ccList.add("queue2"); ccList.add("queue3"); headerPublish("", "queue1", ccList, null); expect(new String []{"queue1", "queue2", "queue3"}, true); } @Test public void ccIgnoreEmptyAndInvalidRoutes() throws IOException { bccList.add("frob"); headerPublish("", "queue1", ccList, bccList); expect(new String []{"queue1"}, true); } @Test public void bcc() throws IOException { bccList.add("queue2"); headerPublish("", "queue1", null, bccList); expect(new String []{"queue1", "queue2"}, false); } @Test public void noDuplicates() throws IOException { ccList.add("queue1"); ccList.add("queue1"); bccList.add("queue1"); headerPublish("", "queue1", ccList, bccList); expect(new String[] {"queue1"}, true); } @Test public void directExchangeWithoutBindings() throws IOException { ccList.add("queue1"); headerPublish(exDirect, "queue2", ccList, null); expect(new String[] {}, true); } @Test public void topicExchange() throws IOException { ccList.add("routing_key"); channel.queueBind("queue2", exTopic, "routing_key"); headerPublish(exTopic, "", ccList, null); expect(new String[] {"queue2"}, true); } @Test public void boundExchanges() throws IOException { ccList.add("routing_key1"); bccList.add("routing_key2"); channel.exchangeBind(exTopic, exDirect, "routing_key1"); channel.queueBind("queue2", exTopic, "routing_key2"); headerPublish(exDirect, "", ccList, bccList); expect(new String[] {"queue2"}, true); } @Test public void nonArray() throws IOException { headers.put("CC", 0); propsBuilder.headers(headers); channel.basicPublish("", "queue1", propsBuilder.build(), new byte[0]); try { expect(new String[] {}, false); fail(); } catch (IOException e) { checkShutdownSignal(AMQP.PRECONDITION_FAILED, e); } } private void headerPublish(String ex, String to, List<String> cc, List<String> bcc) throws IOException { if (cc != null) { headers.put("CC", ccList); } if (bcc != null) { headers.put("BCC", bccList); } propsBuilder.headers(headers); channel.basicPublish(ex, to, propsBuilder.build(), new byte[0]); } private void expect(String[] expectedQueues, boolean usedCc) throws IOException { GetResponse getResponse; List<String> expectedList = Arrays.asList(expectedQueues); for (String q : queues) { getResponse = basicGet(q); if (expectedList.contains(q)) { assertNotNull(getResponse); assertEquals(0, getResponse.getMessageCount()); Map<?, ?> headers = getResponse.getProps().getHeaders(); if (headers != null){ assertEquals(usedCc, headers.containsKey("CC")); assertFalse(headers.containsKey("BCC")); } } else { assertNull(getResponse); } } } }