package org.jgroups.tests;
import org.jgroups.Address;
import org.jgroups.Global;
import org.jgroups.View;
import org.jgroups.ViewId;
import org.jgroups.util.Util;
import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@Test(groups=Global.FUNCTIONAL)
public class ViewTest {
protected Address a, b, c, d, e, f, g, h, i;
protected View view;
protected List<Address> members;
@BeforeClass
void setUp() throws Exception {
a=Util.createRandomAddress("A");
b=Util.createRandomAddress("B");
c=Util.createRandomAddress("C");
d=Util.createRandomAddress("D");
e=Util.createRandomAddress("E");
f=Util.createRandomAddress("F");
g=Util.createRandomAddress("G");
h=Util.createRandomAddress("H");
i=Util.createRandomAddress("I");
members=Arrays.asList(a, b, c, d, e, f, g, h);
view=View.create(a, 34, a, b, c, d, e, f, g, h);
}
@Test(expectedExceptions=IllegalArgumentException.class)
public void testConstructor() {
view=new View(a, 1, null);
}
public void testGetMembers() throws Exception {
List<Address> mbrs=view.getMembers();
try {
mbrs.add(a);
assert false: "adding a member to a view should throw an exception";
}
catch(UnsupportedOperationException ex) {
System.out.println("adding a member threw " + ex.getClass().getSimpleName() + " as expected");
}
byte[] buf=Util.objectToByteBuffer(view);
View view2=Util.objectFromByteBuffer(buf);
System.out.println("view2 = " + view2);
mbrs=view2.getMembers();
try {
mbrs.add(a);
assert false: "adding a member to a view should throw an exception";
}
catch(UnsupportedOperationException ex) {
System.out.println("adding a member threw " + ex.getClass().getSimpleName() + " as expected");
}
}
public void testContainsMember() {
assert view.containsMember(a) : "Member should be in view";
assert view.containsMember(b) : "Member should be in view";
assert view.containsMember(c) : "Member should be in view";
assert view.containsMember(d) : "Member should be in view";
assert view.containsMember(e) : "Member should be in view";
assert view.containsMember(f) : "Member should be in view";
assert !view.containsMember(i) : "Member should not be in view";
}
public void testContainsMembers() {
assert view.containsMembers(b,a,d,c);
assert !view.containsMembers(a,b,d,f, Util.createRandomAddress("X"));
View v=View.create(a,1,a,b,c);
assert v.containsMembers(a,b);
v=View.create(a,2,a,b);
assert !v.containsMembers(a,b,c);
}
public void testEqualsCreator() {
assert a.equals(view.getCreator()) : "Creator should be a";
assert !view.getCreator().equals(d) : "Creator should not be d";
}
public void testEquals() {
View tmp=view;
assert view.equals(tmp); // tests '=='
}
public void testEquals2() {
View v1=new View(new ViewId(a, 12345), new ArrayList<>(members));
View v2=new View(a, 12345, new ArrayList<>(members));
assert v1.equals(v2);
View v3=new View(a, 12543, new ArrayList<>(members));
assert !v1.equals(v3);
}
/** Tests {@link View#sameViews(View...)} */
public void testSameViews() {
View v1=View.create(a,1,a,b,c), v2=View.create(a,1,a,b,c), v3=View.create(a,1,a,b,c), v4=View.create(b,1,a,b,c);
assert View.sameViews(v1,v2,v3);
assert !View.sameViews(v1,v2,v3,v4);
assert View.sameViews(Arrays.asList(v1,v2,v3));
assert !View.sameViews(Arrays.asList(v1,v2,v3,v4));
}
public void testCopy() throws Exception {
View view2=view;
System.out.println("view = " + view);
System.out.println("view2 = " + view2);
assert view.equals(view2);
List<Address> mbrs=view2.getMembers();
try {
mbrs.add(a);
assert false: "adding a member to a view should throw an exception";
}
catch(UnsupportedOperationException ex) {
System.out.println("adding a member threw " + ex.getClass().getSimpleName() + " as expected");
}
}
public void testDiff() {
View one=null;
View two=View.create(a, 1, a, b, c);
Address[][] diff=View.diff(one,two);
System.out.println("diffs: " + printDiff(diff));
Address[] joined=diff[0], left=diff[1];
assert joined.length == 3;
assert joined[0].equals(a) && joined[1].equals(b) && joined[2].equals(c);
assert left.length == 0;
}
public void testDiff2() {
View one=View.create(a, 1, a,b,c);
View two=View.create(a, 2, a,b,c,d,e);
Address[][] diff=View.diff(one,two);
System.out.println("diffs: " + printDiff(diff));
Address[] joined=diff[0], left=diff[1];
assert joined.length == 2;
assert joined[0].equals(d) && joined[1].equals(e);
assert left.length == 0;
}
public void testDiff3() {
View one=View.create(a, 1, a,b,c,d,e);
View two=View.create(a, 2, a,b,c);
Address[][] diff=View.diff(one,two);
System.out.println("diffs: " + printDiff(diff));
Address[] joined=diff[0], left=diff[1];
assert joined.length == 0;
assert left.length == 2;
assert left[0].equals(d) && left[1].equals(e);
}
public void testDiff4() {
View one=View.create(a, 1, a,b,c,d,e,f,g);
View two=View.create(b, 2, b,c,d,g,h,i);
Address[][] diff=View.diff(one,two);
System.out.println("diffs: " + printDiff(diff));
Address[] joined=diff[0], left=diff[1];
assert joined.length == 2;
assert joined[0].equals(h) && joined[1].equals(i);
assert left.length == 3;
assert left[0].equals(a) && left[1].equals(e) && left[2].equals(f);
}
public void testSameMembers() {
View one=View.create(a, 1, a,b,c,d,e);
View two=View.create(a, 2, a,b,c);
assert !View.sameMembers(one, two);
two=View.create(a, 20, a,b,c,d,e);
assert View.sameMembers(one, two);
assert View.sameMembers(two, one);
one=two;
assert View.sameMembers(one, two);
one=View.create(b, 5, a,b,c);
two=View.create(c, 5, b,a,c);
assert View.sameMembers(one,two);
two=View.create(c, 5, b,a,c,d);
assert !View.sameMembers(one,two);
one=View.create(b, 5, d,b,c,a);
two=View.create(c, 5, b,a,c);
assert !View.sameMembers(one, two);
assert !View.sameMembers(two, one);
}
public void testSameMembersOrdered() {
View one=View.create(a, 1, a, b, c, d, e);
View two=View.create(a, 2, a, b, c);
assert !View.sameMembersOrdered(one, two);
two=one;
assert View.sameMembersOrdered(one, two);
one=View.create(a, 1, a, b, c, d, e);
two=View.create(a, 5, a, b, c, d, e); // view id is not matched
assert View.sameMembersOrdered(one, two);
}
public void testLeftMembers() {
View one=View.create(a, 1, a,b,c,d),
two=View.create(b, 2, c,d);
List<Address> left=View.leftMembers(one, two);
System.out.println("left = " + left);
assert left != null;
assert left.size() == 2;
assert left.contains(a);
assert left.contains(b);
}
public void testLeftMembers2() {
View one=View.create(a, 1, a,b,c,d),
two=View.create(b, 2, c,d,a,b);
List<Address> left=View.leftMembers(one, two);
System.out.println("left = " + left);
assert left != null;
assert left.isEmpty();
}
public void testNewMembers() {
View one=View.create(a, 1, a,b),
two=View.create(b, 2, a,b,c,d);
List<Address> new_mbrs=View.newMembers(one, two);
System.out.println("new = " + new_mbrs);
assert new_mbrs != null;
assert new_mbrs.size() == 2;
assert new_mbrs.contains(c);
assert new_mbrs.contains(d);
}
public void testIterator() {
List<Address> mbrs=new ArrayList<>(members.size());
for(Address addr: view)
mbrs.add(addr);
System.out.println("mbrs: " + mbrs);
Assert.assertEquals(members, mbrs);
}
protected static String printDiff(Address[][] diff) {
StringBuilder sb=new StringBuilder();
Address[] joined=diff[0], left=diff[1];
sb.append("joined: ").append(Arrays.toString(joined)).append(", left: ").append(Arrays.toString(left));
return sb.toString();
}
}