diff options
Diffstat (limited to 'src/test/java/protocols/implementations/VSRaftProtocolTest.java')
| -rw-r--r-- | src/test/java/protocols/implementations/VSRaftProtocolTest.java | 82 |
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); |
