/*******************************************************************************
* Copyright (c) 2016 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.utilbox.concurrency;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import java.util.concurrent.CancellationException;
import java.util.concurrent.Future;
import org.junit.Test;
import melnorme.utilbox.concurrency.ExecutorTaskAgent_Test.Tests_ExecutorTaskAgent;
import melnorme.utilbox.concurrency.Futures_Tests.InvalidRunnable;
import melnorme.utilbox.concurrency.Futures_Tests.InterruptibleEndlessRunnable;
import melnorme.utilbox.tests.CommonTest;
public class ThreadPoolExecutorExt_Test extends CommonTest {
@Test
public void test() throws Exception { test$(); }
public void test$() {
testShutdownAndCancelAll();
testShutdownAndCancelAll2();
}
protected void testShutdownAndCancelAll() {
try(Tests_ExecutorTaskAgent executor = new Tests_ExecutorTaskAgent(getClass().getSimpleName())) {
LatchRunnable2 executingRunnable = new InterruptibleEndlessRunnable();
executor.execute(executingRunnable); // Initial task
Future<?> futureTask = executor.submit(new InvalidRunnable());
MonitorRunnableFuture<Void> monitorFutureTask = monitorRunnableFuture(new InvalidRunnable());
executor.submitTask(monitorFutureTask);
IRunnableFuture2<Object> runnableFuture = IRunnableFuture2.toFuture(() -> {
throw assertFail();
});
executor.submitTask(runnableFuture);
executingRunnable.awaitEntry();
executor.shutdownNowAndCancelAll();
// Test that tasks were cancelled by the executor
assertTrue(futureTask.isCancelled());
verifyThrows(() -> futureTask.get(), CancellationException.class);
assertTrue(monitorFutureTask.isCancelled());
verifyThrows(() -> monitorFutureTask.awaitResult2(), OperationCancellation.class);
}
}
protected void testShutdownAndCancelAll2() {
try(Tests_ExecutorTaskAgent executor = new Tests_ExecutorTaskAgent(getClass().getSimpleName())) {
InterruptibleEndlessRunnable latchRunnable = new InterruptibleEndlessRunnable();
// Initial task
MonitorRunnableFuture<Void> monitorFutureTask = monitorRunnableFuture(latchRunnable);
executor.submitTask(monitorFutureTask);
latchRunnable.awaitEntry();
executor.shutdownNowAndCancelAll();
// Test that tasks were cancelled by the executor
verifyThrows(() -> monitorFutureTask.awaitResult2(), null);
// Ensure executing runnable was interrupted and continued
latchRunnable.awaitExit();
assertTrue(latchRunnable.interrupted);
}
}
public static MonitorRunnableFuture<Void> monitorRunnableFuture(Runnable runnable) {
assertNotNull(runnable);
return new MonitorRunnableFuture<Void>() {
@Override
protected Void internalInvoke() {
runnable.run();
return null;
}
};
}
}