package com.lambdaworks.redis.resource;
import static com.google.code.tempusfugit.temporal.Duration.seconds;
import static com.google.code.tempusfugit.temporal.Timeout.timeout;
import static org.assertj.core.api.Assertions.assertThat;
import org.junit.Test;
import com.google.code.tempusfugit.temporal.Condition;
import com.google.code.tempusfugit.temporal.WaitFor;
import io.netty.util.concurrent.DefaultPromise;
import io.netty.util.concurrent.GlobalEventExecutor;
import io.netty.util.concurrent.ImmediateEventExecutor;
import io.netty.util.concurrent.Promise;
/**
* @author Mark Paluch
*/
public class FuturesTest {
@Test(expected = IllegalArgumentException.class)
public void testPromise() throws Exception {
new Futures.PromiseAggregator(null);
}
@Test(expected = IllegalStateException.class)
public void notArmed() throws Exception {
Futures.PromiseAggregator<Boolean, Promise<Boolean>> sut = new Futures.PromiseAggregator<Boolean, Promise<Boolean>>(
new DefaultPromise<Boolean>(ImmediateEventExecutor.INSTANCE));
sut.add(new DefaultPromise<Boolean>(ImmediateEventExecutor.INSTANCE));
}
@Test(expected = IllegalStateException.class)
public void expectAfterArmed() throws Exception {
Futures.PromiseAggregator<Boolean, Promise<Boolean>> sut = new Futures.PromiseAggregator<Boolean, Promise<Boolean>>(
new DefaultPromise<Boolean>(ImmediateEventExecutor.INSTANCE));
sut.arm();
sut.expectMore(1);
}
@Test(expected = IllegalStateException.class)
public void armTwice() throws Exception {
Futures.PromiseAggregator<Boolean, Promise<Boolean>> sut = new Futures.PromiseAggregator<Boolean, Promise<Boolean>>(
new DefaultPromise<Boolean>(ImmediateEventExecutor.INSTANCE));
sut.arm();
sut.arm();
}
@Test
public void regularUse() throws Exception {
final DefaultPromise<Boolean> target = new DefaultPromise<Boolean>(GlobalEventExecutor.INSTANCE);
Futures.PromiseAggregator<Boolean, Promise<Boolean>> sut = new Futures.PromiseAggregator<Boolean, Promise<Boolean>>(
target);
sut.expectMore(1);
sut.arm();
DefaultPromise<Boolean> part = new DefaultPromise<Boolean>(GlobalEventExecutor.INSTANCE);
sut.add(part);
assertThat(target.isDone()).isFalse();
part.setSuccess(true);
WaitFor.waitOrTimeout(new Condition() {
@Override
public boolean isSatisfied() {
return target.isDone();
}
}, timeout(seconds(5)));
assertThat(target.isDone()).isTrue();
}
}