package org.robotninjas.barge.state;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists;
import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.SettableFuture;
import org.junit.Test;
import javax.annotation.Nullable;
import java.util.List;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertTrue;
import static org.robotninjas.barge.state.MajorityCollector.majorityResponse;
import static org.robotninjas.barge.state.MajorityCollectorTest.BooleanIdentity.Identity;
public class MajorityCollectorTest {
@Test
public void testAllFailed() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFailedFuture(new Exception())
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testMajorityFailed() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testMajorityCompletedSuccess() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertTrue(Futures.getUnchecked(collector));
}
@Test
public void testMajorityCompletedFailed() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testMajorityNotSuccess() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testMajoritySuccess() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertTrue(Futures.getUnchecked(collector));
}
@Test
public void testAllSuccess() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertTrue(Futures.getUnchecked(collector));
}
@Test
public void testAllNotSuccess() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testBareMajorityTrueAllCompleted() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertTrue(Futures.getUnchecked(collector));
}
@Test
public void testBareMajorityFalseAllCompleted() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.FALSE),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testBareMajorityTrueOthersFailed() {
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFailedFuture(new Exception()),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE),
Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
assertTrue(Futures.getUnchecked(collector));
}
@Test
public void testFireOnceMajoritySuccess() {
SettableFuture<Boolean> f1 = SettableFuture.create();
SettableFuture<Boolean> f2 = SettableFuture.create();
SettableFuture<Boolean> f3 = SettableFuture.create();
List<SettableFuture<Boolean>> responses = Lists.newArrayList(
f1, f2, f3
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
f1.set(Boolean.TRUE);
assertFalse(collector.isDone());
f2.set(Boolean.TRUE);
assertTrue(collector.isDone());
assertTrue(Futures.getUnchecked(collector));
}
@Test
public void testFireOnceMajorityFailed1() {
SettableFuture<Boolean> f1 = SettableFuture.create();
SettableFuture<Boolean> f2 = SettableFuture.create();
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
f1, f2, Futures.<Boolean>immediateFuture(Boolean.TRUE)
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
f1.setException(new Exception());
assertFalse(collector.isDone());
f2.setException(new Exception());
assertTrue(collector.isDone());
assertFalse(Futures.getUnchecked(collector));
}
@Test
public void testFireOnceMajorityFailed() {
SettableFuture<Boolean> f1 = SettableFuture.create();
SettableFuture<Boolean> f2 = SettableFuture.create();
SettableFuture<Boolean> f3 = SettableFuture.create();
ListenableFuture<Boolean> f4 = Futures.immediateFuture(Boolean.TRUE);
List<ListenableFuture<Boolean>> responses = Lists.newArrayList(
f1, f2, f3, f4
);
ListenableFuture<Boolean> collector = majorityResponse(responses, Identity);
f1.setException(new Exception());
assertFalse(collector.isDone());
f3.set(Boolean.TRUE);
assertFalse(collector.isDone());
f2.setException(new Exception());
assertTrue(collector.isDone());
assertFalse(Futures.getUnchecked(collector));
}
static enum BooleanIdentity implements Predicate<Boolean> {
Identity;
@Override
public boolean apply(@Nullable Boolean input) {
return input;
}
}
}