summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-03-27 13:05:59 +0200
committerPaul Buetow <paul@buetow.org>2026-03-27 13:05:59 +0200
commitf55d67d98dddf5861dc4266564863dde4b0b6ed1 (patch)
treeb87ad04a444b9873cb9ec0ede643772f160e6012 /src/test
parent29252fbc7803e4a660332524d5811ff942e2b0bc (diff)
sr: retune Raft replay for faster reelection
Diffstat (limited to 'src/test')
-rw-r--r--src/test/java/protocols/VSAbstractProtocolTest.java13
-rw-r--r--src/test/java/protocols/implementations/VSRaftProtocolTest.java4
-rw-r--r--src/test/java/simulator/builder/SimulationBuilderTest.java30
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
+}