summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--SystemTest.log9
-rw-r--r--TestExpected.log3
-rw-r--r--TestExpectedByz.log5
-rw-r--r--TestExpectedCombined.log10
-rw-r--r--TestExpectedCrash.log5
-rw-r--r--src/main/java/derms/ReplicaManager.java7
-rw-r--r--src/main/java/derms/client/ResponderClient.java7
-rw-r--r--src/main/java/derms/frontend/DERMSServerImpl.java5
-rw-r--r--src/main/java/derms/frontend/FE.java4
-rw-r--r--src/main/java/derms/replica1/Replica1.java2
-rw-r--r--src/main/java/derms/replica2/Replica2.java2
-rw-r--r--src/main/java/derms/replica3/Replica3.java2
-rw-r--r--src/main/java/derms/util/LogComparator.java16
-rw-r--r--src/test/java/derms/test/SystemTest.java75
15 files changed, 130 insertions, 27 deletions
diff --git a/.gitignore b/.gitignore
index 6828b80..acc6ea8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,10 @@
*.bbl
*.bcf
*.blg
-*.log
+QUEServer.log
+MTLServer.log
+SHEServer.log
+server.log
*.run.xml
*.toc
javadoc
diff --git a/SystemTest.log b/SystemTest.log
new file mode 100644
index 0000000..42385cd
--- /dev/null
+++ b/SystemTest.log
@@ -0,0 +1,9 @@
+[2024-12-03 09:30:31] REPLICA 1: {BYZANTINE: TRUE}
+[2024-12-03 09:30:31] REPLICA 1: {CRASH: FALSE}
+[2024-12-03 09:30:31] REPLICA 3: {BYZANTINE: FALSE}
+[2024-12-03 09:30:31] REPLICA 3: {CRASH: TRUE}
+[2024-12-03 09:30:31] REPLICA 3: {CRASH: DETECTED}
+[2024-12-03 09:30:31] [FAILED TO INFORM FE (RM IS DOWN)]
+[2024-12-03 09:30:31] REPLICA 3: {RESTARTED}
+[2024-12-03 09:30:51] [FAILED: Fail: No response from any server]
+[2024-12-03 09:31:11] [FAILED: Fail: No response from any server]
diff --git a/TestExpected.log b/TestExpected.log
new file mode 100644
index 0000000..805775e
--- /dev/null
+++ b/TestExpected.log
@@ -0,0 +1,3 @@
+[2024-12-03 07:48:36] REPLICA 1: {BYZANTINE: FALSE}
+[2024-12-03 07:48:36] REPLICA 1: {CRASH: FALSE}
+[2024-12-03 08:53:10] [SUCCESS: Something Something] \ No newline at end of file
diff --git a/TestExpectedByz.log b/TestExpectedByz.log
new file mode 100644
index 0000000..b5cabee
--- /dev/null
+++ b/TestExpectedByz.log
@@ -0,0 +1,5 @@
+[2024-12-03 09:22:35] REPLICA 1: {BYZANTINE: TRUE}
+[2024-12-03 09:22:35] REPLICA 1: {CRASH: FALSE}
+[2024-12-03 09:22:35] REPLICA 1: {BYZANTINE: DETECTED}
+[2024-12-03 09:22:35] REPLICA 1: {RESTARTED}
+[2024-12-03 09:22:56] [SUCCESS: OK] \ No newline at end of file
diff --git a/TestExpectedCombined.log b/TestExpectedCombined.log
new file mode 100644
index 0000000..9d955ad
--- /dev/null
+++ b/TestExpectedCombined.log
@@ -0,0 +1,10 @@
+[2024-12-03 09:27:08] REPLICA 1: {BYZANTINE: TRUE}
+[2024-12-03 09:27:08] REPLICA 1: {CRASH: FALSE}
+[2024-12-03 09:27:08] REPLICA 1: {BYZANTINE: DETECTED}
+[2024-12-03 09:27:08] REPLICA 1: {RESTARTED}
+[2024-12-03 09:27:08] REPLICA 3: {BYZANTINE: FALSE}
+[2024-12-03 09:27:08] REPLICA 3: {CRASH: TRUE}
+[2024-12-03 09:27:08] REPLICA 3: {CRASH: DETECTED}
+[2024-12-03 09:27:08] REPLICA 3: {RESTARTED}
+[2024-12-03 09:27:28] [SUCCESS: OK]
+[2024-12-03 09:27:28] [SUCCESS: OK] \ No newline at end of file
diff --git a/TestExpectedCrash.log b/TestExpectedCrash.log
new file mode 100644
index 0000000..90a0640
--- /dev/null
+++ b/TestExpectedCrash.log
@@ -0,0 +1,5 @@
+[2024-12-03 09:22:35] REPLICA 1: {BYZANTINE: FALSE}
+[2024-12-03 09:22:35] REPLICA 1: {CRASH: TRUE}
+[2024-12-03 09:22:35] REPLICA 1: {CRASH: DETECTED}
+[2024-12-03 09:22:35] REPLICA 1: {RESTARTED}
+[2024-12-03 09:22:56] [SUCCESS: OK] \ No newline at end of file
diff --git a/src/main/java/derms/ReplicaManager.java b/src/main/java/derms/ReplicaManager.java
index 1e89969..64ceb04 100644
--- a/src/main/java/derms/ReplicaManager.java
+++ b/src/main/java/derms/ReplicaManager.java
@@ -112,7 +112,7 @@ public class ReplicaManager {
informFrontEndRmIsDown(replica.getId());
replica.restart();
- TestLogger.log("REPLICA " + replicaId + ": {RESTARTED}");
+ //TestLogger.log("REPLICA " + replicaId + ": {RESTARTED}");
}
try {
Thread.sleep(5000); // Example 5 seconds.
@@ -139,7 +139,7 @@ public class ReplicaManager {
replica.restart();
informFrontEndRmHasBug(replica.getId());
- TestLogger.log("REPLICA " + replicaId + ": {RESTARTED}");
+ //TestLogger.log("REPLICA " + replicaId + ": {RESTARTED}");
}
private void informFrontEndRmIsDown(int replicaId) {
@@ -148,6 +148,7 @@ public class ReplicaManager {
out.writeObject("RM_DOWN:" + replicaId);
} catch (IOException e) {
log.severe("Failed to inform FE that RM is down: " + e.getMessage());
+ TestLogger.log("[FAILED TO INFORM FE (RM IS DOWN)]");
}
}
@@ -157,6 +158,7 @@ public class ReplicaManager {
out.writeObject("RM_BUG:" + replicaId);
} catch (IOException e) {
log.severe("Failed to inform FE that RM has a bug: " + e.getMessage());
+ TestLogger.log("[FAILED TO INFORM FE (RM HAS A BUG)]");
}
}
@@ -176,6 +178,7 @@ public class ReplicaManager {
System.out.println("ReplicaManager " + replicaId + " is running.");
} catch (IOException e) {
System.err.println("Failed to start ReplicaManager: " + e.getMessage());
+ TestLogger.log("[FAILED TO START RM]");
e.printStackTrace();
}
}
diff --git a/src/main/java/derms/client/ResponderClient.java b/src/main/java/derms/client/ResponderClient.java
index ec599b4..43be3f3 100644
--- a/src/main/java/derms/client/ResponderClient.java
+++ b/src/main/java/derms/client/ResponderClient.java
@@ -1,8 +1,10 @@
package derms.client;
import derms.frontend.DERMSInterface;
+import derms.util.TestLogger;
import java.net.MalformedURLException;
+import java.util.Objects;
public class ResponderClient extends CLI {
public static final String usage = "Usage: java derms.client.ResponderClient <FE host>";
@@ -60,6 +62,11 @@ public class ResponderClient extends CLI {
}
String response = server.addResource(resourceID, resourceName, duration);
System.out.println(response);
+ if (response.contains("Fail")) {
+ TestLogger.log("[FAILED: " + response + "]");
+ } else {
+ TestLogger.log("[SUCCESS: " + response + "]");
+ }
} catch (NumberFormatException e) {
System.out.println("invalid duration: " + durationStr);
}
diff --git a/src/main/java/derms/frontend/DERMSServerImpl.java b/src/main/java/derms/frontend/DERMSServerImpl.java
index 1877cef..2a5dfa9 100644
--- a/src/main/java/derms/frontend/DERMSServerImpl.java
+++ b/src/main/java/derms/frontend/DERMSServerImpl.java
@@ -5,10 +5,6 @@ package derms.frontend;
//import model.Resource;
import java.util.*;
import java.util.stream.Collectors;
-import java.util.Optional;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
@@ -23,6 +19,7 @@ import javax.jws.soap.SOAPBinding.Style;
//import interfaces.DERMSInterface;
import derms.Request;
import derms.Response;
+import derms.util.TestLogger;
@WebService(endpointInterface = "derms.frontend.DERMSInterface")
public class DERMSServerImpl implements DERMSInterface {
diff --git a/src/main/java/derms/frontend/FE.java b/src/main/java/derms/frontend/FE.java
index ee0a323..b3e100f 100644
--- a/src/main/java/derms/frontend/FE.java
+++ b/src/main/java/derms/frontend/FE.java
@@ -52,7 +52,7 @@ public class FE {
System.out.println("Rm:" + RmNumber + "has bug");
// sendMulticastFaultMessageToRms(errorMessage);
sendUnicastToSequencer(errorMessage);
- TestLogger.log("FE: {BYZANTINE: REPLICA" + RmNumber + "}");
+ //TestLogger.log("FE: {BYZANTINE: INFORM REPLICA" + RmNumber + "}");
}
@Override
@@ -62,7 +62,7 @@ public class FE {
System.out.println("Rm:" + RmNumber + "is down");
// sendMulticastFaultMessageToRms(errorMessage);
sendUnicastToSequencer(errorMessage);
- TestLogger.log("FE: {CRASH: REPLICA" + RmNumber + "}");
+ //TestLogger.log("FE: {CRASH: INFORM REPLICA" + RmNumber + "}");
}
@Override
diff --git a/src/main/java/derms/replica1/Replica1.java b/src/main/java/derms/replica1/Replica1.java
index 64565e6..dd5b545 100644
--- a/src/main/java/derms/replica1/Replica1.java
+++ b/src/main/java/derms/replica1/Replica1.java
@@ -5,6 +5,7 @@ import derms.ReplicaManager;
import derms.Request;
import derms.Response;
import derms.replica2.DermsLogger;
+import derms.util.TestLogger;
import derms.util.ThreadPool;
import java.io.IOException;
@@ -94,6 +95,7 @@ public class Replica1 implements Replica {
log.info("Finished shutting down.");
// [TEST] Restart process without byzantine failure or crash
+ TestLogger.log("REPLICA 1: {RESTARTED}");
startProcess(0, 0);
}
diff --git a/src/main/java/derms/replica2/Replica2.java b/src/main/java/derms/replica2/Replica2.java
index 73a66b2..cf21d74 100644
--- a/src/main/java/derms/replica2/Replica2.java
+++ b/src/main/java/derms/replica2/Replica2.java
@@ -1,6 +1,7 @@
package derms.replica2;
import derms.*;
+import derms.util.TestLogger;
import derms.util.ThreadPool;
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
@@ -177,6 +178,7 @@ public class Replica2 implements Replica {
shutdown();
// [TEST] Restart process without byzantine failure or crash
+ TestLogger.log("REPLICA 2: {RESTARTED}");
startProcess(0, 0);
}
diff --git a/src/main/java/derms/replica3/Replica3.java b/src/main/java/derms/replica3/Replica3.java
index b7cf8ef..9e262e3 100644
--- a/src/main/java/derms/replica3/Replica3.java
+++ b/src/main/java/derms/replica3/Replica3.java
@@ -13,6 +13,7 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import derms.replica3.Logger;
+import derms.util.TestLogger;
public class Replica3 implements Replica{
static final InetSocketAddress announceGroup = new InetSocketAddress("225.5.5.5", 5555);
@@ -130,6 +131,7 @@ public class Replica3 implements Replica{
shutdown();
// [TEST] Restart process without byzantine failure or crash
+ TestLogger.log("REPLICA 3: {RESTARTED}");
startProcess(0, 0);
}
diff --git a/src/main/java/derms/util/LogComparator.java b/src/main/java/derms/util/LogComparator.java
index 6b629a6..da3736c 100644
--- a/src/main/java/derms/util/LogComparator.java
+++ b/src/main/java/derms/util/LogComparator.java
@@ -7,7 +7,21 @@ public class LogComparator {
public static boolean compareLineCounts(String actualFilePath, String expectedFilePath) throws IOException {
long actualLineCount = Files.lines(Paths.get(actualFilePath)).count();
long expectedLineCount = Files.lines(Paths.get(expectedFilePath)).count();
-
+ System.out.println("XXXXXXXXX ACTUAL LINE: " + actualLineCount);
+ System.out.println("XXXXXXXXX EXPECTED: " + expectedLineCount);
return actualLineCount == expectedLineCount;
}
+public static boolean containsSuccess(String filePath) throws IOException {
+ return Files.lines(Paths.get(filePath)).anyMatch(line -> line.contains("SUCCESS"));
+}
+
+public static boolean compareFiles(String actualFilePath, String expectedFilePath) throws IOException {
+ boolean lineCountsMatch = compareLineCounts(actualFilePath, expectedFilePath);
+ boolean actualContainsSuccess = containsSuccess(actualFilePath);
+ System.out.println("XXXXXXXXX ACTUAL SUCCESS: " + actualContainsSuccess);
+ boolean expectedContainsSuccess = containsSuccess(expectedFilePath);
+ System.out.println("XXXXXXXXX EXPECTED SUCCESS: " + expectedContainsSuccess);
+
+ return lineCountsMatch && actualContainsSuccess && expectedContainsSuccess;
+}
} \ No newline at end of file
diff --git a/src/test/java/derms/test/SystemTest.java b/src/test/java/derms/test/SystemTest.java
index 5354b54..6ee1f35 100644
--- a/src/test/java/derms/test/SystemTest.java
+++ b/src/test/java/derms/test/SystemTest.java
@@ -8,6 +8,7 @@ import derms.replica1.DERMSServerPublisher;
import org.junit.jupiter.api.*;
import java.io.*;
+import java.net.MalformedURLException;
import java.nio.file.*;
import java.util.*;
import derms.util.*;
@@ -18,7 +19,10 @@ import static org.junit.jupiter.api.Assertions.*;
class SystemTest {
private static final String TEST_LOG_PATH = "SystemTest.log";
- private static final String EXPECTED_LOG_PATH = "TestExpected.log";
+ private static final String EXPECTED_LOG_PATH_NORM = "TestExpected.log";
+ private static final String EXPECTED_LOG_PATH_BYZ = "TestExpectedByz.log";
+ private static final String EXPECTED_LOG_PATH_CRASH = "TestExpectedCrash.log";
+ private static final String EXPECTED_LOG_PATH_COMBINED = "TestExpectedCombined.log";
// [TODO]
// input IP and NET config
@@ -60,7 +64,7 @@ class SystemTest {
DERMSServerPublisher.stop();
}
- @Test
+ /* @Test
void testNormal() throws IOException {
// Replica 1
String[] argsRM = {"1", "MTL", IP, "0", "0"};
@@ -75,10 +79,10 @@ class SystemTest {
addCommand.add("MTL1001", "ambulance", "10");
// Compare the number of lines in the log files, to determine if they match or not
- assertTrue(LogComparator.compareLineCounts(TEST_LOG_PATH, EXPECTED_LOG_PATH));
- }
+ assertTrue(LogComparator.compareFiles(TEST_LOG_PATH, EXPECTED_LOG_PATH_NORM));
+ } */
- @Test
+ /* @Test
void testByzantine() throws IOException {
// Replica 1
String[] argsRM = {"1", "MTL", IP, "1", "0"};
@@ -93,10 +97,10 @@ class SystemTest {
addCommand.add("MTL1001", "ambulance", "10");
// Compare the number of lines in the log files, to determine if they match or not
- assertTrue(LogComparator.compareLineCounts(TEST_LOG_PATH, EXPECTED_LOG_PATH));
- }
+ assertTrue(LogComparator.compareFiles(TEST_LOG_PATH, EXPECTED_LOG_PATH_BYZ));
+ } */
- @Test
+ /* @Test
void testCrash() throws IOException {
// Replica 1
String[] argsRM = {"1", "MTL", IP, "0", "1"};
@@ -111,8 +115,8 @@ class SystemTest {
addCommand.add("MTL1001", "ambulance", "10");
// Compare the number of lines in the log files, to determine if they match or not
- assertTrue(LogComparator.compareLineCounts(TEST_LOG_PATH, EXPECTED_LOG_PATH));
- }
+ assertTrue(LogComparator.compareFiles(TEST_LOG_PATH, EXPECTED_LOG_PATH_CRASH));
+ } */
@Test
void testCombined() throws IOException {
@@ -130,15 +134,52 @@ class SystemTest {
ReplicaManager.main(argsRM1);
ReplicaManager.main(argsRM3);
- ResponderClient responderClient = new ResponderClient(IP);
- ResponderClient.Add addCommand = responderClient.new Add();
- addCommand.add("MTL1001", "ambulance", "10");
+ Thread thread1 = new Thread(() -> {
+ ResponderClient responderClient = null;
+ try {
+ responderClient = new ResponderClient(IP);
+ } catch (MalformedURLException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ if (responderClient != null) {
+ ResponderClient.Add addCommand = responderClient.new Add();
+ addCommand.add("MTL1001", "ambulance", "10");
+ }
+ }
+ });
+
+ Thread thread2 = new Thread(() -> {
+ ResponderClient responderClient2 = null;
+ try {
+ responderClient2 = new ResponderClient(IP);
+ } catch (MalformedURLException e) {
+ e.printStackTrace();
+ } finally {
+ if (responderClient2 != null) {
+ ResponderClient.Add addCommand2 = responderClient2.new Add();
+ addCommand2.add("MTL1002", "ambulance", "11");
+ }
+ }
+ });
- ResponderClient responderClient2 = new ResponderClient(IP);
- ResponderClient.Add addCommand2 = responderClient2.new Add();
- addCommand2.add("MTL1002", "ambulance", "11");
+ thread1.start();
+ thread2.start();
+
+ try {
+ thread1.join();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ try {
+ thread2.join();
+ } catch (InterruptedException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
// Compare the number of lines in the log files, to determine if they match or not
- assertTrue(LogComparator.compareLineCounts(TEST_LOG_PATH, EXPECTED_LOG_PATH));
+ assertTrue(LogComparator.compareFiles(TEST_LOG_PATH, EXPECTED_LOG_PATH_COMBINED));
}
} \ No newline at end of file