package org.jgroups.tests; import org.jgroups.JChannel; import org.jgroups.Message; import org.jgroups.Global; import org.jgroups.ReceiverAdapter; import org.jgroups.util.Util; import org.testng.annotations.AfterMethod; import org.testng.annotations.Test; /** * Tests sending and receiving of messages within the same VM. Sends N messages * and expects reception of N messages within a given time. Fails otherwise. * @author Bela Ban */ @Test(groups=Global.STACK_INDEPENDENT,sequential=true) public class SendAndReceiveTest { JChannel channel; static final int NUM_MSGS=1000; static final long TIMEOUT=30000; String props1="UDP(bind_addr=127.0.0.1;loopback=true;mcast_port=27000;ip_ttl=1;" + "mcast_send_buf_size=64000;mcast_recv_buf_size=640000):" + "PING(timeout=2000;num_initial_members=3):" + "MERGE2(min_interval=5000;max_interval=10000):" + "FD_SOCK:" + "VERIFY_SUSPECT(timeout=1500):" + "pbcast.NAKACK2:" + "UNICAST:" + "pbcast.STABLE(desired_avg_gossip=20000):" + "FRAG2(frag_size=8096):" + "pbcast.GMS(join_timeout=5000;print_local_addr=true)"; String props2="UDP(bind_addr=127.0.0.1;loopback=false;mcast_port=27000;ip_ttl=1;" + "mcast_send_buf_size=64000;mcast_recv_buf_size=640000):" + "PING(timeout=2000;num_initial_members=3):" + "MERGE2(min_interval=5000;max_interval=10000):" + "FD_SOCK:" + "VERIFY_SUSPECT(timeout=1500):" + "pbcast.NAKACK2:" + "UNICAST:" + "pbcast.STABLE(desired_avg_gossip=20000):" + "FRAG2(frag_size=8096):" + "pbcast.GMS(join_timeout=5000;print_local_addr=true)"; String props3="SHARED_LOOPBACK:" + "PING(timeout=2000;num_initial_members=3):" + "MERGE2(min_interval=5000;max_interval=10000):" + "FD_SOCK:" + "VERIFY_SUSPECT(timeout=1500):" + "pbcast.NAKACK2:" + "UNICAST:" + "pbcast.STABLE(desired_avg_gossip=20000):" + "FRAG2(frag_size=8096):" + "pbcast.GMS(join_timeout=5000;print_local_addr=true)"; private void setUp(String props) throws Exception { channel=new JChannel(props); channel.connect("SendAndReceiveTest"); } @AfterMethod void tearDown() { Util.close(channel); } /** * Sends NUM messages and expects NUM messages to be received. If * NUM messages have not been received after 20 seconds, the test failed. */ public void testSendAndReceiveWithDefaultUDP_Loopback() throws Exception { setUp(props1); MyReceiver receiver=new MyReceiver(); channel.setReceiver(receiver); sendMessages(NUM_MSGS); int received_msgs=receiveMessages(receiver, NUM_MSGS, TIMEOUT); assert received_msgs >= NUM_MSGS; } public void testSendAndReceiveWithDefaultUDP_NoLoopback() throws Exception { setUp(props2); MyReceiver receiver=new MyReceiver(); channel.setReceiver(receiver); sendMessages(NUM_MSGS); int received_msgs=receiveMessages(receiver, NUM_MSGS, TIMEOUT); assert received_msgs >= NUM_MSGS; } public void testSendAndReceiveWithLoopback() throws Exception { setUp(props3); MyReceiver receiver=new MyReceiver(); channel.setReceiver(receiver); sendMessages(NUM_MSGS); int received_msgs=receiveMessages(receiver, NUM_MSGS, TIMEOUT); assert received_msgs >= NUM_MSGS; } private void sendMessages(int num) throws Exception { Message msg; for(int i=0; i < num; i++) { msg=new Message(); System.out.print(i + " "); channel.send(msg); } } /** * Receive at least <tt>num</tt> messages. Total time should not exceed <tt>timeout</tt> * @param num * @param timeout Must be > 0 * @return */ private static int receiveMessages(MyReceiver receiver, int num, long timeout) { if(timeout <= 0) timeout=5000; long target=System.currentTimeMillis() + timeout; while(receiver.getReceived() < num && System.currentTimeMillis() < target) { Util.sleep(500); } return receiver.getReceived(); } protected static class MyReceiver extends ReceiverAdapter { int received=0; public int getReceived() { return received; } public void receive(Message msg) { System.out.print("+" + received + ' '); received++; } } }