package org.jgroups.tests;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.Message;
import org.jgroups.ReceiverAdapter;
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.util.Util;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
/**
* Tests the flow control (FC and MFC) protocols
* @author Bela Ban
*/
@Test(groups=Global.FUNCTIONAL,singleThreaded=true)
public class FCTest {
JChannel ch;
static final int SIZE=1000; // bytes
static final int NUM_MSGS=100000;
static final int PRINT=NUM_MSGS / 10;
@DataProvider
static Object[][] configProvider() {
return new Object[][] {
{MFC.class}
};
}
protected void setUp(Class<? extends Protocol> flow_control_class) throws Exception {
Protocol flow_control_prot=flow_control_class.newInstance();
flow_control_prot.setValue("min_credits", 1000).setValue("max_credits", 10000).setValue("max_block_time", 1000);
ch=new JChannel(new SHARED_LOOPBACK(),
new SHARED_LOOPBACK_PING(),
new NAKACK2().setValue("use_mcast_xmit", false),
new UNICAST3(),
new STABLE().setValue("max_bytes", 50000),
new GMS().setValue("print_local_addr", false),
flow_control_prot,
new FRAG2().fragSize(800));
ch.connect("FCTest");
}
@AfterMethod void tearDown() throws Exception {Util.close(ch);}
@Test(dataProvider="configProvider")
public void testReceptionOfAllMessages(Class<? extends Protocol> flow_control_class) throws Exception {
int num_received=0;
Receiver r=new Receiver();
setUp(flow_control_class);
ch.setReceiver(r);
for(int i=1; i <= NUM_MSGS; i++) {
Message msg=new Message(null, createPayload(SIZE));
ch.send(msg);
if(i % PRINT == 0)
System.out.println("==> " + i);
}
int num_tries=10;
while(num_tries > 0) {
Util.sleep(1000);
num_received=r.getNumberOfReceivedMessages();
System.out.println("-- num received=" + num_received);
if(num_received >= NUM_MSGS)
break;
num_tries--;
}
assert num_received == NUM_MSGS;
}
private static byte[] createPayload(int size) {
byte[] retval=new byte[size];
for(int i=0; i < size; i++)
retval[i]='0';
return retval;
}
static class Receiver extends ReceiverAdapter {
int num_mgs_received=0;
public void receive(Message msg) {
num_mgs_received++;
if(num_mgs_received % PRINT == 0)
System.out.println("<== " + num_mgs_received);
}
public int getNumberOfReceivedMessages() {
return num_mgs_received;
}
}
}