package org.jgroups.tests;
import org.jgroups.Address;
import org.jgroups.Global;
import org.jgroups.util.AckCollector;
import org.jgroups.util.Util;
import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeoutException;
import java.util.stream.Stream;
@Test(groups=Global.FUNCTIONAL)
public class AckCollectorTest {
final Address one=Util.createRandomAddress("one"), two=Util.createRandomAddress("two"),
three=Util.createRandomAddress("three"), four=Util.createRandomAddress("four"),
five=Util.createRandomAddress("five");
final List<Address> list=Arrays.asList(one, two, three, four, five);
public void testAddAll() {
AckCollector coll=new AckCollector();
coll.reset(Arrays.asList(one,two,three,four), Collections.singletonList(five));
System.out.println("coll = " + coll);
assert coll.size() == 4;
Stream.of(one,two,three,four).forEach(coll::ack);
System.out.println("coll = " + coll);
assert coll.size() == 0;
coll.reset(Collections.singletonList(one), Collections.singletonList(one));
System.out.println("coll = " + coll);
assert coll.size() == 0;
boolean rc=coll.waitForAllAcks();
assert rc;
}
public void testAddAll2() {
AckCollector coll=new AckCollector();
coll.reset(Arrays.asList(one,two,three,four), five);
System.out.println("coll = " + coll);
assert coll.size() == 4;
Stream.of(one,two,three,four).forEach(coll::ack);
System.out.println("coll = " + coll);
assert coll.size() == 0;
coll.reset(Collections.singletonList(one), one);
System.out.println("coll = " + coll);
assert coll.size() == 0;
boolean rc=coll.waitForAllAcks();
assert rc;
}
public void testConstructor() {
AckCollector ac=new AckCollector(list);
System.out.println("AckCollector is " + ac);
Assert.assertEquals(5,ac.size());
}
public void testWaitForAllAcksNoTimeout() {
final AckCollector ac=new AckCollector(list);
new Thread(() -> {
for(Address member: list) {
Util.sleep(100);
ac.ack(member);
System.out.println("AckCollector: " + ac);
}
}).start();
ac.waitForAllAcks();
Assert.assertEquals(0, ac.size());
}
@Test(expectedExceptions=TimeoutException.class)
public void testWaitForAllAcksWithTimeoutException() throws TimeoutException {
AckCollector ac=new AckCollector(list);
ac.waitForAllAcks(200);
}
public void testWaitForAllAcksWithTimeout() {
final AckCollector ac=new AckCollector(list);
new Thread(() -> {
for(Address member: list) {
Util.sleep(100);
ac.ack(member);
System.out.println("AckCollector: " + ac);
}
}).start();
try {
ac.waitForAllAcks(30000);
assert true : "we should not get a timeout exception here";
}
catch(TimeoutException e) {
assert false : "we should not get a timeout exception here";
}
Assert.assertEquals(0, ac.size());
}
@Test(expectedExceptions=TimeoutException.class)
public void testWaitForAllAcksWithTimeoutException2() throws TimeoutException {
final AckCollector ac=new AckCollector(list);
new Thread(() -> {
for(Address member: list) {
Util.sleep(100);
ac.ack(member);
System.out.println("AckCollector: " + ac);
}
}).start();
ac.waitForAllAcks(10);
}
@Test(expectedExceptions=TimeoutException.class)
public void testReset() throws TimeoutException {
final AckCollector ac=new AckCollector(list);
final Address six=Util.createRandomAddress("six"), seven=Util.createRandomAddress("seven"),
eight=Util.createRandomAddress("eight");
final List<Address> new_list=Arrays.asList(six, seven, eight);
new Thread(() -> {
Util.sleep(500);
System.out.println("resetting AckCollector");
ac.reset(new_list);
System.out.println("reset AckCollector: " + ac);
}).start();
System.out.println("initial AckCollector: " + ac);
ac.waitForAllAcks(1000);
System.out.println("new AckCollector: " + ac);
}
public void testReset2() throws TimeoutException {
final AckCollector ac=new AckCollector(list);
final Address six=Util.createRandomAddress("six"), seven=Util.createRandomAddress("seven"),
eight=Util.createRandomAddress("eight");
final List<Address> new_list=Arrays.asList(six, seven, eight);
new Thread(() -> {
Util.sleep(500);
System.out.println("resetting AckCollector");
ac.reset(new_list);
System.out.println("reset AckCollector: " + ac);
Util.sleep(100);
ac.ack(six);
System.out.println("AckCollector: " + ac);
Util.sleep(100);
ac.ack(seven);
System.out.println("AckCollector: " + ac);
Util.sleep(100);
ac.ack(eight);
System.out.println("AckCollector: " + ac);
}).start();
System.out.println("initial AckCollector: " + ac);
ac.waitForAllAcks(30000);
System.out.println("new AckCollector: " + ac);
}
public void testResetWithDuplicateMembers() {
List<Address> tmp_list=Arrays.asList(one,two,one,three,four,one,five);
AckCollector ac=new AckCollector(tmp_list);
System.out.println("ac = " + ac);
assert ac.size() == 5;
ac.reset(tmp_list);
assert ac.size() == 5;
}
public void testDestroy() throws TimeoutException {
List<Address> tmp_list=Arrays.asList(one,two,one,three,four,one,five);
final AckCollector ac=new AckCollector(tmp_list);
System.out.println("ac = " + ac);
assert ac.size() == 5;
Thread thread=new Thread(() -> {
Util.sleep(2000);
ac.destroy();
});
thread.start();
boolean result=ac.waitForAllAcks(10000);
System.out.println("result = " + result);
assert !result;
}
public static void testNullList() throws TimeoutException {
AckCollector coll=new AckCollector();
coll.waitForAllAcks(1000);
}
public static void testOneList() throws TimeoutException {
Address addr=Util.createRandomAddress();
AckCollector coll=new AckCollector(addr);
coll.ack(addr);
coll.waitForAllAcks(1000);
}
public void testSuspect() {
final AckCollector ac=new AckCollector(list);
Stream.of(one, four,five).forEach(ac::ack);
System.out.println("ac = " + ac);
Arrays.asList(two, three).forEach(ac::suspect);
System.out.println("ac = " + ac);
assert ac.size() == 0;
assert ac.waitForAllAcks();
}
public void testRetainAll() throws TimeoutException {
final AckCollector ac=new AckCollector(list);
List<Address> members=Arrays.asList(one, two, three);
ac.retainAll(members);
System.out.println("ac=" + ac);
assert ac.size() == 3;
new Thread(() -> {
Util.sleep(1000);
ac.suspect(two);
Util.sleep(500);
ac.ack(three); ac.ack(one);
}).start();
boolean received_all=ac.waitForAllAcks(30000);
System.out.println("ac = " + ac);
assert received_all;
}
public void testRetainAll2() throws TimeoutException {
final AckCollector ac=new AckCollector(list);
assert ac.size() == 5;
System.out.println("ac = " + ac);
ac.ack(five);
ac.suspect(four);
System.out.println("ac = " + ac);
new Thread(() -> {
Util.sleep(1000);
ac.retainAll(Collections.singletonList(five));
System.out.println("ac=" + ac);
}).start();
boolean received_all=ac.waitForAllAcks(30000);
System.out.println("ac = " + ac);
assert received_all;
}
}