summaryrefslogtreecommitdiff
path: root/src/test/java/protocols/implementations/VSRaftProtocolTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/protocols/implementations/VSRaftProtocolTest.java')
-rw-r--r--src/test/java/protocols/implementations/VSRaftProtocolTest.java82
1 files changed, 74 insertions, 8 deletions
diff --git a/src/test/java/protocols/implementations/VSRaftProtocolTest.java b/src/test/java/protocols/implementations/VSRaftProtocolTest.java
index 5f0fced..380aaae 100644
--- a/src/test/java/protocols/implementations/VSRaftProtocolTest.java
+++ b/src/test/java/protocols/implementations/VSRaftProtocolTest.java
@@ -265,10 +265,11 @@ class VSRaftProtocolTest {
}
@Test
- void testClientReceiveVoteRequestGrantsEligibleCandidate() throws Exception {
+ void testServerReceiveVoteRequestGrantsEligibleCandidate() throws Exception {
protocol.currentContextIsServer(false);
protocol.onClientInit();
clearInvocations(mockProcess, mockTaskManager);
+ protocol.currentContextIsServer(true);
when(mockProcess.getTime()).thenReturn(200L, 200L);
VSMessage voteRequest = new VSMessage();
@@ -280,7 +281,7 @@ class VSRaftProtocolTest {
ArgumentCaptor.forClass(VSMessage.class);
ArgumentCaptor<VSTask> taskCaptor = ArgumentCaptor.forClass(VSTask.class);
- protocol.onClientRecv(voteRequest);
+ protocol.onServerRecv(voteRequest);
verify(mockProcess).sendMessage(messageCaptor.capture());
verify(mockTaskManager, times(2)).removeAllTasks(any());
@@ -300,11 +301,11 @@ class VSRaftProtocolTest {
}
@Test
- void testClientReceiveVoteRequestDeniesWhenAlreadyVotedForOtherCandidate()
+ void testServerReceiveVoteRequestDeniesWhenAlreadyVotedForOtherCandidate()
throws Exception {
setIntField("currentTerm", 3);
setIntField("votedFor", 9);
- protocol.currentContextIsServer(false);
+ protocol.currentContextIsServer(true);
VSMessage voteRequest = new VSMessage();
voteRequest.setString("type", "voteRequest");
@@ -314,7 +315,7 @@ class VSRaftProtocolTest {
ArgumentCaptor<VSMessage> messageCaptor =
ArgumentCaptor.forClass(VSMessage.class);
- protocol.onClientRecv(voteRequest);
+ protocol.onServerRecv(voteRequest);
verify(mockProcess).sendMessage(messageCaptor.capture());
verify(mockTaskManager, never()).removeAllTasks(any());
@@ -329,6 +330,44 @@ class VSRaftProtocolTest {
}
@Test
+ void testServerReceiveHigherTermVoteRequestResetsVoteAndGrants()
+ throws Exception {
+ setIntField("currentTerm", 3);
+ setIntField("votedFor", 9);
+ setBooleanField("isCandidate", true);
+ protocol.currentContextIsServer(false);
+ protocol.onClientInit();
+ clearInvocations(mockProcess, mockTaskManager);
+ protocol.currentContextIsServer(true);
+ when(mockProcess.getTime()).thenReturn(250L, 250L);
+
+ VSMessage voteRequest = new VSMessage();
+ voteRequest.setString("type", "voteRequest");
+ voteRequest.setInteger("term", 4);
+ voteRequest.setInteger("candidateId", 11);
+
+ ArgumentCaptor<VSMessage> messageCaptor =
+ ArgumentCaptor.forClass(VSMessage.class);
+ ArgumentCaptor<VSTask> taskCaptor = ArgumentCaptor.forClass(VSTask.class);
+
+ protocol.onServerRecv(voteRequest);
+
+ verify(mockProcess).sendMessage(messageCaptor.capture());
+ verify(mockTaskManager, times(2)).removeAllTasks(any());
+ verify(mockTaskManager).addTask(taskCaptor.capture());
+
+ VSMessage voteResponse = messageCaptor.getValue();
+ assertEquals("voteResponse", voteResponse.getString("type"));
+ assertEquals(4, voteResponse.getInteger("term"));
+ assertTrue(voteResponse.getBoolean("voteGranted"));
+ assertEquals(4, getIntField("currentTerm"));
+ assertEquals(11, getIntField("votedFor"));
+ assertFalse(getBooleanField("isCandidate"));
+ assertFalse(getBooleanField("isLeader"));
+ assertEquals(4750L, taskCaptor.getValue().getTaskTime());
+ }
+
+ @Test
void testVoteResponseMajorityPromotesCandidateToLeader() throws Exception {
protocol.currentContextIsServer(false);
setIntField("currentTerm", 3);
@@ -347,7 +386,7 @@ class VSRaftProtocolTest {
ArgumentCaptor.forClass(VSMessage.class);
ArgumentCaptor<VSTask> taskCaptor = ArgumentCaptor.forClass(VSTask.class);
- protocol.onServerRecv(voteResponse);
+ protocol.onClientRecv(voteResponse);
verify(mockProcess).sendMessage(messageCaptor.capture());
verify(mockTaskManager).removeAllTasks(any());
@@ -378,7 +417,7 @@ class VSRaftProtocolTest {
voteResponse.setBoolean("voteGranted", true);
voteResponse.setInteger("targetPid", 99);
- protocol.onServerRecv(voteResponse);
+ protocol.onClientRecv(voteResponse);
verify(mockProcess, never()).sendMessage(any());
verify(mockTaskManager, never()).removeAllTasks(any());
@@ -407,7 +446,7 @@ class VSRaftProtocolTest {
ArgumentCaptor<VSTask> taskCaptor = ArgumentCaptor.forClass(VSTask.class);
- protocol.onServerRecv(voteResponse);
+ protocol.onClientRecv(voteResponse);
verify(mockProcess, never()).sendMessage(any());
verify(mockTaskManager, times(2)).removeAllTasks(any());
@@ -420,6 +459,33 @@ class VSRaftProtocolTest {
assertEquals(5000L, taskCaptor.getValue().getTaskTime());
}
+ @Test
+ void testDuplicateVoteResponsesFromSamePeerDoNotCreateMajority()
+ throws Exception {
+ protocol.currentContextIsServer(false);
+ when(mockCanvas.getNumProcesses()).thenReturn(5);
+ setIntField("currentTerm", 3);
+ setIntField("votesReceived", 1);
+ setBooleanField("isCandidate", true);
+
+ VSMessage voteResponse = new VSMessage();
+ voteResponse.setString("type", "voteResponse");
+ voteResponse.setInteger("term", 3);
+ voteResponse.setInteger("pid", 2);
+ voteResponse.setBoolean("voteGranted", true);
+ voteResponse.setInteger("targetPid", 7);
+
+ protocol.onClientRecv(voteResponse);
+ protocol.onClientRecv(voteResponse);
+
+ verify(mockProcess, never()).sendMessage(any());
+ verify(mockTaskManager, never()).removeAllTasks(any());
+ verify(mockTaskManager, never()).addTask(any());
+ assertEquals(2, getIntField("votesReceived"));
+ assertTrue(getBooleanField("isCandidate"));
+ assertFalse(getBooleanField("isLeader"));
+ }
+
private void invokeBecomeFollower(int term, int leaderId) throws Exception {
Method method = VSRaftProtocol.class.getDeclaredMethod(
"becomeFollower", int.class, int.class);