// 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 com.rabbitmq.client.AMQP; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; import com.rabbitmq.client.test.BrokerTestCase; import com.rabbitmq.tools.Host; import java.io.IOException; import java.util.concurrent.TimeoutException; /** * Base class for tests which would like a second, clustered node. */ public class ClusteredTestBase extends BrokerTestCase { // If these are non-null then the secondary node is up and clustered public Channel clusteredChannel; public Connection clusteredConnection; // These will always be non-null - if there is clustering they will point // to the secondary node, otherwise the primary public Channel alternateChannel; public Connection alternateConnection; @Override public void openChannel() throws IOException { super.openChannel(); if (clusteredConnection != null) { clusteredChannel = clusteredConnection.createChannel(); } alternateChannel = clusteredChannel == null ? channel : clusteredChannel; } private static boolean nonClusteredWarningPrinted; @Override public void openConnection() throws IOException, TimeoutException { super.openConnection(); if (clusteredConnection == null) { try { ConnectionFactory cf2 = connectionFactory.clone(); cf2.setHost("localhost"); cf2.setPort(5673); clusteredConnection = cf2.newConnection(); } catch (IOException e) { // Must be no secondary node } } if (clusteredConnection != null && !clustered(connection, clusteredConnection)) { clusteredConnection.close(); clusteredConnection = null; if (!nonClusteredWarningPrinted) { System.out.println("NOTE: Only one clustered node was detected - certain tests that"); System.out.println("could test clustering will not do so."); nonClusteredWarningPrinted = true; } } alternateConnection = clusteredConnection == null ? connection : clusteredConnection; } private boolean clustered(Connection c1, Connection c2) throws IOException { Channel ch1 = c1.createChannel(); Channel ch2 = c2.createChannel(); // autodelete but not exclusive String q = ch1.queueDeclare("", false, false, true, null).getQueue(); try { ch2.queueDeclarePassive(q); } catch (IOException e) { checkShutdownSignal(AMQP.NOT_FOUND, e); // If we can't see the queue, secondary node must be up but not // clustered, hence not interesting to us return false; } ch1.queueDelete(q); ch1.abort(); ch2.abort(); return true; } @Override public void closeChannel() throws IOException { if (clusteredChannel != null) { clusteredChannel.abort(); clusteredChannel = null; alternateChannel = null; } super.closeChannel(); } @Override public void closeConnection() throws IOException { if (clusteredConnection != null) { clusteredConnection.abort(); clusteredConnection = null; alternateConnection = null; } super.closeConnection(); } protected void stopSecondary() throws IOException { Host.invokeMakeTarget("stop-rabbit-on-node RABBITMQ_NODENAME=\'" + Host.nodenameB() + "\'"); } protected void startSecondary() throws IOException { Host.invokeMakeTarget("start-rabbit-on-node RABBITMQ_NODENAME=\'" + Host.nodenameB() + "\'"); } }