package org.jgroups.tests;
import org.jgroups.*;
import org.jgroups.protocols.*;
import org.jgroups.protocols.pbcast.GMS;
import org.jgroups.protocols.pbcast.NAKACK2;
import org.jgroups.protocols.pbcast.STABLE;
import org.jgroups.stack.Protocol;
import org.jgroups.stack.ProtocolStack;
import org.jgroups.util.Util;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
/**
* @author Bela Ban
*/
@Test(groups=Global.FUNCTIONAL,sequential=true)
public class ProgrammaticApiTest {
JChannel c1, c2;
@BeforeMethod
void init() {
c1=new JChannel(false); c1.setName("A");
c2=new JChannel(false); c2.setName("B");
}
@AfterMethod
void destroy() {
Util.close(c2, c1);
}
public void testChannelCreation() throws Exception {
MyReceiver receiver=new MyReceiver(null);
c1.setReceiver(receiver);
ProtocolStack stack=new ProtocolStack();
c1.setProtocolStack(stack);
stack.addProtocol(new SHARED_LOOPBACK()).addProtocol(new MockProtocol1()).addProtocol(new MockProtocol2());
stack.init();
c1.connect("demo");
Protocol transport=stack.getTransport();
transport.up(new Event(Event.MSG, new Message(null, Util.createRandomAddress(), "hello world")));
assert receiver.getNumMsgsReceived() == 1;
}
public void testSharedTransport() throws Exception {
ProtocolStack stack1=new ProtocolStack(), stack2=new ProtocolStack();
c1.setProtocolStack(stack1);
c2.setProtocolStack(stack2);
MyReceiver receiver1=new MyReceiver("A"), receiver2=new MyReceiver("B");
UDP shared_transport=(UDP)new UDP().setValue("singleton_name", "shared");
stack1.addProtocol(shared_transport).addProtocols(createProtocols());
stack2.addProtocol(shared_transport).addProtocols(createProtocols());
stack1.init();
stack2.init();
c1.setReceiver(receiver1);
c2.setReceiver(receiver2);
c1.connect("cluster-one");
c2.connect("cluster-two");
for(int i=0; i < 10; i++)
c1.send(new Message(null, null, "hello-" + i));
for(int i=0; i < 5; i++)
c2.send(new Message(null, null, "hello-" + i));
for(int i =0; i < 20; i++) {
if(receiver1.getNumMsgsReceived() == 10 && receiver2.getNumMsgsReceived() == 5)
break;
Util.sleep(500);
}
assert receiver1.getNumMsgsReceived() == 10 : "num msgs for A: " + receiver1.getNumMsgsReceived() + " (expected=10)";
assert receiver2.getNumMsgsReceived() == 5 : "num msgs for B: " + receiver1.getNumMsgsReceived() + " (expected=5)";
}
protected static class MockProtocol1 extends Protocol {
}
protected static class MockProtocol2 extends Protocol {
}
static Protocol[] createProtocols() {
return new Protocol[] {
new PING(),
new MERGE2(),
new FD_SOCK(),
new FD_ALL().setValue("timeout", 12000).setValue("interval", 3000),
new VERIFY_SUSPECT(),
new BARRIER(),
new NAKACK2(),
new UNICAST2(),
new STABLE(),
new GMS(),
new UFC(),
new MFC(),
new FRAG2()
};
}
static class MyReceiver extends ReceiverAdapter {
int num_msgs_received=0;
final String name;
public MyReceiver(String name) {
this.name=name;
}
public int getNumMsgsReceived() {
return num_msgs_received;
}
public void receive(Message msg) {
System.out.println((name != null? "[" + name + "]" : "") + "<< " + msg.getObject());
num_msgs_received++;
}
}
}