summaryrefslogtreecommitdiff
path: root/src/test/java/simulator/builder/SimulationBuilderTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/java/simulator/builder/SimulationBuilderTest.java')
-rw-r--r--src/test/java/simulator/builder/SimulationBuilderTest.java147
1 files changed, 147 insertions, 0 deletions
diff --git a/src/test/java/simulator/builder/SimulationBuilderTest.java b/src/test/java/simulator/builder/SimulationBuilderTest.java
new file mode 100644
index 0000000..82860f0
--- /dev/null
+++ b/src/test/java/simulator/builder/SimulationBuilderTest.java
@@ -0,0 +1,147 @@
+package simulator.builder;
+
+import org.junit.jupiter.api.*;
+import static org.junit.jupiter.api.Assertions.*;
+import java.io.File;
+import java.nio.file.*;
+
+/**
+ * Tests for the SimulationBuilder framework
+ */
+class SimulationBuilderTest {
+
+ private static final String TEST_DIR = "target/test-simulations/";
+
+ @BeforeEach
+ void setUp() throws Exception {
+ // Create test directory
+ Files.createDirectories(Paths.get(TEST_DIR));
+ }
+
+ @AfterEach
+ void tearDown() throws Exception {
+ // Clean up test files
+ File dir = new File(TEST_DIR);
+ if (dir.exists()) {
+ for (File file : dir.listFiles()) {
+ file.delete();
+ }
+ }
+ }
+
+ @Test
+ void testCreateBasicRaftSimulation() throws Exception {
+ String filename = TEST_DIR + "test-raft.dat";
+
+ // Create a basic Raft simulation
+ new SimulationBuilder()
+ .withProcesses(3)
+ .withProtocol(SimulationBuilder.Protocols.RAFT)
+ .activateServers(0, 1, 2)
+ .save(filename);
+
+ // Verify file was created
+ File file = new File(filename);
+ assertTrue(file.exists(), "Simulation file should be created");
+ assertTrue(file.length() > 1000, "File should have content");
+
+ // Verify it contains Raft protocol
+ String content = Files.readString(file.toPath());
+ assertTrue(content.contains("VSRaftProtocol"), "Should contain Raft protocol classname");
+ }
+
+ @Test
+ void testCreateRaftWithClients() throws Exception {
+ String filename = TEST_DIR + "test-raft-clients.dat";
+
+ // Use factory method
+ SimulationFactory.createRaftSimulation(3, 2)
+ .save(filename);
+
+ // Verify file was created
+ File file = new File(filename);
+ assertTrue(file.exists(), "Simulation file should be created");
+
+ // Should have 5 processes (3 servers + 2 clients)
+ String content = Files.readString(file.toPath());
+ assertTrue(content.contains("VSRaftProtocol"), "Should contain Raft protocol");
+ }
+
+ @Test
+ void testCreatePingPongSimulation() throws Exception {
+ String filename = TEST_DIR + "test-pingpong.dat";
+
+ SimulationFactory.createPingPongSimulation(2)
+ .save(filename);
+
+ File file = new File(filename);
+ assertTrue(file.exists(), "Simulation file should be created");
+
+ String content = Files.readString(file.toPath());
+ assertTrue(content.contains("VSPingPongProtocol"), "Should contain PingPong protocol");
+ }
+
+ @Test
+ void testCreateComplexSimulation() throws Exception {
+ String filename = TEST_DIR + "test-complex.dat";
+
+ // Create a complex simulation with events
+ new SimulationBuilder()
+ .withProcesses(5)
+ .withProtocol(SimulationBuilder.Protocols.RAFT)
+ .withDuration(30000)
+ .activateServers(0, 1, 2)
+ .activateClients(1000, 3, 4)
+ .addCrashEvent(0, 5000)
+ .addRecoveryEvent(0, 10000)
+ .save(filename);
+
+ File file = new File(filename);
+ assertTrue(file.exists(), "Simulation file should be created");
+ assertTrue(file.length() > 5000, "Complex simulation should be larger");
+
+ String content = Files.readString(file.toPath());
+ assertTrue(content.contains("VSProcessCrashEvent"), "Should contain crash event");
+ assertTrue(content.contains("VSProcessRecoverEvent"), "Should contain recovery event");
+ }
+
+ @Test
+ void testAllProtocolTypes() throws Exception {
+ // Test that all protocol constants work
+ String[] protocols = {
+ SimulationBuilder.Protocols.RAFT,
+ SimulationBuilder.Protocols.PING_PONG,
+ SimulationBuilder.Protocols.BERKLEY_TIME,
+ SimulationBuilder.Protocols.BROADCAST,
+ SimulationBuilder.Protocols.ONE_PHASE_COMMIT,
+ SimulationBuilder.Protocols.TWO_PHASE_COMMIT,
+ SimulationBuilder.Protocols.RELIABLE_MULTICAST
+ };
+
+ for (String protocol : protocols) {
+ String filename = TEST_DIR + "test-" + protocol.substring(protocol.lastIndexOf('.') + 1) + ".dat";
+
+ new SimulationBuilder()
+ .withProcesses(3)
+ .withProtocol(protocol)
+ .activateServers(0, 1, 2)
+ .save(filename);
+
+ File file = new File(filename);
+ assertTrue(file.exists(), "Should create file for " + protocol);
+ assertTrue(file.length() > 1000, "File should have content for " + protocol);
+ }
+ }
+
+ @Test
+ void testInvalidConfiguration() {
+ // Test that invalid configurations throw exceptions
+ assertThrows(IllegalArgumentException.class, () -> {
+ SimulationFactory.createRaftSimulation(2, 0); // Too few servers
+ });
+
+ assertThrows(IllegalArgumentException.class, () -> {
+ SimulationFactory.createBerkeleyTimeSimulation(1); // Too few processes
+ });
+ }
+} \ No newline at end of file