package org.multiverse.stms.gamma; import org.junit.Before; import org.junit.Test; import org.multiverse.api.Txn; import org.multiverse.api.callables.TxnVoidCallable; import org.multiverse.api.exceptions.TxnMandatoryException; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; import static org.multiverse.api.StmUtils.*; import static org.multiverse.api.TxnThreadLocal.clearThreadLocalTxn; public class StmUtilsTest { private GammaStm stm; @Before public void setUp() { clearThreadLocalTxn(); stm = new GammaStm(); } @Test public void whenScheduleDeferredTaskAndNoTransactionAvailable() { Runnable task = mock(Runnable.class); try { scheduleDeferredTask(task); fail(); } catch (TxnMandatoryException expected) { } verifyZeroInteractions(task); } @Test(expected = NullPointerException.class) public void whenScheduleDeferredNullTask_thenNullPointerException() { scheduleDeferredTask(null); } @Test public void whenScheduleDeferredTaskAndCommit_thenCalled() { final Runnable task = mock(Runnable.class); stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { scheduleDeferredTask(task); } }); verify(task).run(); } @Test public void whenScheduleDeferredTaskAndAborted_thenNotCalled() { final Runnable task = mock(Runnable.class); try { stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { scheduleDeferredTask(task); throw new NonsenseException(); } }); fail(); } catch (NonsenseException expected) { } verifyZeroInteractions(task); } class NonsenseException extends RuntimeException { } @Test public void whenScheduleCompensatingTaskAndNoTransactionAvailable_thenNoTransactionFoundException() { Runnable task = mock(Runnable.class); try { scheduleCompensatingTask(task); fail(); } catch (TxnMandatoryException expected) { } verifyZeroInteractions(task); } @Test(expected = NullPointerException.class) public void whenScheduleCompensatingNullTask_thenNullPointerException() { scheduleCompensatingTask(null); } @Test public void whenScheduleCompensatingTaskAndCommit_thenCalled() { final Runnable task = mock(Runnable.class); try { stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { scheduleCompensatingTask(task); throw new NonsenseException(); } }); fail(); } catch (NonsenseException expected) { } verify(task).run(); } @Test public void whenScheduleCompensatingTaskAndAborted_thenNotCalled() { final Runnable task = mock(Runnable.class); stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { scheduleCompensatingTask(task); } }); verifyZeroInteractions(task); } @Test public void whenScheduleCompensatingOrDeferredTaskAndNoTransactionAvailable_thenNoTransactionFoundException() { Runnable task = mock(Runnable.class); try { scheduleCompensatingOrDeferredTask(task); fail(); } catch (TxnMandatoryException expected) { } verifyZeroInteractions(task); } @Test(expected = NullPointerException.class) public void whenScheduleCompensatingOrDeferredNullTask_thenNullPointerException() { scheduleCompensatingOrDeferredTask(null); } @Test public void whenScheduleCompensatingOrDeferredTaskAndCommit_thenCalled() { final Runnable task = mock(Runnable.class); try { stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { scheduleCompensatingOrDeferredTask(task); throw new NonsenseException(); } }); fail(); } catch (NonsenseException expected) { } verify(task).run(); } @Test public void whenScheduleCompensatingOrDeferredTaskAndAborted_thenCalled() { final Runnable task = mock(Runnable.class); stm.getDefaultTxnExecutor().execute(new TxnVoidCallable() { @Override public void call(Txn tx) throws Exception { scheduleCompensatingOrDeferredTask(task); } }); verify(task).run(); } }