package org.jgroups.tests; import org.jgroups.*; import org.jgroups.util.Util; import org.testng.annotations.Test; import java.util.ArrayList; import java.util.List; /** * Test whether physical addresses are fetched correctly after the UUID-physical address cache has been cleared * @author Bela Ban */ @Test(groups=Global.STACK_DEPENDENT,singleThreaded=true) public class UUIDCacheClearTest extends ChannelTestBase { public void testCacheClear() throws Exception { JChannel a=null, b=null; MyReceiver r1=new MyReceiver(), r2=new MyReceiver(); try { a=createChannel(true, 2, "A"); a.setReceiver(r1); a.connect("UUIDCacheClearTest"); b=createChannel(a, "B"); b.setReceiver(r2); b.connect("UUIDCacheClearTest"); Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b); // send one unicast message from a to b and vice versa a.send(b.getAddress(), "one"); b.send(a.getAddress(), "one"); List<Message> c1_list=r1.getList(); List<Message> c2_list=r2.getList(); for(int i=0; i < 20; i++) { // poor man's way of waiting until we have 1 message in each receiver... :-) if(!c1_list.isEmpty() && !c2_list.isEmpty()) break; Util.sleep(500); } assert c1_list.size() == 1 && c2_list.size() == 1; // now clear the caches and send message "two" printCaches(a,b); System.out.println("clearing the caches"); clearCache(a,b); printCaches(a,b); r1.clear(); r2.clear(); r1.enablePrinting(true); r2.enablePrinting(true); // send one unicast message from a to b and vice versa a.send(b.getAddress(), "one"); b.send(a.getAddress(), "two"); for(int i=0; i < 10; i++) { // poor man's way of waiting until we have 1 message in each receiver... :-) if(!c1_list.isEmpty() && !c2_list.isEmpty()) break; Util.sleep(1000); } r1.enablePrinting(false); r2.enablePrinting(false); assert c1_list.size() == 1 && c2_list.size() == 1; Message msg_from_1=c2_list.get(0); Message msg_from_2=c1_list.get(0); assert msg_from_1.getSrc().equals(a.getAddress()); assert msg_from_1.getObject().equals("one"); assert msg_from_2.getSrc().equals(b.getAddress()); assert msg_from_2.getObject().equals("two"); } finally { Util.close(b, a); } } private static void clearCache(JChannel ... channels) { for(JChannel ch: channels) { ch.getProtocolStack().getTransport().clearLogicalAddressCache(); ch.down(new Event(Event.SET_LOCAL_ADDRESS, ch.getAddress())); } } private static void printCaches(JChannel ... channels) { System.out.println("caches:\n"); for(JChannel ch: channels) System.out.println(ch.getAddress() + ":\n" + ch.getProtocolStack().getTransport().printLogicalAddressCache()); } private static class MyReceiver extends ReceiverAdapter { private final List<Message> msgs=new ArrayList<>(4); private boolean print_msgs=false; public void receive(Message msg) { msgs.add(msg); if(print_msgs) System.out.println("<< " + msg.getObject() + " from " + msg.getSrc()); } public void clear() {msgs.clear();} public void enablePrinting(boolean flag) {print_msgs=flag;} public List<Message> getList() {return msgs;} } }