package org.jgroups.tests; import org.jgroups.*; import org.jgroups.protocols.TP; import org.jgroups.stack.ProtocolStack; import org.jgroups.util.MyReceiver; import org.jgroups.util.NameCache; import org.jgroups.util.Promise; import org.jgroups.util.Util; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; import java.util.List; /** * Runs through multiple channel connect and disconnects, without closing the channel. */ @Test(groups=Global.STACK_DEPENDENT,singleThreaded=true) public class ConnectTest extends ChannelTestBase { JChannel channel, coordinator; @AfterMethod void tearDown() throws Exception { Util.close(channel, coordinator); } public void testConnectAndDisconnect() throws Exception { channel=createChannel(true); final String GROUP=getUniqueClusterName("ConnectTest"); for(int i=0; i < 5; i++) { System.out.print("Attempt #" + (i + 1)); channel.connect(GROUP); System.out.println(": OK"); channel.disconnect(); } } public void testDisconnectConnectOne() throws Exception { channel=createChannel(true); changeProps(channel); channel.connect("ConnectTest.testgroup-1"); channel.disconnect(); channel.connect("ConnectTest.testgroup-2"); View view=channel.getView(); assert view.size() == 1; assert view.containsMember(channel.getAddress()); } /** * Tests connect-disconnect-connect sequence for a group with two members **/ public void testDisconnectConnectTwo() throws Exception { coordinator=createChannel(true, 3, "coord"); changeProps(coordinator); coordinator.connect("ConnectTest.testgroup-3"); print(coordinator, "coord"); View view=coordinator.getView(); System.out.println("-- view for coordinator: " + view); assert view.size() == 1; channel=createChannel(coordinator, "channel"); changeProps(channel); channel.connect("ConnectTest.testgroup-4"); print(channel, "channel"); view=channel.getView(); System.out.println("-- view for channel: " + view); assert view.size() == 1; channel.disconnect(); channel.connect("ConnectTest.testgroup-3"); print(channel, "channel"); view=channel.getView(); System.out.println("-- view for channel: " + view); assert view.size() == 2; assert view.containsMember(channel.getAddress()); assert view.containsMember(coordinator.getAddress()); } public void testDisconnectConnectndMessageSending() throws Exception { coordinator=createChannel(true, 2).name("A"); channel=createChannel(coordinator, "B"); coordinator.connect("ConnectTest"); channel.connect("ConnectTest"); Util.waitUntilAllChannelsHaveSameView(10000, 1000, coordinator, channel); MyReceiver<Integer> receiver=new MyReceiver<>(); channel.setReceiver(receiver); for(int i=1; i <= 5; i++) { coordinator.send(new Message(channel.getAddress(), i)); coordinator.send(new Message(null, i+5)); } List<Integer> list=receiver.list(); Util.waitUntilListHasSize(list, 10, 5000, 500); System.out.println("list = " + list); list.clear(); //for(JChannel ch: Arrays.asList(coordinator, channel)) //ch.getProtocolStack().findProtocol(UNICAST3.class).setLevel("trace"); channel.disconnect(); channel.connect("ConnectTest"); Util.waitUntilAllChannelsHaveSameView(10000, 1000, coordinator, channel); for(int i=1; i <= 5; i++) { coordinator.send(new Message(channel.getAddress(), i)); coordinator.send(new Message(null, i+5)); } Util.waitUntilListHasSize(list, 10, 5000, 500); System.out.println("list = " + list); } protected static void print(JChannel ch, String msg) { System.out.println(msg + ": name=" + ch.getName() + ", addr=" + ch.getAddress() + ", UUID=" + ch.getAddressAsUUID() + "\nUUID cache:\n" + NameCache.printCache() + "\nLogical_addr_cache:\n" + ch.getProtocolStack().getTransport().printLogicalAddressCache()); } /** * Tests connect-disconnect-connect-send sequence for a group with two members **/ public void testDisconnectConnectSendTwo() throws Exception { final Promise<Message> msgPromise=new Promise<>(); coordinator=createChannel(true); changeProps(coordinator); coordinator.setReceiver(new PromisedMessageListener(msgPromise)); coordinator.connect("ConnectTest.testgroup-5"); channel=createChannel(coordinator); changeProps(channel); channel.connect("ConnectTest.testgroup-6"); channel.disconnect(); channel.connect("ConnectTest.testgroup-5"); channel.send(new Message(null, "payload")); Message msg=msgPromise.getResult(20000); assert msg != null; assert msg.getObject().equals("payload"); } private static void changeProps(JChannel ch) { ProtocolStack stack=ch.getProtocolStack(); TP transport=stack.getTransport(); transport.setLogDiscardMessages(false); } private static class PromisedMessageListener extends ReceiverAdapter { private final Promise<Message> promise; public PromisedMessageListener(Promise<Message> promise) { this.promise=promise; } public void receive(Message msg) { promise.setResult(msg); } } }