summaryrefslogtreecommitdiff
path: root/src/main/java/testing/HeadlessSimulationRunner.java
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2025-06-22 11:58:00 +0300
committerPaul Buetow <paul@buetow.org>2025-06-22 11:58:00 +0300
commit0b5afe8839241dec66ba832cf42860ec69b87df8 (patch)
treee100d2d6204f8c04dc33418ae9f193fa6b1a83c2 /src/main/java/testing/HeadlessSimulationRunner.java
parentb0fc02ce45cb51ce7c8d607d4773808cfa9b6c87 (diff)
Fix message delivery in headless test environment
- Fixed HeadlessSimulationEngine to use correct task manager from receiving process - Reduced message delays for testing (10-50ms instead of 500-2000ms) - Fixed process ID method call (getProcessID not getProcessId) - Improved message delivery scheduling to ensure tasks go to the right task manager This resolves message delivery issues where messages were sent but not received. BasicMulticast test now passes, but 12 protocol tests still failing. 🤖 Generated with Claude Code https://claude.ai/code Co-Authored-By: Claude <noreply@anthropic.com>
Diffstat (limited to 'src/main/java/testing/HeadlessSimulationRunner.java')
-rw-r--r--src/main/java/testing/HeadlessSimulationRunner.java55
1 files changed, 43 insertions, 12 deletions
diff --git a/src/main/java/testing/HeadlessSimulationRunner.java b/src/main/java/testing/HeadlessSimulationRunner.java
index 9d2274c..6279fa9 100644
--- a/src/main/java/testing/HeadlessSimulationRunner.java
+++ b/src/main/java/testing/HeadlessSimulationRunner.java
@@ -26,6 +26,11 @@ public class HeadlessSimulationRunner {
public HeadlessSimulationRunner() {
this.prefs = new VSDefaultPrefs();
this.prefs.fillWithDefaults();
+
+ // Set reasonable message delays for testing (10-50ms instead of 500-2000ms)
+ this.prefs.initLong("message.sendingtime.min", 10);
+ this.prefs.initLong("message.sendingtime.max", 50);
+
VSRegisteredEvents.init(prefs);
this.executor = Executors.newSingleThreadExecutor();
}
@@ -55,14 +60,20 @@ public class HeadlessSimulationRunner {
simulator = loaded.getSimulator();
viz = loaded.getVisualization();
+ // Update message delays on all processes after loading
+ for (int i = 0; i < viz.getNumProcesses(); i++) {
+ VSInternalProcess process = viz.getProcess(i);
+ if (process != null) {
+ process.initLong("message.sendingtime.min", 10);
+ process.initLong("message.sendingtime.max", 50);
+ }
+ }
+
if (simulator == null || viz == null) {
throw new IllegalStateException("Failed to load simulation");
}
- // Set up headless message handlers for all processes
- setupHeadlessMessageHandlers(viz);
-
- // Install log capture
+ // Install log capture first
logCapture = new LogCapture();
logCapture.setPrintLogs(printLogs);
if (listener != null) {
@@ -70,6 +81,9 @@ public class HeadlessSimulationRunner {
}
installLogCapture();
+ // Set up headless message handlers for all processes (after log capture is ready)
+ setupHeadlessMessageHandlers(viz);
+
// Get the simulation's configured end time
long untilTime = viz.getUntilTime();
long actualMaxTime = Math.min(maxTime, untilTime);
@@ -187,10 +201,11 @@ public class HeadlessSimulationRunner {
lastActiveTime = currentTime;
} else {
noActivityCount++;
- // If no activity for 3000ms (3 seconds) of simulation time, stop
- // This accounts for message delivery times of 500-2000ms plus some buffer
- if (noActivityCount > 3000 && (currentTime - lastActiveTime) > 3000) {
- System.out.println("No activity detected for 3 seconds - simulation complete at time " + simulatorTime);
+ // If no activity for 5000ms (5 seconds) of simulation time, stop
+ // This accounts for message delivery times of 500-2000ms plus extra buffer
+ // to ensure all messages are delivered
+ if (noActivityCount > 5000 && (currentTime - lastActiveTime) > 5000) {
+ System.out.println("No activity detected for 5 seconds - simulation complete at time " + simulatorTime);
break;
}
}
@@ -208,10 +223,19 @@ public class HeadlessSimulationRunner {
private boolean hasPendingActivity(VSTaskManager taskManager, Field globalTasksField, long currentTime) {
try {
- // Check global tasks
+ // Check global tasks - but also check if any are scheduled for future times
Queue<?> globalTasks = (Queue<?>) globalTasksField.get(taskManager);
if (globalTasks != null && !globalTasks.isEmpty()) {
- return true; // If any global tasks exist, keep running
+ // Check if any tasks are scheduled for the future
+ for (Object obj : globalTasks) {
+ VSTask task = (VSTask) obj;
+ if (task.getTaskTime() > currentTime) {
+ // There's a future task scheduled, keep running
+ return true;
+ }
+ }
+ // If all tasks are in the past or present, they should execute now
+ return true;
}
// Check process-specific tasks
@@ -220,12 +244,19 @@ public class HeadlessSimulationRunner {
if (process != null) {
Queue<VSTask> tasks = process.getTasks();
if (tasks != null && !tasks.isEmpty()) {
- return true; // If any process tasks exist, keep running
+ // Check if any tasks are scheduled for the future
+ for (VSTask task : tasks) {
+ if (task.getTaskTime() > process.getTime()) {
+ return true;
+ }
+ }
+ // If all tasks are ready to run, keep going
+ return true;
}
}
}
- // Check for messages in transit
+ // Check for messages in transit (visualization lines)
Field messageLinesField = VSSimulatorVisualization.class.getDeclaredField("messageLines");
messageLinesField.setAccessible(true);
LinkedList<?> messageLines = (LinkedList<?>) messageLinesField.get(viz);