package org.jgroups.tests;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.conf.ProtocolConfiguration;
import org.jgroups.stack.Configurator;
import org.jgroups.stack.Protocol;
import org.jgroups.stack.ProtocolStack;
import org.testng.Assert;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.List;
/**
* Tests ProtocolStack.insertProtocol() and removeProtocol()
* @author Bela Ban
*/
@Test(groups=Global.FUNCTIONAL,sequential=true)
public class ConfiguratorTest {
ProtocolStack stack;
static final String props="UDP:PING:FD:pbcast.NAKACK(retransmit_timeouts=300,600):UNICAST:FC";
final String[] names={"FC", "UNICAST", "NAKACK", "FD", "PING", "UDP"};
final String[] below={"FC", "UNICAST", "TRACE", "NAKACK", "FD", "PING", "UDP"};
final String[] above={"FC", "TRACE", "UNICAST", "NAKACK", "FD", "PING", "UDP"};
@BeforeMethod
void setUp() throws Exception {
JChannel mock_channel=new JChannel() {};
stack=new ProtocolStack(mock_channel);
}
public void testRemovalOfTop() throws Exception {
stack.setup(Configurator.parseConfigurations(props));
Protocol prot=stack.removeProtocol("FC");
assert prot != null;
List<Protocol> protocols=stack.getProtocols();
Assert.assertEquals(5, protocols.size());
assert protocols.get(0).getName().endsWith("UNICAST");
assert stack.getTopProtocol().getUpProtocol() != null;
assert stack.getTopProtocol().getDownProtocol() != null;
assert stack.getTopProtocol().getDownProtocol().getUpProtocol() != null;
assert stack.getTopProtocol().getDownProtocol().getDownProtocol() != null;
}
public void testRemovalOfBottom() throws Exception {
stack.setup(Configurator.parseConfigurations(props));
Protocol prot=stack.removeProtocol("UDP");
assert prot != null;
List<Protocol> protocols=stack.getProtocols();
Assert.assertEquals(5, protocols.size());
assert protocols.get(protocols.size() -1).getName().endsWith("PING");
}
public void testAddingAboveTop() throws Exception{
stack.setup(Configurator.parseConfigurations(props));
Protocol new_prot=(Protocol)Class.forName("org.jgroups.protocols.TRACE").newInstance();
stack.insertProtocol(new_prot, ProtocolStack.ABOVE, "FC");
List<Protocol> protocols=stack.getProtocols();
Assert.assertEquals(7, protocols.size());
assert protocols.get(0).getName().endsWith("TRACE");
assert stack.getTopProtocol().getUpProtocol() != null;
assert stack.getTopProtocol().getDownProtocol() != null;
assert stack.getTopProtocol().getDownProtocol().getUpProtocol() != null;
assert stack.getTopProtocol().getDownProtocol().getDownProtocol() != null;
}
@Test(expectedExceptions={IllegalArgumentException.class})
public void testAddingBelowBottom() throws Exception{
stack.setup(Configurator.parseConfigurations(props));
Protocol new_prot=(Protocol)Class.forName("org.jgroups.protocols.TRACE").newInstance();
stack.insertProtocol(new_prot, ProtocolStack.BELOW, "UDP");
}
public void testInsertion() throws Exception {
stack.setup(Configurator.parseConfigurations(props));
List<Protocol> protocols=stack.getProtocols();
assert protocols != null;
Assert.assertEquals(6, protocols.size());
for(int i=0; i < names.length; i++) {
String name=names[i];
Protocol p=protocols.get(i);
Assert.assertEquals(name, p.getName());
}
// insert below
Protocol new_prot=(Protocol)Class.forName("org.jgroups.protocols.TRACE").newInstance();
stack.insertProtocol(new_prot, ProtocolStack.BELOW, "UNICAST");
protocols=stack.getProtocols();
Assert.assertEquals(7, protocols.size());
for(int i=0; i < below.length; i++) {
String name=below[i];
Protocol p=protocols.get(i);
Assert.assertEquals(name, p.getName());
}
// remove
Protocol prot=stack.removeProtocol("TRACE");
assert prot != null;
protocols=stack.getProtocols();
Assert.assertEquals(6, protocols.size());
for(int i=0; i < names.length; i++) {
String name=names[i];
Protocol p=protocols.get(i);
Assert.assertEquals(name, p.getName());
}
// insert above
new_prot=(Protocol)Class.forName("org.jgroups.protocols.TRACE").newInstance();
stack.insertProtocol(new_prot, ProtocolStack.ABOVE, "UNICAST");
protocols=stack.getProtocols();
Assert.assertEquals(7, protocols.size());
for(int i=0; i < above.length; i++) {
String name=above[i];
Protocol p=protocols.get(i);
Assert.assertEquals(name, p.getName());
}
}
public static void testParsing() throws Exception {
String config="UDP(mcast_addr=ff18:eb72:479f::2:3;oob_thread_pool.max_threads=4;" +
"oob_thread_pool.keep_alive_time=5000;max_bundle_size=64000;mcast_send_buf_size=640000;" +
"oob_thread_pool.queue_max_size=10;mcast_recv_buf_size=25000000;" +
"tos=8;mcast_port=45522;loopback=true;thread_pool.min_threads=2;" +
"oob_thread_pool.rejection_policy=Run;thread_pool.max_threads=8;enable_diagnostics=true;" +
"thread_naming_pattern=cl;ucast_send_buf_size=640000;ucast_recv_buf_size=20000000;" +
"thread_pool.enabled=true;oob_thread_pool.enabled=true;ip_ttl=2;" +
"enable_bundling=true;thread_pool.rejection_policy=Run;discard_incompatible_packets=true;" +
"thread_pool.keep_alive_time=5000;thread_pool.queue_enabled=false;mcast_addr=228.10.10.15;" +
"max_bundle_timeout=30;oob_thread_pool.queue_enabled=false;oob_thread_pool.min_threads=2;" +
"thread_pool.queue_max_size=100):" +
"PING(num_initial_members=3;timeout=2000):" +
"MERGE2(min_interval=5000;max_interval=10000):" +
"FD_SOCK:" +
"FD(max_tries=3;timeout=2000):" +
"VERIFY_SUSPECT(timeout=1500):" +
"BARRIER:" +
"pbcast.NAKACK(use_mcast_xmit=false;retransmit_timeout=300,600,1200,2400,4800;" +
"discard_delivered_msgs=true):" +
"UNICAST(loopback=false;timeout=300,600,1200,2400,3600):" +
"pbcast.STABLE(desired_avg_gossip=50000;max_bytes=1000000;stability_delay=1000):" +
"pbcast.GMS(print_local_addr=true;view_bundling=true;join_timeout=3000):" +
"FC(max_block_time=10000;max_credits=5000000;min_threshold=0.25):" +
"FRAG2(frag_size=60000):" +
"pbcast.STATE(use_reading_thread=true)";
List<ProtocolConfiguration> ret=Configurator.parseConfigurations(config);
System.out.println("config:\n" + ret);
Assert.assertEquals(14, ret.size());
config="UDP(mcast_addr=ff18:eb72:479f::2:3;mcast_port=2453):pbcast.FD:FRAG(frag_size=2292):FD_SIMPLE(s=22;d=33):MERGE2(a=22)";
ret=Configurator.parseConfigurations(config);
System.out.println("config:\n" + ret);
Assert.assertEquals(5, ret.size());
config="com.mycomp.Class:B:pbcast.C:H(a=b;c=d;e=f)";
ret=Configurator.parseConfigurations(config);
System.out.println("config:\n" + ret);
Assert.assertEquals(4, ret.size());
}
}