package io.airlift.concurrent;
import org.testng.annotations.Test;
import java.util.concurrent.CancellationException;
import java.util.concurrent.ExecutionException;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertThrows;
import static org.testng.Assert.assertTrue;
public class TestExtendedSettableFuture
{
@Test
public void testSet()
throws Exception
{
ExtendedSettableFuture<String> future = ExtendedSettableFuture.create();
future.set("abc");
assertTrue(future.isDone());
assertFalse(future.isCancelled());
assertFalse(future.checkWasInterrupted());
assertEquals(future.get(), "abc");
}
@Test
public void testSetException()
throws Exception
{
ExtendedSettableFuture<String> future = ExtendedSettableFuture.create();
future.setException(new Exception(""));
assertTrue(future.isDone());
assertFalse(future.isCancelled());
assertFalse(future.checkWasInterrupted());
assertThrows(ExecutionException.class, future::get);
}
@Test
public void testCancelWithoutInterrupt()
throws Exception
{
ExtendedSettableFuture<String> future = ExtendedSettableFuture.create();
future.cancel(false);
assertTrue(future.isDone());
assertTrue(future.isCancelled());
assertFalse(future.checkWasInterrupted());
assertThrows(CancellationException.class, future::get);
}
@Test
public void testCancelWithInterrupt()
throws Exception
{
ExtendedSettableFuture<String> future = ExtendedSettableFuture.create();
future.cancel(true);
assertTrue(future.isDone());
assertTrue(future.isCancelled());
assertTrue(future.checkWasInterrupted());
assertThrows(CancellationException.class, future::get);
}
@Test
public void testSetAsync()
throws Exception
{
// Test return value
ExtendedSettableFuture<String> fromFuture = ExtendedSettableFuture.create();
ExtendedSettableFuture<String> toFuture = ExtendedSettableFuture.create();
toFuture.setAsync(fromFuture);
fromFuture.set("abc");
assertEquals(toFuture.get(), "abc");
// Test exception
fromFuture = ExtendedSettableFuture.create();
toFuture = ExtendedSettableFuture.create();
toFuture.setAsync(fromFuture);
fromFuture.setException(new RuntimeException());
assertThrows(ExecutionException.class, toFuture::get);
// Test cancellation without interrupt
fromFuture = ExtendedSettableFuture.create();
toFuture = ExtendedSettableFuture.create();
toFuture.setAsync(fromFuture);
toFuture.cancel(false);
// Parent Future should receive the cancellation
assertTrue(fromFuture.isCancelled());
assertFalse(fromFuture.checkWasInterrupted());
// Test cancellation with interrupt
fromFuture = ExtendedSettableFuture.create();
toFuture = ExtendedSettableFuture.create();
toFuture.setAsync(fromFuture);
toFuture.cancel(true);
// Parent Future should receive the cancellation
assertTrue(fromFuture.isCancelled());
assertTrue(fromFuture.checkWasInterrupted());
}
}