package org.springside.modules.utils.concurrent;
import static org.assertj.core.api.Assertions.*;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import org.junit.Test;
import org.springside.modules.utils.base.ExceptionUtil;
public class BasicFutureTest {
public static class MyFuture<T> extends BasicFuture<T> {
@Override
protected void onCompleted(T result) {
System.out.println("onCompleted:" + result);
}
@Override
protected void onFailed(Exception ex) {
System.out.println("onFailed:" + ex.getMessage());
}
@Override
protected void onCancelled() {
System.out.println("onCancelled");
}
}
private static class Tasks {
public static void success(MyFuture<String> future) {
future.completed("haha");
}
public static void fail(MyFuture<String> future) {
future.failed(new RuntimeException("wuwu"));
}
public static void cancel(MyFuture<String> future) {
future.cancel(true);
}
}
@Test
public void test() throws InterruptedException, ExecutionException {
MyFuture<String> future = new MyFuture<String>();
Tasks.success(future);
String result = future.get();
assertThat(result).isEqualTo("haha");
// 无人设置返回值
try {
MyFuture<String> future2 = new MyFuture<String>();
future2.get(10, TimeUnit.MILLISECONDS);
fail("should fail before");
} catch (TimeoutException e) {
assertThat(e).isInstanceOf(TimeoutException.class);
}
// 失败
try {
MyFuture<String> future3 = new MyFuture<String>();
Tasks.fail(future3);
future3.get();
fail("should fail before");
} catch (Throwable t) {
assertThat(ExceptionUtil.unwrap(t)).hasMessage("wuwu");
}
// 取消
MyFuture<String> future4 = new MyFuture<String>();
Tasks.cancel(future4);
String result4 = future4.get();
assertThat(result4).isNull();
assertThat(future4.isCancelled()).isTrue();
}
}