package lsr.paxos.storage; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import lsr.paxos.storage.ConsensusInstance.LogEntryState; import org.junit.Test; public class SynchronousLogTest { @Test public void testAppend() throws IOException { DiscWriter writer = mock(DiscWriter.class); SynchronousLog log = new SynchronousLog(writer); int view = 1; byte[] value = new byte[] {1, 2, 3}; ConsensusInstance instance = log.append(view, value); verify(writer).changeInstanceValue(0, view, value); assertTrue(instance instanceof SynchronousConsensusInstace); } @Test public void testCreatesSynchronousConsensusInstance() throws IOException { DiscWriter writer = mock(DiscWriter.class); SynchronousLog log = new SynchronousLog(writer); ConsensusInstance instance = log.getInstance(0); assertTrue(instance instanceof SynchronousConsensusInstace); } @Test public void testInitialInstances() throws IOException { ConsensusInstance instance1 = new ConsensusInstance(1, LogEntryState.KNOWN, 1, new byte[] {1}); ConsensusInstance instance2 = new ConsensusInstance(2, LogEntryState.KNOWN, 1, new byte[] {1}); Collection<ConsensusInstance> instances = new ArrayList<ConsensusInstance>(); instances.add(instance1); instances.add(instance2); DiscWriter writer = mock(DiscWriter.class); when(writer.load()).thenReturn(instances); SynchronousLog log = new SynchronousLog(writer); areEquals(log.getInstance(1), instance1); areEquals(log.getInstance(2), instance2); assertTrue(log.getInstance(1) instanceof SynchronousConsensusInstace); assertTrue(log.getInstance(2) instanceof SynchronousConsensusInstace); } @Test public void testNotSortedInitialInstances() throws IOException { ConsensusInstance instance1 = new ConsensusInstance(1, LogEntryState.KNOWN, 1, new byte[] {1}); ConsensusInstance instance2 = new ConsensusInstance(2, LogEntryState.KNOWN, 1, new byte[] {1}); Collection<ConsensusInstance> instances = new ArrayList<ConsensusInstance>(); instances.add(instance2); instances.add(instance1); DiscWriter writer = mock(DiscWriter.class); when(writer.load()).thenReturn(instances); SynchronousLog log = new SynchronousLog(writer); areEquals(log.getInstance(1), instance1); areEquals(log.getInstance(2), instance2); assertTrue(log.getInstance(1) instanceof SynchronousConsensusInstace); assertTrue(log.getInstance(2) instanceof SynchronousConsensusInstace); } private void areEquals(ConsensusInstance actual, ConsensusInstance expected) { assertEquals(actual.getId(), expected.getId()); assertEquals(actual.getState(), expected.getState()); assertEquals(actual.getView(), expected.getView()); assertEquals(actual.getValue(), expected.getValue()); } }