summaryrefslogtreecommitdiff
path: root/src/test/java/testing/protocols/RaftProtocolTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/testing/protocols/RaftProtocolTest.java')
-rw-r--r--src/test/java/testing/protocols/RaftProtocolTest.java77
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