package org.jgroups.blocks;
import org.jgroups.Global;
import org.jgroups.JChannel;
import org.jgroups.View;
import org.jgroups.Address;
import org.jgroups.tests.ChannelTestBase;
import org.jgroups.util.*;
import org.testng.annotations.*;
import java.util.List;
import java.util.Arrays;
/**
* @author Bela Ban
*/
@Test(groups=Global.STACK_DEPENDENT,sequential=true)
public class RpcDispatcherUnitTest extends ChannelTestBase {
private RpcDispatcher d1, d2, d3;
private JChannel c1, c2, c3;
private ServerObject o1, o2, o3;
private Address a1, a2, a3;
private List<Address> members;
@BeforeClass
protected void setUp() throws Exception {
o1=new ServerObject();
o2=new ServerObject();
o3=new ServerObject();
c1=createChannel(true, 3);
c1.setName("A");
final String GROUP="RpcDispatcherUnitTest";
d1=new RpcDispatcher(c1, o1);
c1.connect(GROUP);
c2=createChannel(c1);
c2.setName("B");
d2=new RpcDispatcher(c2, o2);
c2.connect(GROUP);
c3=createChannel(c1);
c3.setName("C");
d3=new RpcDispatcher(c3, o3);
c3.connect(GROUP);
System.out.println("c1.view=" + c1.getView() + "\nc2.view=" + c2.getView() + "\nc3.view=" + c3.getView());
View view=null;
for(int i=0; i < 10; i++) {
view=c3.getView();
if(view.size() == 3)
break;
Util.sleep(1000);
}
assert view != null && view.size() == 3 : "view=" + view;
a1=c1.getAddress();
a2=c2.getAddress();
a3=c3.getAddress();
members=Arrays.asList(a1, a2, a3);
}
@BeforeMethod
protected void reset() {
o1.reset();
o2.reset();
o3.reset();
}
@AfterClass
protected void tearDown() throws Exception {
d3.stop();
d2.stop();
d1.stop();
Util.close(c3, c2, c1);
}
public void testInvocationOnEntireGroup() throws Exception {
RspList rsps=d1.callRemoteMethods(null, "foo", null, null, RequestOptions.SYNC());
System.out.println("rsps:\n" + rsps);
assert rsps.size() == 3;
assert o1.wasCalled() && o2.wasCalled() && o3.wasCalled();
}
public void testInvocationOnEntireGroupWithTargetList() throws Exception {
RspList rsps=d1.callRemoteMethods(members, "foo", null, null, RequestOptions.SYNC());
System.out.println("rsps:\n" + rsps);
assert rsps.size() == 3;
assert o1.wasCalled() && o2.wasCalled() && o3.wasCalled();
}
/** Invoke a method on all but myself */
public void testInvocationWithExclusionOfSelf() throws Exception {
RequestOptions options=new RequestOptions(ResponseMode.GET_ALL, 5000).setExclusionList(a1);
RspList rsps=d1.callRemoteMethods(null, "foo", null, null, options);
Util.sleep(500);
System.out.println("rsps:\n" + rsps);
assert rsps.size() == 2;
assert rsps.containsKey(a2) && rsps.containsKey(a3);
assert !o1.wasCalled() && o2.wasCalled() && o3.wasCalled();
}
public void testInvocationWithExclusionOfTwo() throws Exception {
RequestOptions options=new RequestOptions(ResponseMode.GET_ALL, 5000).setExclusionList(a2, a3);
RspList rsps=d1.callRemoteMethods(null, "foo", null, null, options);
Util.sleep(500);
System.out.println("rsps:\n" + rsps);
assert rsps.size() == 1;
assert rsps.containsKey(a1);
assert o1.wasCalled() && !o2.wasCalled() && !o3.wasCalled();
}
public void testInvocationOnEmptyTargetSet() throws Exception {
RequestOptions options=new RequestOptions(ResponseMode.GET_ALL, 5000).setExclusionList(a1, a2, a3);
RspList rsps=d1.callRemoteMethods(null, "foo", null, null, options);
Util.sleep(500);
System.out.println("rsps:\n" + rsps);
assert rsps.isEmpty();
assert !o1.wasCalled() && !o2.wasCalled() && !o3.wasCalled();
}
private static class ServerObject {
boolean called=false;
public boolean wasCalled() {
return called;
}
public void reset() {
called=false;
}
public boolean foo() {
called=true;
return called;
}
}
}