diff options
Diffstat (limited to 'src/test/java/testing/protocols/RaftProtocolTest.java')
| -rw-r--r-- | src/test/java/testing/protocols/RaftProtocolTest.java | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/test/java/testing/protocols/RaftProtocolTest.java b/src/test/java/testing/protocols/RaftProtocolTest.java new file mode 100644 index 0000000..b92606d --- /dev/null +++ b/src/test/java/testing/protocols/RaftProtocolTest.java @@ -0,0 +1,77 @@ +package testing.protocols; + +import testing.*; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; + +/** + * Integration test for Raft consensus protocol. + */ +public class RaftProtocolTest extends BaseProtocolTest { + + @Test + @DisplayName("Test Raft protocol activation and message sending") + public void testRaftActivation() { + SimulationResult result = runSimulation( + "saved-simulations/raft.dat", + 2000 // 2 seconds should be enough for elections + ); + + ProtocolVerifier verifier = new ProtocolVerifier() + .expectLogExactly("Raft Consensus Server activated", 3) + .expectLog("FOLLOWER.*initialized") + .expectLog("Starting election") + .expectLog("CANDIDATE") + .expectMessages() // Must have messages + .expectAtLeastNMessages(10); // Should have many election messages + + VerificationResult verification = verifier.verify(result.getAllLogs()); + + assertTrue(verification.passed(), verification.getFailureMessage()); + assertEquals(3, result.getMetrics().getNumProcesses(), + "Should have 3 processes"); + } + + @Test + @DisplayName("Test Raft election messages") + public void testRaftElectionMessages() { + SimulationResult result = runSimulation( + "saved-simulations/raft.dat", + 3000 + ); + + ProtocolVerifier verifier = new ProtocolVerifier() + .expectLog("REQUEST_VOTE") + .expectLog("Message sent.*REQUEST_VOTE") + .expectAtLeastNMessages(15); // Multiple election rounds + + VerificationResult verification = verifier.verify(result.getAllLogs()); + assertTrue(verification.passed(), verification.getFailureMessage()); + + // Verify term progression + assertTrue(result.findFirst("term=1").isPresent(), "Should have term 1"); + assertTrue(result.findFirst("term=2").isPresent(), "Should progress to term 2"); + } + + @Test + @DisplayName("Test Raft with clients") + public void testRaftWithClients() { + // Skip if file doesn't exist + if (!new java.io.File("saved-simulations/raft-with-clients.dat").exists()) { + return; + } + + SimulationResult result = runSimulation( + "saved-simulations/raft-with-clients.dat", + 5000 + ); + + ProtocolVerifier verifier = new ProtocolVerifier() + .expectLogExactly("Raft Consensus Server activated", 3) + .expectLogExactly("Raft Consensus Client activated", 2) + .expectMessages(); // Must have messages + + VerificationResult verification = verifier.verify(result.getAllLogs()); + assertTrue(verification.passed(), verification.getFailureMessage()); + } +}
\ No newline at end of file |
