package org.jgroups.blocks;
import org.jgroups.Address;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.tests.ChannelTestBase;
import org.jgroups.util.RspList;
import org.jgroups.util.Util;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author Bela Ban
*/
@Test(groups=Global.STACK_DEPENDENT)
public class RpcDispatcherAnycastTest extends ChannelTestBase {
protected RpcDispatcher disp, disp2, disp3;
protected JChannel a, b, c;
@BeforeMethod
void setUp() throws Exception {
a=createChannel(true, 3).name("A");
ServerObject obj=new ServerObject(null);
disp=new RpcDispatcher(a, obj);
a.connect("RpcDispatcherAnycastTest");
obj.setAddress(a.getAddress());
b=createChannel(a).name("B");
ServerObject obj2=new ServerObject(null);
disp2=new RpcDispatcher(b, obj2);
b.connect("RpcDispatcherAnycastTest");
obj2.setAddress(b.getAddress());
c=createChannel(a).name("C");
ServerObject obj3=new ServerObject(null);
disp3=new RpcDispatcher(c, obj3);
c.connect("RpcDispatcherAnycastTest");
obj3.setAddress(c.getAddress());
Util.waitUntilAllChannelsHaveSameView(10000, 1000, a, b, c);
}
@AfterMethod void tearDown() throws Exception {
Util.close(disp3, disp2, disp, c,b,a);
}
public void testUnserializableValue() throws Exception {
List<Address> members=a.getView().getMembers();
System.out.println("members: " + members);
assert members.size() > 1: "we should have more than 1 member";
List<Address> subset=Collections.singletonList(b.getAddress());
RspList<Address> rsps=disp.callRemoteMethods(subset, "foo", null, null, new RequestOptions(ResponseMode.GET_ALL, 0, false));
System.out.println("rsps (no anycast): " + rsps);
assert rsps.size() == 1;
assert rsps.containsKey(b.getAddress());
rsps=disp.callRemoteMethods(subset, "foo", null, null, new RequestOptions(ResponseMode.GET_ALL, 0, true));
System.out.println("rsps (with anycast): " + rsps);
assert rsps.size() == 1;
assert rsps.containsKey(b.getAddress());
subset=Arrays.asList(b.getAddress(), c.getAddress());
rsps=disp.callRemoteMethods(subset, "foo", null, null, new RequestOptions(ResponseMode.GET_ALL, 0, false));
System.out.println("rsps (no anycast): " + rsps);
assert rsps.size() == 2;
assert rsps.containsKey(b.getAddress());
assert rsps.containsKey(c.getAddress());
rsps=disp.callRemoteMethods(subset, "foo", null, null, new RequestOptions(ResponseMode.GET_ALL, 0, true));
System.out.println("rsps (with anycast): " + rsps);
assert rsps.size() == 2;
assert rsps.containsKey(b.getAddress());
assert rsps.containsKey(c.getAddress());
}
protected static class ServerObject {
protected Address addr;
public ServerObject(Address addr) {
this.addr=addr;
}
public Address foo() {
return addr;
}
public void setAddress(Address localAddress) {
addr=localAddress;
}
}
}