package org.netbeans.gradle.project.tasks;
import org.jtrim.cancel.Cancellation;
import org.jtrim.cancel.CancellationSource;
import org.jtrim.cancel.CancellationToken;
import org.jtrim.concurrent.CancelableTask;
import org.jtrim.concurrent.CleanupTask;
import org.jtrim.concurrent.ManualTaskExecutor;
import org.junit.Test;
import org.mockito.InOrder;
import static org.mockito.Matchers.*;
import static org.mockito.Mockito.*;
public class PriorityAwareExecutorTest {
@Test
public void testWithoutCleanup() throws Exception {
ManualTaskExecutor wrapped = new ManualTaskExecutor(false);
PriorityAwareExecutor executor = new PriorityAwareExecutor(wrapped);
CancelableTask task1 = mock(CancelableTask.class);
CancelableTask task2 = mock(CancelableTask.class);
executor.getLowPriorityExecutor().execute(Cancellation.UNCANCELABLE_TOKEN, task2, null);
executor.getHighPriorityExecutor().execute(Cancellation.UNCANCELABLE_TOKEN, task1, null);
wrapped.executeCurrentlySubmitted();
InOrder inOrder = inOrder(task1, task2);
inOrder.verify(task1).execute(any(CancellationToken.class));
inOrder.verify(task2).execute(any(CancellationToken.class));
}
@Test
public void testWithCleanup() throws Exception {
ManualTaskExecutor wrapped = new ManualTaskExecutor(false);
PriorityAwareExecutor executor = new PriorityAwareExecutor(wrapped);
CancelableTask task1 = mock(CancelableTask.class);
CancelableTask task2 = mock(CancelableTask.class);
CleanupTask cleanup1 = mock(CleanupTask.class);
CleanupTask cleanup2 = mock(CleanupTask.class);
executor.getLowPriorityExecutor().execute(Cancellation.UNCANCELABLE_TOKEN, task2, cleanup2);
executor.getHighPriorityExecutor().execute(Cancellation.UNCANCELABLE_TOKEN, task1, cleanup1);
wrapped.executeCurrentlySubmitted();
InOrder inOrder = inOrder(task1, task2, cleanup1, cleanup2);
inOrder.verify(task1).execute(any(CancellationToken.class));
inOrder.verify(cleanup1).cleanup(eq(false), isNull(Throwable.class));
inOrder.verify(task2).execute(any(CancellationToken.class));
inOrder.verify(cleanup2).cleanup(eq(false), isNull(Throwable.class));
}
@Test
public void testCanceledWithoutCleanup() throws Exception {
ManualTaskExecutor wrapped = new ManualTaskExecutor(false);
PriorityAwareExecutor executor = new PriorityAwareExecutor(wrapped);
CancelableTask task1 = mock(CancelableTask.class);
CancelableTask task2 = mock(CancelableTask.class);
CancellationSource cancel1 = Cancellation.createCancellationSource();
executor.getLowPriorityExecutor().execute(Cancellation.UNCANCELABLE_TOKEN, task2, null);
executor.getHighPriorityExecutor().execute(cancel1.getToken(), task1, null);
cancel1.getController().cancel();
wrapped.executeCurrentlySubmitted();
verifyZeroInteractions(task1);
verify(task2).execute(any(CancellationToken.class));
}
@Test
public void testCanceledWithCleanup() throws Exception {
ManualTaskExecutor wrapped = new ManualTaskExecutor(false);
PriorityAwareExecutor executor = new PriorityAwareExecutor(wrapped);
CancelableTask task1 = mock(CancelableTask.class);
CancelableTask task2 = mock(CancelableTask.class);
CleanupTask cleanup1 = mock(CleanupTask.class);
CleanupTask cleanup2 = mock(CleanupTask.class);
CancellationSource cancel1 = Cancellation.createCancellationSource();
executor.getLowPriorityExecutor().execute(Cancellation.UNCANCELABLE_TOKEN, task2, cleanup2);
executor.getHighPriorityExecutor().execute(cancel1.getToken(), task1, cleanup1);
cancel1.getController().cancel();
wrapped.executeCurrentlySubmitted();
InOrder inOrder = inOrder(task2, cleanup1, cleanup2);
verifyZeroInteractions(task1);
inOrder.verify(cleanup1).cleanup(eq(true), isNull(Throwable.class));
inOrder.verify(task2).execute(any(CancellationToken.class));
inOrder.verify(cleanup2).cleanup(eq(false), isNull(Throwable.class));
}
}