/*
* 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.activemq.artemis.tests.integration.discovery;
import java.io.File;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.api.core.BroadcastEndpoint;
import org.apache.activemq.artemis.api.core.BroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.JGroupsFileBroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.UDPBroadcastEndpointFactory;
import org.apache.activemq.artemis.api.core.jgroups.JChannelManager;
import org.apache.activemq.artemis.api.core.management.CoreNotificationType;
import org.apache.activemq.artemis.core.cluster.DiscoveryEntry;
import org.apache.activemq.artemis.core.cluster.DiscoveryGroup;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
import org.apache.activemq.artemis.core.server.cluster.impl.BroadcastGroupImpl;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.tests.integration.SimpleNotificationService;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.apache.activemq.artemis.utils.UUIDGenerator;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
/**
* This will test Discovery test on JGroups and UDP.
* <br>
* In some configurations IPV6 may be a challenge. To make sure this test works, you may add this
* property to your JVM settings: {@literal -Djgroups.bind_addr=::1}
* <br>
* Or ultimately you may also turn off IPV6: {@literal -Djava.net.preferIPv4Stack=true}
* <br>
* Note when you are not sure about your IP settings of your test machine, you should make sure
* that the jgroups.bind_addr and java.net.preferXXStack by defining them explicitly, for example
* if you would like to use IPV6, set BOTH properties to your JVM like the following:
* -Djgroups.bind_addr=::1 -Djava.net.preferIPv6Addresses=true
* <br>
* or if you prefer IPV4:
* -Djgroups.bind_addr=localhost -Djava.net.preferIPv4Stack=true
* <br>
* Also: Make sure you add integration-tests/src/tests/resources to your project path on the
* tests/integration-tests
*/
public class DiscoveryTest extends DiscoveryBaseTest {
private static final String TEST_JGROUPS_CONF_FILE = "test-jgroups-file_ping.xml";
BroadcastGroup bg = null, bg1 = null, bg2 = null, bg3 = null;
DiscoveryGroup dg = null, dg1 = null, dg2 = null, dg3 = null;
@Before
public void prepareLoopback() {
JChannelManager.getInstance().setLoopbackMessages(true);
}
@Override
@After
public void tearDown() throws Exception {
JChannelManager.getInstance().clear().setLoopbackMessages(false);
/** This file path is defined at {@link #TEST_JGROUPS_CONF_FILE} */
deleteDirectory(new File("./target/tmp/amqtest.ping.dir"));
for (ActiveMQComponent component : new ActiveMQComponent[]{bg, bg1, bg2, bg3, dg, dg1, dg2, dg3}) {
stopComponent(component);
}
super.tearDown();
}
@Test
public void testSimpleBroadcast() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
final String nodeID = RandomUtil.randomString();
bg = new BroadcastGroupImpl(new FakeNodeManager(nodeID), RandomUtil.randomString(), 0, null, new UDPBroadcastEndpointFactory().setGroupAddress(address1).setGroupPort(groupPort));
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
dg.start();
verifyBroadcast(bg, dg);
List<DiscoveryEntry> entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
}
@Test
public void testSimpleBroadcastJGropus() throws Exception {
final String nodeID = RandomUtil.randomString();
bg = new BroadcastGroupImpl(new FakeNodeManager(nodeID), "broadcast", 100, null, new JGroupsFileBroadcastEndpointFactory().setChannelName("tst").setFile(TEST_JGROUPS_CONF_FILE));
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg = new DiscoveryGroup(nodeID + "1", "broadcast", 5000L, new JGroupsFileBroadcastEndpointFactory().setChannelName("tst").setFile(TEST_JGROUPS_CONF_FILE), null);
dg.start();
verifyBroadcast(bg, dg);
List<DiscoveryEntry> entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
}
/**
* Create one broadcaster and 100 receivers. Make sure broadcasting works.
* Then stop 99 of the receivers, the last one could still be working.
*
* @throws Exception
*/
@Test
public void testJGropusChannelReferenceCounting() throws Exception {
BroadcastEndpointFactory factory = new JGroupsFileBroadcastEndpointFactory().setChannelName("tst").setFile(TEST_JGROUPS_CONF_FILE);
BroadcastEndpoint broadcaster = factory.createBroadcastEndpoint();
broadcaster.openBroadcaster();
try {
int num = 100;
BroadcastEndpoint[] receivers = new BroadcastEndpoint[num];
for (int i = 0; i < num; i++) {
receivers[i] = factory.createBroadcastEndpoint();
receivers[i].openClient();
}
final byte[] data = new byte[]{1, 2, 3, 4, 5};
broadcaster.broadcast(data);
for (int i = 0; i < num; i++) {
byte[] received = receivers[i].receiveBroadcast(5000, TimeUnit.MILLISECONDS);
assertNotNull(received);
assertEquals(5, received.length);
assertEquals(1, received[0]);
assertEquals(2, received[1]);
assertEquals(3, received[2]);
assertEquals(4, received[3]);
assertEquals(5, received[4]);
}
for (int i = 0; i < num - 1; i++) {
receivers[i].close(false);
}
byte[] data1 = receivers[num - 1].receiveBroadcast(5, TimeUnit.SECONDS);
assertNull(data1);
broadcaster.broadcast(data);
data1 = receivers[num - 1].receiveBroadcast(5, TimeUnit.SECONDS);
assertNotNull(data1);
assertEquals(5, data1.length);
assertEquals(1, data1[0]);
assertEquals(2, data1[1]);
assertEquals(3, data1[2]);
assertEquals(4, data1[3]);
assertEquals(5, data1[4]);
receivers[num - 1].close(false);
} finally {
broadcaster.close(true);
}
}
/**
* Create one broadcaster and 50 receivers. Make sure broadcasting works.
* Then stop all of the receivers, and create 50 new ones. Make sure the
* 50 new ones are receiving data from the broadcasting.
*
* @throws Exception
*/
@Test
public void testJGropusChannelReferenceCounting1() throws Exception {
BroadcastEndpointFactory factory = new JGroupsFileBroadcastEndpointFactory().setChannelName("tst").setFile(TEST_JGROUPS_CONF_FILE);
BroadcastEndpoint broadcaster = factory.createBroadcastEndpoint();
broadcaster.openBroadcaster();
int num = 50;
BroadcastEndpoint[] receivers = new BroadcastEndpoint[num];
for (int i = 0; i < num; i++) {
receivers[i] = factory.createBroadcastEndpoint();
receivers[i].openClient();
}
try {
final byte[] data = new byte[]{1, 2, 3, 4, 5};
broadcaster.broadcast(data);
for (int i = 0; i < num; i++) {
byte[] received = receivers[i].receiveBroadcast(5000, TimeUnit.MILLISECONDS);
assertNotNull(received);
assertEquals(5, received.length);
assertEquals(1, received[0]);
assertEquals(2, received[1]);
assertEquals(3, received[2]);
assertEquals(4, received[3]);
assertEquals(5, received[4]);
}
for (int i = 0; i < num; i++) {
receivers[i].close(false);
}
//new ones
for (int i = 0; i < num; i++) {
receivers[i] = factory.createBroadcastEndpoint();
receivers[i].openClient();
}
broadcaster.broadcast(data);
for (int i = 0; i < num; i++) {
byte[] received = receivers[i].receiveBroadcast(5000, TimeUnit.MILLISECONDS);
assertNotNull(received);
assertEquals(5, received.length);
assertEquals(1, received[0]);
assertEquals(2, received[1]);
assertEquals(3, received[2]);
assertEquals(4, received[3]);
assertEquals(5, received[4]);
}
} finally {
for (int i = 0; i < num; i++) {
receivers[i].close(false);
}
broadcaster.close(true);
}
}
/**
* Create one broadcaster and 50 receivers. Then stop half of the receivers.
* Then add the half back, plus some more. Make sure all receivers receive data.
*
* @throws Exception
*/
@Test
public void testJGropusChannelReferenceCounting2() throws Exception {
BroadcastEndpointFactory factory = new JGroupsFileBroadcastEndpointFactory().setChannelName("tst").setFile(TEST_JGROUPS_CONF_FILE);
BroadcastEndpoint broadcaster = factory.createBroadcastEndpoint();
broadcaster.openBroadcaster();
int num = 50;
BroadcastEndpoint[] receivers = new BroadcastEndpoint[num];
for (int i = 0; i < num; i++) {
receivers[i] = factory.createBroadcastEndpoint();
receivers[i].openClient();
}
for (int i = 0; i < num / 2; i++) {
receivers[i].close(false);
}
for (int i = 0; i < num / 2; i++) {
receivers[i] = factory.createBroadcastEndpoint();
receivers[i].openClient();
}
int num2 = 10;
BroadcastEndpoint[] moreReceivers = new BroadcastEndpoint[num2];
for (int i = 0; i < num2; i++) {
moreReceivers[i] = factory.createBroadcastEndpoint();
moreReceivers[i].openClient();
}
final byte[] data = new byte[]{1, 2, 3, 4, 5};
broadcaster.broadcast(data);
for (int i = 0; i < num; i++) {
byte[] received = receivers[i].receiveBroadcast(5000, TimeUnit.MILLISECONDS);
assertNotNull(received);
assertEquals(5, received.length);
assertEquals(1, received[0]);
assertEquals(2, received[1]);
assertEquals(3, received[2]);
assertEquals(4, received[3]);
assertEquals(5, received[4]);
}
for (int i = 0; i < num2; i++) {
byte[] received = moreReceivers[i].receiveBroadcast(5000, TimeUnit.MILLISECONDS);
assertNotNull(received);
assertEquals(5, received.length);
assertEquals(1, received[0]);
assertEquals(2, received[1]);
assertEquals(3, received[2]);
assertEquals(4, received[3]);
assertEquals(5, received[4]);
}
for (int i = 0; i < num; i++) {
receivers[i].close(false);
}
for (int i = 0; i < num2; i++) {
moreReceivers[i].close(false);
}
broadcaster.close(true);
}
@Test
public void testStraightSendReceiveJGroups() throws Exception {
BroadcastEndpoint broadcaster = null;
BroadcastEndpoint client = null;
try {
JGroupsFileBroadcastEndpointFactory endpointFactory = new JGroupsFileBroadcastEndpointFactory().setChannelName("tst").setFile(TEST_JGROUPS_CONF_FILE);
broadcaster = endpointFactory.createBroadcastEndpoint();
broadcaster.openBroadcaster();
client = endpointFactory.createBroadcastEndpoint();
client.openClient();
Thread.sleep(1000);
byte[] randomBytes = "PQP".getBytes();
broadcaster.broadcast(randomBytes);
byte[] btreceived = client.receiveBroadcast(5, TimeUnit.SECONDS);
System.out.println("BTReceived = " + Arrays.toString(btreceived));
assertNotNull(btreceived);
assertEquals(randomBytes.length, btreceived.length);
for (int i = 0; i < randomBytes.length; i++) {
assertEquals(randomBytes[i], btreceived[i]);
}
} finally {
try {
if (broadcaster != null)
broadcaster.close(true);
if (client != null)
client.close(false);
} catch (Exception ignored) {
ignored.printStackTrace();
}
}
}
@Test
public void testSimpleBroadcastSpecificNIC() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
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 = InetAddress.getLoopbackAddress();
log.info("Local address is " + localAddress);
bg = newBroadcast(nodeID, RandomUtil.randomString(), localAddress, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), localAddress, groupAddress, groupPort, timeout);
dg.start();
verifyBroadcast(bg, dg);
List<DiscoveryEntry> entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
}
@Test
public void testSimpleBroadcastWithStopStartDiscoveryGroup() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
final String nodeID = RandomUtil.randomString();
bg = newBroadcast(nodeID, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
dg.start();
verifyBroadcast(bg, dg);
List<DiscoveryEntry> entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
bg.stop();
dg.stop();
dg.start();
bg.start();
verifyBroadcast(bg, dg);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
}
@Test
public void testIgnoreTrafficFromOwnNode() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
String nodeID = RandomUtil.randomString();
bg = newBroadcast(nodeID, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg = newDiscoveryGroup(nodeID, RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
dg.start();
verifyNonBroadcast(bg, dg);
List<DiscoveryEntry> entries = dg.getDiscoveryEntries();
Assert.assertNotNull(entries);
Assert.assertEquals(0, entries.size());
}
@Test
public void testSimpleBroadcastDifferentPort() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(getUDPDiscoveryAddress());
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
bg = newBroadcast(RandomUtil.randomString(), RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
final int port2 = getUDPDiscoveryPort(1);
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, port2, timeout);
dg.start();
verifyNonBroadcast(bg, dg);
}
@Test
public void testSimpleBroadcastDifferentAddressAndPort() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
bg = newBroadcast(RandomUtil.randomString(), RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
final InetAddress groupAddress2 = InetAddress.getByName(address2);
final int port2 = getUDPDiscoveryPort(1);
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress2, port2, timeout);
dg.start();
verifyNonBroadcast(bg, dg);
}
@Test
public void testMultipleGroups() throws Exception {
final int groupPort1 = getUDPDiscoveryPort();
final int groupPort2 = getUDPDiscoveryPort(1);
final int groupPort3 = getUDPDiscoveryPort(2);
final InetAddress groupAddress1 = InetAddress.getByName(address1);
final InetAddress groupAddress2 = InetAddress.getByName(address2);
final InetAddress groupAddress3 = InetAddress.getByName(address3);
final int timeout = 5000;
String node1 = UUIDGenerator.getInstance().generateStringUUID();
String node2 = UUIDGenerator.getInstance().generateStringUUID();
String node3 = UUIDGenerator.getInstance().generateStringUUID();
bg1 = newBroadcast(node1, RandomUtil.randomString(), null, -1, groupAddress1, groupPort1);
bg2 = newBroadcast(node2, RandomUtil.randomString(), null, -1, groupAddress2, groupPort2);
bg3 = newBroadcast(node3, RandomUtil.randomString(), null, -1, groupAddress3, groupPort3);
bg2.start();
bg1.start();
bg3.start();
TransportConfiguration live1 = generateTC("live1");
TransportConfiguration live2 = generateTC("live2");
TransportConfiguration live3 = generateTC("live3");
bg1.addConnector(live1);
bg2.addConnector(live2);
bg3.addConnector(live3);
dg1 = newDiscoveryGroup("group-1::" + RandomUtil.randomString(), "group-1::" + RandomUtil.randomString(), null, groupAddress1, groupPort1, timeout);
dg1.start();
dg2 = newDiscoveryGroup("group-2::" + RandomUtil.randomString(), "group-2::" + RandomUtil.randomString(), null, groupAddress2, groupPort2, timeout);
dg2.start();
dg3 = newDiscoveryGroup("group-3::" + RandomUtil.randomString(), "group-3::" + RandomUtil.randomString(), null, groupAddress3, groupPort3, timeout);
dg3.start();
bg1.broadcastConnectors();
bg2.broadcastConnectors();
bg3.broadcastConnectors();
boolean ok = dg1.waitForBroadcast(timeout);
Assert.assertTrue(ok);
List<DiscoveryEntry> entries = dg1.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
ok = dg2.waitForBroadcast(timeout);
Assert.assertTrue(ok);
entries = dg2.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live2), entries);
ok = dg3.waitForBroadcast(timeout);
Assert.assertTrue(ok);
entries = dg3.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live3), entries);
}
// -- fix this test
// public void testBroadcastNullBackup() throws Exception
// {
// final InetAddress groupAddress = InetAddress.getByName(address1);
// final int groupPort = getUDPDiscoveryPort();
// 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 DiscoveryGroup(RandomUtil.randomString(),
// RandomUtil.randomString(),
// null,
// groupAddress,
// groupPort,
// timeout,
// Executors.newFixedThreadPool(1));
//
// dg.start();
//
// bg.broadcastConnectors();
//
// boolean ok = dg.waitForBroadcast(1000);
//
// Assert.assertTrue(ok);
// }
@Test
public void testDiscoveryListenersCalled() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
String nodeID = RandomUtil.randomString();
bg = newBroadcast(nodeID, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg = newDiscoveryGroup(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();
verifyBroadcast(bg, dg);
Assert.assertTrue(listener1.called);
Assert.assertTrue(listener2.called);
Assert.assertTrue(listener3.called);
listener1.called = false;
listener2.called = false;
listener3.called = false;
verifyBroadcast(bg, dg);
// Won't be called since connectors haven't changed
Assert.assertFalse(listener1.called);
Assert.assertFalse(listener2.called);
Assert.assertFalse(listener3.called);
}
@Test
public void testConnectorsUpdatedMultipleBroadcasters() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
String node1 = RandomUtil.randomString();
String node2 = RandomUtil.randomString();
String node3 = RandomUtil.randomString();
bg1 = newBroadcast(node1, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg1.start();
bg2 = newBroadcast(node2, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg2.start();
bg3 = newBroadcast(node3, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg3.start();
TransportConfiguration live1 = generateTC();
bg1.addConnector(live1);
TransportConfiguration live2 = generateTC();
bg2.addConnector(live2);
TransportConfiguration live3 = generateTC();
bg3.addConnector(live3);
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
MyListener listener1 = new MyListener();
dg.registerListener(listener1);
MyListener listener2 = new MyListener();
dg.registerListener(listener2);
dg.start();
verifyBroadcast(bg1, dg);
List<DiscoveryEntry> entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
Assert.assertTrue(listener1.called);
Assert.assertTrue(listener2.called);
listener1.called = false;
listener2.called = false;
verifyBroadcast(bg2, dg);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live2), entries);
Assert.assertTrue(listener1.called);
Assert.assertTrue(listener2.called);
listener1.called = false;
listener2.called = false;
verifyBroadcast(bg3, dg);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live2, live3), entries);
Assert.assertTrue(listener1.called);
Assert.assertTrue(listener2.called);
listener1.called = false;
listener2.called = false;
verifyBroadcast(bg1, dg);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live2, live3), entries);
Assert.assertFalse(listener1.called);
Assert.assertFalse(listener2.called);
listener1.called = false;
listener2.called = false;
verifyBroadcast(bg2, dg);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live2, live3), entries);
Assert.assertFalse(listener1.called);
Assert.assertFalse(listener2.called);
listener1.called = false;
listener2.called = false;
verifyBroadcast(bg3, dg);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live2, live3), entries);
Assert.assertFalse(listener1.called);
Assert.assertFalse(listener2.called);
listener1.called = false;
listener2.called = false;
bg2.removeConnector(live2);
verifyBroadcast(bg2, dg);
// Connector2 should still be there since not timed out yet
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live2, live3), entries);
Assert.assertFalse(listener1.called);
Assert.assertFalse(listener2.called);
listener1.called = false;
listener2.called = false;
Thread.sleep(timeout * 2);
bg1.broadcastConnectors();
boolean ok = dg.waitForBroadcast(1000);
bg2.broadcastConnectors();
ok = dg.waitForBroadcast(1000);
bg3.broadcastConnectors();
ok = dg.waitForBroadcast(1000);
entries = dg.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1, live3), entries);
Assert.assertTrue(listener1.called);
Assert.assertTrue(listener2.called);
listener1.called = false;
listener2.called = false;
bg1.removeConnector(live1);
bg3.removeConnector(live3);
Thread.sleep(timeout * 2);
bg1.broadcastConnectors();
ok = dg.waitForBroadcast(1000);
bg2.broadcastConnectors();
ok = dg.waitForBroadcast(1000);
bg3.broadcastConnectors();
ok = dg.waitForBroadcast(1000);
entries = dg.getDiscoveryEntries();
Assert.assertNotNull(entries);
Assert.assertEquals(0, entries.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);
entries = dg.getDiscoveryEntries();
Assert.assertNotNull(entries);
Assert.assertEquals(0, entries.size());
Assert.assertFalse(listener1.called);
Assert.assertFalse(listener2.called);
}
@Test
public void testMultipleDiscoveryGroups() throws Exception {
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
String nodeID = RandomUtil.randomString();
bg = newBroadcast(nodeID, RandomUtil.randomString(), null, -1, groupAddress, groupPort);
bg.start();
TransportConfiguration live1 = generateTC();
bg.addConnector(live1);
dg1 = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
dg2 = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
dg3 = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout);
dg1.start();
dg2.start();
dg3.start();
bg.broadcastConnectors();
boolean ok = dg1.waitForBroadcast(1000);
Assert.assertTrue(ok);
List<DiscoveryEntry> entries = dg1.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
ok = dg2.waitForBroadcast(1000);
Assert.assertTrue(ok);
entries = dg2.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
ok = dg3.waitForBroadcast(1000);
Assert.assertTrue(ok);
entries = dg3.getDiscoveryEntries();
assertEqualsDiscoveryEntries(Arrays.asList(live1), entries);
bg.stop();
dg1.stop();
dg2.stop();
dg3.stop();
}
@Test
public void testDiscoveryGroupNotifications() throws Exception {
SimpleNotificationService notifService = new SimpleNotificationService();
SimpleNotificationService.Listener notifListener = new SimpleNotificationService.Listener();
notifService.addNotificationListener(notifListener);
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
final int timeout = 500;
dg = newDiscoveryGroup(RandomUtil.randomString(), RandomUtil.randomString(), null, groupAddress, groupPort, timeout, notifService);
Assert.assertEquals(0, notifListener.getNotifications().size());
dg.start();
Assert.assertEquals(1, notifListener.getNotifications().size());
Notification notif = notifListener.getNotifications().get(0);
Assert.assertEquals(CoreNotificationType.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(CoreNotificationType.DISCOVERY_GROUP_STOPPED, notif.getType());
Assert.assertEquals(dg.getName(), notif.getProperties().getSimpleStringProperty(new SimpleString("name")).toString());
}
@Test
public void testBroadcastGroupNotifications() throws Exception {
SimpleNotificationService notifService = new SimpleNotificationService();
SimpleNotificationService.Listener notifListener = new SimpleNotificationService.Listener();
notifService.addNotificationListener(notifListener);
final InetAddress groupAddress = InetAddress.getByName(address1);
final int groupPort = getUDPDiscoveryPort();
bg = newBroadcast(RandomUtil.randomString(), RandomUtil.randomString(), null, -1, groupAddress, groupPort);
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(CoreNotificationType.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(CoreNotificationType.BROADCAST_GROUP_STOPPED, notif.getType());
Assert.assertEquals(bg.getName(), notif.getProperties().getSimpleStringProperty(new SimpleString("name")).toString());
}
}