package org.jgroups.tests;
import org.jgroups.Event;
import org.jgroups.Global;
import org.jgroups.conf.ProtocolConfiguration;
import org.jgroups.util.StackType;
import org.jgroups.annotations.Property;
import org.jgroups.conf.PropertyConverters;
import org.jgroups.stack.Configurator;
import org.jgroups.stack.IpAddress;
import org.jgroups.stack.Protocol;
import org.jgroups.stack.ProtocolStack;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.net.InetAddress;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
/**
* Tests the use of @Property dependency processing and default assignment.
* @author Richard Achmatowicz
*/
@Test(groups=Global.FUNCTIONAL,sequential=true)
public class ProtocolConfigurationTest {
ProtocolStack stack = null;
Protocol protocol = null ;
static final String orderProps="org.jgroups.tests.ProtocolConfigurationTest$ORDERING(a=1;b=2;c=3)";
static final String refsProps="org.jgroups.tests.ProtocolConfigurationTest$REFS(a=1;b=2;c=3)";
static final String defaultProps="org.jgroups.tests.ProtocolConfigurationTest$DEFAULTS(b=333)";
static final String addressProps="org.jgroups.tests.ProtocolConfigurationTest$INETADDRESSES(" +
"inetAddressField=127.0.0.1;inet_address_method=192.168.0.100;" +
"ipAddressListField=127.0.0.1[8080],127.0.0.1[8081];" +
"ip_address_list_method=192.168.0.100[5678],192.168.0.101[2345];port_range=1)" ;
static final String configurableObjectsProps="org.jgroups.tests.ProtocolConfigurationTest$CONFIGOBJPROTOCOL(" +
"config_object_class=org.jgroups.tests.ProtocolConfigurationTest$ConfigurableObject;" +
"string_property=test)" ;
List<String> order = new LinkedList<String>() ;
@BeforeMethod
void setUp() {
stack=new ProtocolStack();
}
/*
* Checks that missing dependencies are flagged
*/
@Test(expectedExceptions=IllegalArgumentException.class)
public void testResolutionOfDependencies() throws Exception {
// create the layer described by REFS
try {
protocol = Configurator.createProtocol(refsProps, stack) ;
}
catch(IllegalArgumentException e) {
System.out.println("exception thrown (expected): " + e.getMessage());
// rethrow to make sure testNG does not fail the test
throw e ;
}
}
/*
* Checks that dependency ordering works
*/
public void testDependencyOrdering() throws Exception {
// create a List describing correct Property ordering
List<String> correctOrder = new LinkedList<String>() ;
correctOrder.add("c") ;
correctOrder.add("b") ;
correctOrder.add("a") ;
// create the layer described by ORDERING
protocol = Configurator.createProtocol(orderProps, stack) ;
// check that the list elements are in the right order
List<String> actualOrder = ((ORDERING)protocol).getList() ;
assert actualOrder.equals(correctOrder) ;
}
/*
* Checks assignment of defaults
*/
public void testDefaultAssignment() throws Exception {
Vector<ProtocolConfiguration> protocol_configs = new Vector<ProtocolConfiguration>() ;
Vector<Protocol> protocols = new Vector<Protocol>() ;
// create the layer described by DEFAULTS
protocol = Configurator.createProtocol(defaultProps, stack) ;
// process the defaults
protocol_configs.add(new ProtocolConfiguration(defaultProps)) ;
protocols.add(protocol) ;
Configurator.setDefaultValues(protocol_configs, protocols, StackType.IPv4) ;
// get the value which should have been assigned a default
int a = ((DEFAULTS)protocol).getA() ;
System.out.println("value of a = " + a) ;
// get the value which should not have been assigned a default
int b = ((DEFAULTS)protocol).getB() ;
System.out.println("value of b = " + b) ;
// assert b == 333 ;
if (b != 333) {
throw new RuntimeException("default property value set when it should not have been") ;
}
// get the value which should not have been assigned a default
InetAddress c = ((DEFAULTS)protocol).getC() ;
System.out.println("value of c = " + c) ;
assert c != null;
}
/*
* Checks InetAddress and IpAddress processing
*/
public void testAssignmentInetAddresses() throws Exception {
Vector<ProtocolConfiguration> protocol_configs = new Vector<ProtocolConfiguration>() ;
Vector<Protocol> protocols = new Vector<Protocol>() ;
// create the layer described by INETADDRESSES
protocol = Configurator.createProtocol(addressProps, stack) ;
// get the value which should have been assigned a default
InetAddress a = ((INETADDRESSES)protocol).getInetAddressField() ;
System.out.println("value of inetAddressField = " + a) ;
// get the value which should not have been assigned a default
InetAddress b = ((INETADDRESSES)protocol).getInetAddressMethod() ;
System.out.println("value of inetAddressMethod = " + b) ;
// get the value which should have been assigned a default
List<IpAddress> c = ((INETADDRESSES)protocol).getIpAddressListField() ;
System.out.println("value of ipAddressListField = " + c) ;
// get the value which should not have been assigned a default
List<IpAddress> d = ((INETADDRESSES)protocol).getIpAddressListMethod() ;
System.out.println("value of ipAddressListMethod = " + d) ;
}
/*
* Checks InetAddress and IpAddress processing
*/
public void testConfigurableObject() throws Exception {
Vector<ProtocolConfiguration> protocol_configs = new Vector<ProtocolConfiguration>() ;
Vector<Protocol> protocols = new Vector<Protocol>() ;
// create the layer described by INETADDRESSES
protocol = Configurator.createProtocol(configurableObjectsProps, stack) ;
// process the defaults (want this eventually)
protocol_configs.add(new ProtocolConfiguration(configurableObjectsProps)) ;
protocols.add(protocol) ;
// get the value which should have been assigned a default
List<Object> configObjs = ((CONFIGOBJPROTOCOL)protocol).getConfigurableObjects() ;
assert configObjs.size() == 1 ;
Object configObj = configObjs.get(0) ;
assert configObj instanceof ConfigurableObject ;
assert ((ConfigurableObject)configObj).getStringProp().equals("test") ;
}
public static class ORDERING extends Protocol {
List<String> list = new LinkedList<String>() ;
@Property(name="a", dependsUpon="b")
public void setA(int a) {
list.add("a") ;
}
@Property(name="b", dependsUpon="c")
public void setB(int b) {
list.add("b") ;
}
@Property(name="c")
public void setC(int c) {
list.add("c") ;
}
List<String> getList() {
return list ;
}
public String getName() {
return name ;
}
// do nothing
public Object down(Event evt) {
return down_prot.down(evt);
}
// do nothing
public Object up(Event evt) {
return up_prot.up(evt);
}
}
public static class REFS extends Protocol {
@Property(name="a", dependsUpon="b")
public void setA(int a) {
}
@Property(name="b", dependsUpon="d")
public void setB(int b) {
}
@Property(name="c")
public void setC(int c) {
}
public String getName() {
return name ;
}
// do nothing
public Object down(Event evt) {
return down_prot.down(evt);
}
// do nothing
public Object up(Event evt) {
return up_prot.up(evt);
}
}
public static class DEFAULTS extends Protocol {
int a ;
int b ;
InetAddress c ;
@Property(name="a")
public void setA(int a) {
this.a = a ;
}
@Property(name="b")
public void setB(int b) {
this.b = b ;
}
@Property(name="c", defaultValueIPv4="192.168.1.10")
public void setC(InetAddress ia) {
this.c = ia ;
}
public int getA() {
return a ;
}
public int getB() {
return b ;
}
public InetAddress getC() {
return c ;
}
public String getName() {
return name ;
}
// do nothing
public Object down(Event evt) {
return down_prot.down(evt);
}
// do nothing
public Object up(Event evt) {
return up_prot.up(evt);
}
}
public static class INETADDRESSES extends Protocol {
InetAddress inetAddressMethod ;
@Property(name="inetAddressField")
InetAddress inetAddressField ;
public InetAddress getInetAddressField() {
return inetAddressField ;
}
@Property(name="inetAddressMethod")
public void setInetAddressMethod(InetAddress ia) {
this.inetAddressMethod = ia ;
}
public InetAddress getInetAddressMethod() {
return inetAddressMethod ;
}
@Property(description="fred")
int port_range = 0 ;
// List<IpAddress> - uses InitialHosts converter
List<IpAddress> ipAddressListMethod ;
@Property(name="ipAddressListField", converter=PropertyConverters.InitialHosts.class)
List<IpAddress> ipAddressListField ;
public List<IpAddress> getIpAddressListField() {
return ipAddressListField ;
}
@Property(name="ipAddressListMethod", converter=PropertyConverters.InitialHosts.class, dependsUpon="port_range")
public void setIpAddressListMethod(List<IpAddress> ia) {
this.ipAddressListMethod = ia ;
}
public List<IpAddress> getIpAddressListMethod() {
return ipAddressListMethod ;
}
public String getName() {
return name ;
}
// do nothing
public Object down(Event evt) {
return down_prot.down(evt);
}
// do nothing
public Object up(Event evt) {
return up_prot.up(evt);
}
}
public static class CONFIGOBJPROTOCOL extends Protocol {
private Object configObjInstance=null;
@Property(name="config_object_class")
public void setConfigurableObjectClass(String class_name) throws Exception {
configObjInstance=Class.forName(class_name).newInstance();
}
protected List<Object> getConfigurableObjects() {
List<Object> retval=new LinkedList<Object>();
if(configObjInstance != null)
retval.add(configObjInstance);
return retval;
}
public String getName() {
return name ;
}
// do nothing
public Object down(Event evt) {
return down_prot.down(evt);
}
// do nothing
public Object up(Event evt) {
return up_prot.up(evt);
}
}
public static class ConfigurableObject {
@Property(name="string_property")
String stringProp = null ;
public String getStringProp() {
return stringProp ;
}
public void setStringProp(String s) {
this.stringProp = s ;
}
}
}