package lsr.paxos.storage; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import lsr.paxos.storage.ConsensusInstance.LogEntryState; import org.junit.Before; import org.junit.Test; public class SynchronousConsensusInstanceTest { private DiscWriter writer; private SynchronousConsensusInstace instance; private int view; private byte[] values; @Before public void setUp() { writer = mock(DiscWriter.class); instance = new SynchronousConsensusInstace(2, writer); view = 1; values = new byte[] {1, 2, 3}; } @Test public void shouldInitializeFromConsensusInstance() { ConsensusInstance consensusInstance = new ConsensusInstance(1, LogEntryState.KNOWN, 3, values); instance = new SynchronousConsensusInstace(consensusInstance, writer); assertEquals(1, instance.getId()); assertEquals(LogEntryState.KNOWN, instance.getState()); assertEquals(3, instance.getView()); assertArrayEquals(values, instance.getValue()); } @Test public void shouldInitialize() { instance = new SynchronousConsensusInstace(1, LogEntryState.KNOWN, 3, values, writer); assertEquals(1, instance.getId()); assertEquals(LogEntryState.KNOWN, instance.getState()); assertEquals(3, instance.getView()); assertArrayEquals(values, instance.getValue()); } @Test public void shouldChangeValueOnEmptyInstance() { instance.setValue(view, values); verify(writer).changeInstanceValue(2, view, values); } @Test public void shouldChangeViewOnEmptyInstance() { instance.setView(view); verify(writer).changeInstanceView(2, view); } @Test public void shouldNotWriteToDiscWhenSettingTheSameViewTwice() { instance.setView(view); instance.setView(view); verify(writer, times(1)).changeInstanceView(2, view); } @Test public void shouldWriteJustViewAfterSetingTheSameValueTwice() { instance.setValue(view, values); instance.setValue(view + 1, values); verify(writer, times(1)).changeInstanceValue(2, view, values); verify(writer, times(1)).changeInstanceView(2, view + 1); } @Test public void shouldWriteTheValue() { instance = new SynchronousConsensusInstace(1, LogEntryState.KNOWN, 3, null, writer); instance.setValue(3, values); verify(writer, times(1)).changeInstanceValue(1, 3, values); } @Test public void shouldWriteDecided() { instance.setValue(view, values); instance.setDecided(); verify(writer).decideInstance(2); assertEquals(LogEntryState.DECIDED, instance.getState()); } @Test public void shouldSetValueToUnknown() { instance.setValue(view, values); instance.setValue(view + 1, null); assertEquals(LogEntryState.UNKNOWN, instance.getState()); } @Test(expected = RuntimeException.class) public void shouldThrowExceptionAfterSettingValueWithOldView() { instance.setValue(5, new byte[] {1, 2, 3}); instance.setValue(3, new byte[] {1, 2, 3}); } }