diff options
| author | Paul Buetow <paul@buetow.org> | 2026-03-27 13:05:59 +0200 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2026-03-27 13:05:59 +0200 |
| commit | f55d67d98dddf5861dc4266564863dde4b0b6ed1 (patch) | |
| tree | b87ad04a444b9873cb9ec0ede643772f160e6012 /src/test | |
| parent | 29252fbc7803e4a660332524d5811ff942e2b0bc (diff) | |
sr: retune Raft replay for faster reelection
Diffstat (limited to 'src/test')
3 files changed, 41 insertions, 6 deletions
diff --git a/src/test/java/protocols/VSAbstractProtocolTest.java b/src/test/java/protocols/VSAbstractProtocolTest.java index b93cae4..2a76c1e 100644 --- a/src/test/java/protocols/VSAbstractProtocolTest.java +++ b/src/test/java/protocols/VSAbstractProtocolTest.java @@ -267,6 +267,11 @@ class VSAbstractProtocolTest { void testScheduleAt() { testProtocol.process = mockProcess; testProtocol.currentContextIsServer(true); + when(mockProcess.getPrefs()).thenReturn(mockPrefs); + when(mockPrefs.getString("lang.server")).thenReturn("Server"); + when(mockPrefs.getString("lang.client")).thenReturn("Client"); + when(mockPrefs.getString("lang.events.internal.VSProtocolScheduleEvent.short")) + .thenReturn("Protocol Schedule"); long scheduleTime = 100L; testProtocol.scheduleAt(scheduleTime); @@ -277,6 +282,12 @@ class VSAbstractProtocolTest { VSTask capturedTask = taskCaptor.getValue(); assertNotNull(capturedTask); assertEquals(mockProcess, capturedTask.getProcess()); + assertInstanceOf(VSProtocolScheduleEvent.class, capturedTask.getEvent()); + assertEquals("events.internal.VSProtocolScheduleEvent", + capturedTask.getEvent().getClassname()); + assertEquals("protocols.VSAbstractProtocolTest$TestProtocol " + + "Server Protocol Schedule", + capturedTask.getEvent().getShortname()); } @Test @@ -360,4 +371,4 @@ class VSAbstractProtocolTest { verify(mockOutputStream, atLeast(1)).writeObject(Boolean.TRUE); // hasOnServerStart } -}
\ No newline at end of file +} diff --git a/src/test/java/protocols/implementations/VSRaftProtocolTest.java b/src/test/java/protocols/implementations/VSRaftProtocolTest.java index 1cc25fd..40dfd10 100644 --- a/src/test/java/protocols/implementations/VSRaftProtocolTest.java +++ b/src/test/java/protocols/implementations/VSRaftProtocolTest.java @@ -96,6 +96,7 @@ class VSRaftProtocolTest { assertEquals(2, getAckPids().size()); assertTrue(getAckPids().contains(2)); assertTrue(getAckPids().contains(3)); + verify(mockProcess).log("Leader elected: process 7 (term 0)"); assertEquals(1600L, taskCaptor.getValue().getTaskTime()); } @@ -465,6 +466,7 @@ class VSRaftProtocolTest { assertFalse(getBooleanField("isCandidate")); assertEquals(7, getIntField("leaderId")); assertTrue(protocol.isServer()); + verify(mockProcess).log("Leader elected: process 7 (term 3)"); assertEquals(1800L, taskCaptor.getValue().getTaskTime()); } @@ -662,6 +664,8 @@ class VSRaftProtocolTest { throws Exception { LeaderHarness leaderHarness = createLeaderHarness(11, 300L); leaderHarness.protocol.onStart(); + verify(leaderHarness.process).log("Leader elected: process 11 (term 0)"); + clearInvocations(leaderHarness.process); ArrayList<VSMessage> sentMessages = leaderHarness.protocol.getSentMessages(); assertEquals(2, sentMessages.size()); diff --git a/src/test/java/simulator/builder/SimulationBuilderTest.java b/src/test/java/simulator/builder/SimulationBuilderTest.java index 5061477..3992688 100644 --- a/src/test/java/simulator/builder/SimulationBuilderTest.java +++ b/src/test/java/simulator/builder/SimulationBuilderTest.java @@ -4,6 +4,7 @@ import org.junit.jupiter.api.*; import static org.junit.jupiter.api.Assertions.*; import java.io.File; import java.nio.file.*; +import java.nio.charset.StandardCharsets; /** * Tests for the SimulationBuilder framework @@ -40,7 +41,8 @@ class SimulationBuilderTest { File file = new File(filename); assertTrue(file.exists(), "Simulation file should be created"); - String content = Files.readString(file.toPath()); + String content = new String(Files.readAllBytes(file.toPath()), + StandardCharsets.ISO_8859_1); assertTrue(content.contains("VSPingPongProtocol"), "Should contain PingPong protocol"); } @@ -54,7 +56,7 @@ class SimulationBuilderTest { .withProtocol(SimulationBuilder.Protocols.TWO_PHASE_COMMIT) .withDuration(30000) .activateServers(0, 1, 2) - .activateClients(1000, 3, 4) + .activateClientsAt(1000, 3, 4) .addCrashEvent(0, 5000) .addRecoveryEvent(0, 10000) .save(filename); @@ -63,11 +65,29 @@ class SimulationBuilderTest { assertTrue(file.exists(), "Simulation file should be created"); assertTrue(file.length() > 5000, "Complex simulation should be larger"); - String content = Files.readString(file.toPath()); + String content = new String(Files.readAllBytes(file.toPath()), + StandardCharsets.ISO_8859_1); assertTrue(content.contains("VSProcessCrashEvent"), "Should contain crash event"); assertTrue(content.contains("VSProcessRecoverEvent"), "Should contain recovery event"); } - + + @Test + void testCreateRaftSimulation() throws Exception { + String filename = TEST_DIR + "test-raft.dat"; + + SimulationFactory.createRaftSimulation() + .save(filename); + + File file = new File(filename); + assertTrue(file.exists(), "Simulation file should be created"); + assertTrue(file.length() > 10000, "Raft simulation should be larger"); + + String content = new String(Files.readAllBytes(file.toPath()), + StandardCharsets.ISO_8859_1); + assertTrue(content.contains("VSRaftProtocol"), "Should contain Raft protocol"); + assertTrue(content.contains("VSProcessCrashEvent"), "Should contain crash event"); + } + @Test void testAllProtocolTypes() throws Exception { // Test that all protocol constants work @@ -102,4 +122,4 @@ class SimulationBuilderTest { SimulationFactory.createBerkeleyTimeSimulation(1); // Too few processes }); } -}
\ No newline at end of file +} |
