package lsr.paxos.storage;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import junit.framework.Assert;
import lsr.paxos.storage.ConsensusInstance.LogEntryState;
import org.junit.Test;
public class ConsensusInstanceTest {
private int instanceId = 3;
private int view = 4;
private LogEntryState state = LogEntryState.DECIDED;
private byte[] value = new byte[] {12, 78, 90, 5, 4};
@Test
public void shouldCreateInstance() {
ConsensusInstance instance = new ConsensusInstance(instanceId, state, view, value);
assertEquals(instanceId, instance.getId());
assertEquals(state, instance.getState());
assertEquals(view, instance.getView());
assertEquals(value, instance.getValue());
}
@Test
public void shouldCreateEmptyInstance() {
ConsensusInstance instance = new ConsensusInstance(instanceId);
assertEquals(instanceId, instance.getId());
assertEquals(LogEntryState.UNKNOWN, instance.getState());
assertEquals(-1, instance.getView());
assertEquals(null, instance.getValue());
}
@Test
public void testEqual() {
ConsensusInstance instance = new ConsensusInstance(instanceId, state, view, value);
ConsensusInstance equal = new ConsensusInstance(instanceId, state, view, value);
ConsensusInstance differentId = new ConsensusInstance(5, state, view, value);
ConsensusInstance differentView = new ConsensusInstance(instanceId, state, 5, value);
ConsensusInstance differentValue = new ConsensusInstance(instanceId, state, view, null);
ConsensusInstance differentState = new ConsensusInstance(instanceId, LogEntryState.KNOWN,
view, value);
assertFalse(instance.equals(new Object()));
assertFalse(instance.equals(differentId));
assertFalse(instance.equals(differentState));
assertFalse(instance.equals(differentView));
assertFalse(instance.equals(differentValue));
assertTrue(instance.equals(equal));
}
@Test
public void shouldSerializeAndDeserialize() throws IOException {
serializeAndDeserialize(5, LogEntryState.UNKNOWN, 9, null);
serializeAndDeserialize(5, LogEntryState.KNOWN, 9, new byte[] {1, 2, 3, 4});
serializeAndDeserialize(5, LogEntryState.DECIDED, 9, new byte[] {1, 2, 3, 4});
}
@Test
public void unknownInstanceWithValueShouldThrowException() {
try {
new ConsensusInstance(5, LogEntryState.UNKNOWN, 9, new byte[] {1, 2, 3, 4});
} catch (RuntimeException e) {
return;
}
Assert.fail();
}
private void serializeAndDeserialize(int id, LogEntryState state, int view, byte[] value)
throws IOException {
ConsensusInstance instance = new ConsensusInstance(id, state, view, value);
// Serialize using write and toByteArray methods.
ByteBuffer buffer = ByteBuffer.allocate(instance.byteSize());
instance.write(buffer);
byte[] bytes = instance.toByteArray();
assertEquals(0, buffer.remaining());
assertArrayEquals(buffer.array(), bytes);
assertEquals(bytes.length, instance.byteSize());
// Deserialize consensus instance.
DataInputStream stream = new DataInputStream(new ByteArrayInputStream(bytes));
ConsensusInstance deserializedInstance = new ConsensusInstance(stream);
assertEquals(instance, deserializedInstance);
assertEquals(0, stream.available());
}
}