Package org.hornetq.tests.integration.discovery

Source Code of org.hornetq.tests.integration.discovery.DiscoveryTest

/*
* Copyright 2009 Red Hat, Inc.
* Red Hat 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.hornetq.tests.integration.discovery;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import junit.framework.Assert;

import org.hornetq.api.core.Pair;
import org.hornetq.api.core.SimpleString;
import org.hornetq.api.core.TransportConfiguration;
import org.hornetq.api.core.management.NotificationType;
import org.hornetq.core.cluster.DiscoveryEntry;
import org.hornetq.core.cluster.DiscoveryGroup;
import org.hornetq.core.cluster.DiscoveryListener;
import org.hornetq.core.cluster.impl.DiscoveryGroupImpl;
import org.hornetq.core.logging.Logger;
import org.hornetq.core.server.cluster.BroadcastGroup;
import org.hornetq.core.server.cluster.impl.BroadcastGroupImpl;
import org.hornetq.core.server.management.Notification;
import org.hornetq.tests.integration.SimpleNotificationService;
import org.hornetq.tests.util.RandomUtil;
import org.hornetq.tests.util.UnitTestCase;
import org.hornetq.utils.UUIDGenerator;

/**
* A DiscoveryTest
*
* @author <a href="mailto:tim.fox@jboss.com">Tim Fox</a>
*
* Created 8 Dec 2008 12:36:26
*
*
*
*
*/
public class DiscoveryTest extends UnitTestCase
{
   private static final Logger log = Logger.getLogger(DiscoveryTest.class);

   private static final String address1 = "230.1.2.3";

   private static final String address2 = "230.1.2.4";

   private static final String address3 = "230.1.2.5";

