package lsr.paxos;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lsr.common.Reply;
import lsr.common.RequestId;
import org.junit.Before;
import org.junit.Test;
public class SnapshotTest {
private Snapshot snapshot;
@Before
public void setUp() {
snapshot = new Snapshot();
}
@Test
public void shouldSetAndGetNextInstanceId() {
assertEquals(0, snapshot.getNextInstanceId());
snapshot.setNextInstanceId(5);
assertEquals(5, snapshot.getNextInstanceId());
}
@Test
public void shouldSetAndGetValue() {
assertEquals(null, snapshot.getValue());
byte[] value = new byte[] {1, 2, 4, 3};
snapshot.setValue(value);
assertEquals(value, snapshot.getValue());
}
@Test
public void shouldSetAndGetLastReplyForClient() {
assertEquals(null, snapshot.getLastReplyForClient());
Map<Long, Reply> lastReplyForClient = new HashMap<Long, Reply>();
snapshot.setLastReplyForClient(lastReplyForClient);
assertEquals(lastReplyForClient, snapshot.getLastReplyForClient());
}
@Test
public void shouldSetAndGetNextRequestSeqNo() {
assertEquals(0, snapshot.getNextRequestSeqNo());
snapshot.setNextRequestSeqNo(5);
assertEquals(5, snapshot.getNextRequestSeqNo());
}
@Test
public void shoudlSetAndGetStartingRequestSeqNo() {
assertEquals(0, snapshot.getStartingRequestSeqNo());
snapshot.setStartingRequestSeqNo(5);
assertEquals(5, snapshot.getStartingRequestSeqNo());
}
@Test
public void shouldSetAndGetPartialResponseCache() {
assertEquals(null, snapshot.getPartialResponseCache());
List<Reply> partialResponseCache = new ArrayList<Reply>();
snapshot.setPartialResponseCache(partialResponseCache);
assertEquals(partialResponseCache, snapshot.getPartialResponseCache());
}
@Test
public void shouldSerializeAndDeserialize() throws IOException {
Snapshot snapshot = new Snapshot();
snapshot.setNextInstanceId(1);
snapshot.setValue(new byte[] {1, 2, 3});
snapshot.setLastReplyForClient(generateLastReplyForClient());
snapshot.setNextRequestSeqNo(2);
snapshot.setStartingRequestSeqNo(3);
snapshot.setPartialResponseCache(generatePartialResponseCache());
byte[] serializedUsingStream = serializeUsingStream(snapshot);
assertEquals(serializedUsingStream.length, snapshot.byteSize());
ByteBuffer buffer = ByteBuffer.allocate(snapshot.byteSize());
snapshot.writeTo(buffer);
assertFalse(buffer.hasRemaining());
assertArrayEquals(serializedUsingStream, buffer.array());
ByteArrayInputStream bais = new ByteArrayInputStream(serializedUsingStream);
Snapshot deserialized = new Snapshot(new DataInputStream(bais));
assertEquals(snapshot.getNextInstanceId(), deserialized.getNextInstanceId());
assertArrayEquals(snapshot.getValue(), deserialized.getValue());
assertEquals(snapshot.getNextRequestSeqNo(), deserialized.getNextRequestSeqNo());
assertEquals(snapshot.getStartingRequestSeqNo(), deserialized.getStartingRequestSeqNo());
assertEquals(snapshot.getLastReplyForClient().size(),
deserialized.getLastReplyForClient().size());
assertEquals(snapshot.getPartialResponseCache().size(),
deserialized.getPartialResponseCache().size());
}
@Test
public void shouldCompareToAnotherSnapshot() {
Snapshot smaller = new Snapshot();
Snapshot bigger = new Snapshot();
smaller.setNextInstanceId(5);
bigger.setNextInstanceId(10);
assertEquals(-1, smaller.compareTo(bigger));
assertEquals(1, bigger.compareTo(smaller));
smaller.setNextInstanceId(5);
smaller.setNextRequestSeqNo(3);
bigger.setNextInstanceId(5);
bigger.setNextRequestSeqNo(4);
assertEquals(-1, smaller.compareTo(bigger));
assertEquals(0, smaller.compareTo(smaller));
assertEquals(0, bigger.compareTo(bigger));
assertEquals(1, bigger.compareTo(smaller));
}
private HashMap<Long, Reply> generateLastReplyForClient() {
HashMap<Long, Reply> lastReplyForClient = new HashMap<Long, Reply>();
lastReplyForClient.put((long) 5, new Reply(new RequestId(1, 1), new byte[] {4, 3, 2, 1}));
lastReplyForClient.put((long) 6, new Reply(new RequestId(2, 2), new byte[] {4, 3, 2, 1}));
return lastReplyForClient;
}
private List<Reply> generatePartialResponseCache() {
List<Reply> partialResponseCache = new ArrayList<Reply>();
partialResponseCache.add(new Reply(new RequestId(3, 3), new byte[] {5, 4, 3, 2, 1}));
partialResponseCache.add(new Reply(new RequestId(4, 4), new byte[] {1, 2, 3, 4, 5}));
return partialResponseCache;
}
private byte[] serializeUsingStream(Snapshot snapshot) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream snapshotStream = new DataOutputStream(baos);
snapshot.writeTo(snapshotStream);
return baos.toByteArray();
}
}