package org.jgroups.tests;
import org.jgroups.*;
import org.jgroups.protocols.UNICAST2;
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,sequential=true)
public class UUIDCacheClearTest extends ChannelTestBase {
@Test
public void testCacheClear() throws Exception {
JChannel c1=null, c2=null;
Address c1_addr, c2_addr;
MyReceiver r1=new MyReceiver(), r2=new MyReceiver();
try {
c1=createChannel(true, 2);
c1.setReceiver(r1);
c1.connect("testCacheClear");
c2=createChannel(c1);
c2.setReceiver(r2);
c2.connect("testCacheClear");
assert c2.getView().size() == 2 : "view is " + c2.getView();
c1_addr=c1.getAddress();
c2_addr=c2.getAddress();
// send one unicast message from c1 to c2 and vice versa
c1.send(c2_addr, "one");
c2.send(c1_addr, "one");
List<Message> c1_list=r1.getList();
List<Message> c2_list=r2.getList();
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(500);
}
assert c1_list.size() == 1 && c2_list.size() == 1;
// now clear the caches and send message "two"
printCaches(c1, c2);
System.out.println("clearing the caches");
clearCache(c1,c2);
printCaches(c1, c2);
r1.clear();
r2.clear();
r1.enablePrinting(true); r2.enablePrinting(true);
// send one unicast message from c1 to c2 and vice versa
c1.send(c2_addr, "one");
c2.send(c1_addr, "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;
stable(c1, c2);
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(c1_addr);
assert msg_from_1.getObject().equals("one");
assert msg_from_2.getSrc().equals(c2_addr);
assert msg_from_2.getObject().equals("two");
}
finally {
Util.close(c2, c1);
}
}
private static void clearCache(JChannel ... channels) {
for(JChannel ch: channels) {
ch.getProtocolStack().getTransport().clearLogicalAddressCache();
ch.down(new Event(Event.SET_LOCAL_ADDRESS, ch.getAddress()));
}
}
protected static void stable(JChannel... channels) {
for(JChannel ch: channels) {
UNICAST2 unicast2=(UNICAST2)ch.getProtocolStack().findProtocol(UNICAST2.class);
if(unicast2 != null)
unicast2.sendStableMessages();
}
}
private static void printCaches(JChannel ... channels) {
System.out.println("chaches:\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<Message>(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;}
}
}