package org.multiverse.commitbarriers; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; public class CountDownCommitBarrier_registerOnAbortTaskTest { @Before public void setUp() { clearThreadLocalTxn(); } @Test public void whenNullTask_thenNullPointerException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); try { barrier.registerOnAbortTask(null); fail(); } catch (NullPointerException expected) { } assertTrue(barrier.isClosed()); } @Test public void whenAborted_thenTaskExecuted() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); Runnable task = mock(Runnable.class); barrier.registerOnAbortTask(task); barrier.abort(); verify(task, times(1)).run(); } @Test public void whenCommitted_thenTaskNotExecuted() throws InterruptedException { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); Runnable task = mock(Runnable.class); barrier.registerOnAbortTask(task); barrier.countDown(); verify(task, never()).run(); } @Test public void whenTaskThrowsRuntimeException_thenOtherTasksNotExecuted() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); Runnable task1 = mock(Runnable.class); doThrow(new FakeException()).when(task1).run(); Runnable task2 = mock(Runnable.class); barrier.registerOnAbortTask(task1); barrier.registerOnAbortTask(task2); try { barrier.abort(); fail(); } catch (FakeException expected) { } verify(task2, never()).run(); } static class FakeException extends RuntimeException { } @Test public void whenCommitted_thenCommitBarrierOpenException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(0); Runnable task = mock(Runnable.class); try { barrier.registerOnAbortTask(task); fail(); } catch (CommitBarrierOpenException expected) { } assertTrue(barrier.isCommitted()); verify(task, never()).run(); } @Test public void whenAborted_thenCommitBarrierOpenException() { CountDownCommitBarrier barrier = new CountDownCommitBarrier(1); barrier.abort(); Runnable task = mock(Runnable.class); try { barrier.registerOnAbortTask(task); fail(); } catch (CommitBarrierOpenException expected) { } assertTrue(barrier.isAborted()); verify(task, never()).run(); } }