   public void testSimpleBroadcast() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      final String nodeID = RandomUtil.randomString();

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    backup1);

      bg.addConnectorPair(connectorPair);

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertTrue(ok);

      Map<String, DiscoveryEntry> entryMap = dg.getDiscoveryEntryMap();

      Assert.assertNotNull(entryMap);

      Assert.assertEquals(1, entryMap.size());

      DiscoveryEntry entry = entryMap.get(nodeID);

      Assert.assertNotNull(entry);

      Assert.assertEquals(connectorPair, entry.getConnectorPair());

      bg.stop();

      dg.stop();

   }
  
   public void testSimpleBroadcastSpecificNIC() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      final String nodeID = RandomUtil.randomString();
     
      //We need to choose a real NIC on the local machine - note this will silently pass if the machine
      //has no usable NIC!
     
      Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
     
      InetAddress localAddress = null;
     
      outer: while (networkInterfaces.hasMoreElements())
      {
         NetworkInterface networkInterface = networkInterfaces.nextElement();
         if (networkInterface.isLoopback() || networkInterface.isVirtual() || !networkInterface.isUp() ||
                  !networkInterface.supportsMulticast())
         {
            continue;
         }
        
         Enumeration<InetAddress> en = networkInterface.getInetAddresses();
        
         while (en.hasMoreElements())
         {
            InetAddress ia = en.nextElement();
           
            if (ia.getAddress().length == 4)
            {
               localAddress = ia;
              
               break outer;
            }
         }
      }
     
      if (localAddress == null)
      {
         log.warn("Can't find address to use");
        
         return;
      }
     
      log.info("Local address is " + localAddress);

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 localAddress,
                                                 6552,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    backup1);

      bg.addConnectorPair(connectorPair);

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 localAddress,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertTrue(ok);

      Map<String, DiscoveryEntry> entryMap = dg.getDiscoveryEntryMap();

      Assert.assertNotNull(entryMap);

      Assert.assertEquals(1, entryMap.size());

      DiscoveryEntry entry = entryMap.get(nodeID);

      Assert.assertNotNull(entry);

      Assert.assertEquals(connectorPair, entry.getConnectorPair());

      bg.stop();

      dg.stop();

   }

   public void testSimpleBroadcastWithStopStartDiscoveryGroup() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      final String nodeID = RandomUtil.randomString();

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    backup1);

      bg.addConnectorPair(connectorPair);

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertTrue(ok);

      Map<String, DiscoveryEntry> entryMap = dg.getDiscoveryEntryMap();

      Assert.assertNotNull(entryMap);

      Assert.assertEquals(1, entryMap.size());

      DiscoveryEntry entry = entryMap.get(nodeID);

      Assert.assertNotNull(entry);

      Assert.assertEquals(connectorPair, entry.getConnectorPair());

      bg.stop();

      dg.stop();

      dg.start();

      bg.start();

      bg.broadcastConnectors();

      ok = dg.waitForBroadcast(1000);

      Assert.assertTrue(ok);

      entryMap = dg.getDiscoveryEntryMap();

      Assert.assertNotNull(entryMap);

      Assert.assertEquals(1, entryMap.size());

      entry = entryMap.get(nodeID);

      Assert.assertNotNull(entry);

      Assert.assertEquals(connectorPair, entry.getConnectorPair());

   }

   public void testIgnoreTrafficFromOwnNode() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      String nodeID = RandomUtil.randomString();

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    backup1);

      bg.addConnectorPair(connectorPair);

      DiscoveryGroup dg = new DiscoveryGroupImpl(nodeID, RandomUtil.randomString(), null, groupAddress, groupPort, timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertFalse(ok);

      Map<String, DiscoveryEntry> entryMap = dg.getDiscoveryEntryMap();

      Assert.assertNotNull(entryMap);

      Assert.assertEquals(0, entryMap.size());

      bg.stop();

      dg.stop();

   }

   // There is a bug in some OSes where different addresses but *Same port* will receive the traffic - hence this test
   // won't pass
   // See http://www.jboss.org/community/docs/DOC-11710 (jboss wiki promiscuous traffic)

   // public void testSimpleBroadcastDifferentAddress() throws Exception
   // {
   // final InetAddress groupAddress = InetAddress.getByName(address1);
   // final int groupPort = 6745;
   // final int timeout = 500;
   //
   // BroadcastGroup bg = new BroadcastGroupImpl(randomString(), randomString(), null, -1, groupAddress, groupPort);
   //
   // bg.start();
   //
   // TransportConfiguration live1 = generateTC();
   //
   // TransportConfiguration backup1 = generateTC();
   //
   // Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration,
   // TransportConfiguration>(live1,
   // backup1);
   //
   // bg.addConnectorPair(connectorPair);
   //
   // final InetAddress groupAddress2 = InetAddress.getByName(address2);
   //
   // DiscoveryGroup dg = new DiscoveryGroupImpl(randomString(), randomString(), groupAddress2, groupPort, timeout);
   //
   // dg.start();
   //
   // bg.broadcastConnectors();
   //
   // boolean ok = dg.waitForBroadcast(1000);
   //
   // assertFalse(ok);
   //
   // bg.stop();
   //
   // dg.stop();
   //
   // }

   public void testSimpleBroadcastDifferentPort() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName("230.1.2.3");
      final int groupPort = 6745;
      final int timeout = 500;

      BroadcastGroup bg = new BroadcastGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    backup1);

      bg.addConnectorPair(connectorPair);

      final int port2 = 6746;

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 port2,
                                                 timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertFalse(ok);

      bg.stop();

      dg.stop();
   }

   public void testSimpleBroadcastDifferentAddressAndPort() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      BroadcastGroup bg = new BroadcastGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    backup1);

      bg.addConnectorPair(connectorPair);

      final InetAddress groupAddress2 = InetAddress.getByName(DiscoveryTest.address2);
      final int port2 = 6746;

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress2,
                                                 port2,
                                                 timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertFalse(ok);

      bg.stop();

      dg.stop();
   }

   public void testMultipleGroups() throws Exception
   {
      final InetAddress groupAddress1 = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort1 = 6745;

      final InetAddress groupAddress2 = InetAddress.getByName(DiscoveryTest.address2);
      final int groupPort2 = 6746;

      final InetAddress groupAddress3 = InetAddress.getByName(DiscoveryTest.address3);
      final int groupPort3 = 6747;

      final int timeout = 500;

      String node1 = RandomUtil.randomString();

      String node2 = RandomUtil.randomString();

      String node3 = RandomUtil.randomString();

      BroadcastGroup bg1 = new BroadcastGroupImpl(node1,
                                                  RandomUtil.randomString(),
                                                  null,
                                                  -1,
                                                  groupAddress1,
                                                  groupPort1,
                                                  true);
      bg1.start();

      BroadcastGroup bg2 = new BroadcastGroupImpl(node2,
                                                  RandomUtil.randomString(),
                                                  null,
                                                  -1,
                                                  groupAddress2,
                                                  groupPort2,
                                                  true);
      bg2.start();

      BroadcastGroup bg3 = new BroadcastGroupImpl(node3,
                                                  RandomUtil.randomString(),
                                                  null,
                                                  -1,
                                                  groupAddress3,
                                                  groupPort3,
                                                  true);
      bg3.start();

      TransportConfiguration live1 = generateTC();
      TransportConfiguration backup1 = generateTC();

      TransportConfiguration live2 = generateTC();
      TransportConfiguration backup2 = generateTC();

      TransportConfiguration live3 = generateTC();
      TransportConfiguration backup3 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair1 = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                     backup1);

      Pair<TransportConfiguration, TransportConfiguration> connectorPair2 = new Pair<TransportConfiguration, TransportConfiguration>(live2,
                                                                                                                                     backup2);

      Pair<TransportConfiguration, TransportConfiguration> connectorPair3 = new Pair<TransportConfiguration, TransportConfiguration>(live3,
                                                                                                                                     backup3);

      bg1.addConnectorPair(connectorPair1);
      bg2.addConnectorPair(connectorPair2);
      bg3.addConnectorPair(connectorPair3);

      DiscoveryGroup dg1 = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                  RandomUtil.randomString(),
                                                  null,
                                                  groupAddress1,
                                                  groupPort1,
                                                  timeout);
      dg1.start();

      DiscoveryGroup dg2 = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                  RandomUtil.randomString(),
                                                  null,
                                                  groupAddress2,
                                                  groupPort2,
                                                  timeout);
      dg2.start();

      DiscoveryGroup dg3 = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                  RandomUtil.randomString(),
                                                  null,
                                                  groupAddress3,
                                                  groupPort3,
                                                  timeout);
      dg3.start();

      bg1.broadcastConnectors();

      bg2.broadcastConnectors();

      bg3.broadcastConnectors();

      boolean ok = dg1.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      Map<String, DiscoveryEntry> entryMap = dg1.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      DiscoveryEntry entry = entryMap.get(node1);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair1, entry.getConnectorPair());

      ok = dg2.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg2.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      entry = entryMap.get(node2);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair2, entry.getConnectorPair());

      ok = dg3.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg3.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      entry = entryMap.get(node3);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair3, entry.getConnectorPair());

      bg1.stop();
      bg2.stop();
      bg3.stop();

      dg1.stop();
      dg2.stop();
      dg3.stop();
   }

   public void testBroadcastNullBackup() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      String nodeID = RandomUtil.randomString();

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    null);

      bg.addConnectorPair(connectorPair);

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);

      dg.start();

      bg.broadcastConnectors();

      boolean ok = dg.waitForBroadcast(1000);

      Assert.assertTrue(ok);

      Map<String, DiscoveryEntry> entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      DiscoveryEntry entry = entryMap.get(nodeID);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair, entry.getConnectorPair());

      bg.stop();

      dg.stop();

   }

   public void testDiscoveryListenersCalled() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      String nodeID = RandomUtil.randomString();

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                    null);

      bg.addConnectorPair(connectorPair);

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);

      MyListener listener1 = new MyListener();
      MyListener listener2 = new MyListener();
      MyListener listener3 = new MyListener();

      dg.registerListener(listener1);
      dg.registerListener(listener2);
      dg.registerListener(listener3);

      dg.start();

      bg.broadcastConnectors();
      boolean ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);

      Assert.assertTrue(listener1.called);
      Assert.assertTrue(listener2.called);
      Assert.assertTrue(listener3.called);

      listener1.called = false;
      listener2.called = false;
      listener3.called = false;

      bg.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);

      // Won't be called since connectors haven't changed
      Assert.assertFalse(listener1.called);
      Assert.assertFalse(listener2.called);
      Assert.assertFalse(listener3.called);

      bg.stop();

      dg.stop();
   }

   public void testConnectorsUpdatedMultipleBroadcasters() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      String node1 = RandomUtil.randomString();
      String node2 = RandomUtil.randomString();
      String node3 = RandomUtil.randomString();

      BroadcastGroup bg1 = new BroadcastGroupImpl(node1,
                                                  RandomUtil.randomString(),
                                                  null,
                                                  -1,
                                                  groupAddress,
                                                  groupPort,
                                                  true);
      bg1.start();

      BroadcastGroup bg2 = new BroadcastGroupImpl(node2,
                                                  RandomUtil.randomString(),
                                                  null,
                                                  -1,
                                                  groupAddress,
                                                  groupPort,
                                                  true);
      bg2.start();

      BroadcastGroup bg3 = new BroadcastGroupImpl(node3,
                                                  RandomUtil.randomString(),
                                                  null,
                                                  -1,
                                                  groupAddress,
                                                  groupPort,
                                                  true);
      bg3.start();

      TransportConfiguration live1 = generateTC();
      TransportConfiguration backup1 = generateTC();
      Pair<TransportConfiguration, TransportConfiguration> connectorPair1 = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                     backup1);
      bg1.addConnectorPair(connectorPair1);

      TransportConfiguration live2 = generateTC();
      TransportConfiguration backup2 = generateTC();
      Pair<TransportConfiguration, TransportConfiguration> connectorPair2 = new Pair<TransportConfiguration, TransportConfiguration>(live2,
                                                                                                                                     backup2);
      bg2.addConnectorPair(connectorPair2);

      TransportConfiguration live3 = generateTC();
      TransportConfiguration backup3 = generateTC();
      Pair<TransportConfiguration, TransportConfiguration> connectorPair3 = new Pair<TransportConfiguration, TransportConfiguration>(live3,
                                                                                                                                     backup3);
      bg3.addConnectorPair(connectorPair3);

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);

      MyListener listener1 = new MyListener();
      dg.registerListener(listener1);
      MyListener listener2 = new MyListener();
      dg.registerListener(listener2);

      dg.start();

      bg1.broadcastConnectors();
      boolean ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      Map<String, DiscoveryEntry> entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      DiscoveryEntry entry = entryMap.get(node1);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair1, entry.getConnectorPair());
      Assert.assertTrue(listener1.called);
      Assert.assertTrue(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg2.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(2, entryMap.size());
      DiscoveryEntry entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      DiscoveryEntry entry2 = entryMap.get(node2);
      Assert.assertNotNull(entry2);
      Assert.assertEquals(connectorPair2, entry2.getConnectorPair());
      Assert.assertTrue(listener1.called);
      Assert.assertTrue(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg3.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(3, entryMap.size());
      entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      entry2 = entryMap.get(node2);
      Assert.assertNotNull(entry2);
      Assert.assertEquals(connectorPair2, entry2.getConnectorPair());
      DiscoveryEntry entry3 = entryMap.get(node3);
      Assert.assertNotNull(entry3);
      Assert.assertEquals(connectorPair3, entry3.getConnectorPair());
      Assert.assertTrue(listener1.called);
      Assert.assertTrue(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg1.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(3, entryMap.size());
      entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      entry2 = entryMap.get(node2);
      Assert.assertNotNull(entry2);
      Assert.assertEquals(connectorPair2, entry2.getConnectorPair());
      entry3 = entryMap.get(node3);
      Assert.assertNotNull(entry3);
      Assert.assertEquals(connectorPair3, entry3.getConnectorPair());
      Assert.assertFalse(listener1.called);
      Assert.assertFalse(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg2.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(3, entryMap.size());
      entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      entry2 = entryMap.get(node2);
      Assert.assertNotNull(entry2);
      Assert.assertEquals(connectorPair2, entry2.getConnectorPair());
      entry3 = entryMap.get(node3);
      Assert.assertNotNull(entry3);
      Assert.assertEquals(connectorPair3, entry3.getConnectorPair());
      Assert.assertFalse(listener1.called);
      Assert.assertFalse(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg3.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(3, entryMap.size());
      entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      entry2 = entryMap.get(node2);
      Assert.assertNotNull(entry2);
      Assert.assertEquals(connectorPair2, entry2.getConnectorPair());
      entry3 = entryMap.get(node3);
      Assert.assertNotNull(entry3);
      Assert.assertEquals(connectorPair3, entry3.getConnectorPair());
      Assert.assertFalse(listener1.called);
      Assert.assertFalse(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg2.removeConnectorPair(connectorPair2);
      bg2.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      Assert.assertTrue(ok);

      // Connector2 should still be there since not timed out yet

      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(3, entryMap.size());
      entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      entry2 = entryMap.get(node2);
      Assert.assertNotNull(entry2);
      Assert.assertEquals(connectorPair2, entry2.getConnectorPair());
      entry3 = entryMap.get(node3);
      Assert.assertNotNull(entry3);
      Assert.assertEquals(connectorPair3, entry3.getConnectorPair());

      Assert.assertFalse(listener1.called);
      Assert.assertFalse(listener2.called);
      listener1.called = false;
      listener2.called = false;

      Thread.sleep(timeout);

      bg1.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      bg2.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      bg3.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);

      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(2, entryMap.size());
      entry1 = entryMap.get(node1);
      Assert.assertNotNull(entry1);
      Assert.assertEquals(connectorPair1, entry1.getConnectorPair());
      entry3 = entryMap.get(node3);
      Assert.assertNotNull(entry3);
      Assert.assertEquals(connectorPair3, entry3.getConnectorPair());

      Assert.assertTrue(listener1.called);
      Assert.assertTrue(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg1.removeConnectorPair(connectorPair1);
      bg3.removeConnectorPair(connectorPair3);

      Thread.sleep(timeout);

      bg1.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      bg2.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      bg3.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);

      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(0, entryMap.size());
      Assert.assertTrue(listener1.called);
      Assert.assertTrue(listener2.called);
      listener1.called = false;
      listener2.called = false;

      bg1.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      bg2.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);
      bg3.broadcastConnectors();
      ok = dg.waitForBroadcast(1000);

      entryMap = dg.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(0, entryMap.size());
      Assert.assertFalse(listener1.called);
      Assert.assertFalse(listener2.called);

      bg1.stop();
      bg2.stop();
      bg3.stop();

      dg.stop();
   }

   public void testMultipleDiscoveryGroups() throws Exception
   {
      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      String nodeID = RandomUtil.randomString();

      BroadcastGroup bg = new BroadcastGroupImpl(nodeID,
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);

      bg.start();

      TransportConfiguration live1 = generateTC();
      TransportConfiguration backup1 = generateTC();

      Pair<TransportConfiguration, TransportConfiguration> connectorPair1 = new Pair<TransportConfiguration, TransportConfiguration>(live1,
                                                                                                                                     backup1);

      bg.addConnectorPair(connectorPair1);

      DiscoveryGroup dg1 = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                  RandomUtil.randomString(),
                                                  null,
                                                  groupAddress,
                                                  groupPort,
                                                  timeout);

      DiscoveryGroup dg2 = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                  RandomUtil.randomString(),
                                                  null,
                                                  groupAddress,
                                                  groupPort,
                                                  timeout);

      DiscoveryGroup dg3 = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                  RandomUtil.randomString(),
                                                  null,
                                                  groupAddress,
                                                  groupPort,
                                                  timeout);

      dg1.start();
      dg2.start();
      dg3.start();

      bg.broadcastConnectors();

      boolean ok = dg1.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      Map<String, DiscoveryEntry> entryMap = dg1.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      DiscoveryEntry entry = entryMap.get(nodeID);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair1, entry.getConnectorPair());

      ok = dg2.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg2.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      entry = entryMap.get(nodeID);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair1, entry.getConnectorPair());

      ok = dg3.waitForBroadcast(1000);
      Assert.assertTrue(ok);
      entryMap = dg3.getDiscoveryEntryMap();
      Assert.assertNotNull(entryMap);
      Assert.assertEquals(1, entryMap.size());
      entry = entryMap.get(nodeID);
      Assert.assertNotNull(entry);
      Assert.assertEquals(connectorPair1, entry.getConnectorPair());

      bg.stop();

      dg1.stop();
      dg2.stop();
      dg3.stop();
   }

   public void testDiscoveryGroupNotifications() throws Exception
   {
      SimpleNotificationService notifService = new SimpleNotificationService();
      SimpleNotificationService.Listener notifListener = new SimpleNotificationService.Listener();
      notifService.addNotificationListener(notifListener);

      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;
      final int timeout = 500;

      DiscoveryGroup dg = new DiscoveryGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 groupAddress,
                                                 groupPort,
                                                 timeout);
      dg.setNotificationService(notifService);

      Assert.assertEquals(0, notifListener.getNotifications().size());

      dg.start();

      Assert.assertEquals(1, notifListener.getNotifications().size());
      Notification notif = notifListener.getNotifications().get(0);
      Assert.assertEquals(NotificationType.DISCOVERY_GROUP_STARTED, notif.getType());
      Assert.assertEquals(dg.getName(), notif.getProperties()
                                             .getSimpleStringProperty(new SimpleString("name"))
                                             .toString());

      dg.stop();

      Assert.assertEquals(2, notifListener.getNotifications().size());
      notif = notifListener.getNotifications().get(1);
      Assert.assertEquals(NotificationType.DISCOVERY_GROUP_STOPPED, notif.getType());
      Assert.assertEquals(dg.getName(), notif.getProperties()
                                             .getSimpleStringProperty(new SimpleString("name"))
                                             .toString());
   }

   public void testBroadcastGroupNotifications() throws Exception
   {
      SimpleNotificationService notifService = new SimpleNotificationService();
      SimpleNotificationService.Listener notifListener = new SimpleNotificationService.Listener();
      notifService.addNotificationListener(notifListener);

      final InetAddress groupAddress = InetAddress.getByName(DiscoveryTest.address1);
      final int groupPort = 6745;

      BroadcastGroup bg = new BroadcastGroupImpl(RandomUtil.randomString(),
                                                 RandomUtil.randomString(),
                                                 null,
                                                 -1,
                                                 groupAddress,
                                                 groupPort,
                                                 true);
      bg.setNotificationService(notifService);

      Assert.assertEquals(0, notifListener.getNotifications().size());

      bg.start();

      Assert.assertEquals(1, notifListener.getNotifications().size());
      Notification notif = notifListener.getNotifications().get(0);
      Assert.assertEquals(NotificationType.BROADCAST_GROUP_STARTED, notif.getType());
      Assert.assertEquals(bg.getName(), notif.getProperties()
                                             .getSimpleStringProperty(new SimpleString("name"))
                                             .toString());

      bg.stop();

      Assert.assertEquals(2, notifListener.getNotifications().size());
      notif = notifListener.getNotifications().get(1);
      Assert.assertEquals(NotificationType.BROADCAST_GROUP_STOPPED, notif.getType());
      Assert.assertEquals(bg.getName(), notif.getProperties()
                                             .getSimpleStringProperty(new SimpleString("name"))
                                             .toString());
   }

   private TransportConfiguration generateTC()
   {
      String className = "org.foo.bar." + UUIDGenerator.getInstance().generateStringUUID();
      String name = UUIDGenerator.getInstance().generateStringUUID();
      Map<String, Object> params = new HashMap<String, Object>();
      params.put(UUIDGenerator.getInstance().generateStringUUID(), 123);
      params.put(UUIDGenerator.getInstance().generateStringUUID(), UUIDGenerator.getInstance().generateStringUUID());
      params.put(UUIDGenerator.getInstance().generateStringUUID(), true);
      TransportConfiguration tc = new TransportConfiguration(className, params, name);
      return tc;
   }

   private static class MyListener implements DiscoveryListener
   {
      volatile boolean called;

      public void connectorsChanged()
      {
         called = true;
      }
   }

}
TOP

Related Classes of org.hornetq.tests.integration.discovery.DiscoveryTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.