11name : VM Execution Tests
22
3+ # NOTE: This workflow tests experimental VM execution features using Firecracker
4+ # Firecracker is Linux-only - these tests will not work on macOS/Windows
5+ # The scratchpad/firecracker-rust directory is gitignored (experimental code)
6+ # Tests will skip gracefully if the directory is not present
7+
38on :
49 push :
510 branches : [ main, develop, agent_system ]
2833 timeout-minutes : 15
2934
3035 steps :
36+ - name : Platform check
37+ run : |
38+ echo "⚠️ VM execution tests are Linux-only (Firecracker requirement)"
39+ echo "Running on: ubuntu-latest ✅"
40+
3141 - name : Checkout code
3242 uses : actions/checkout@v4
3343
@@ -53,17 +63,33 @@ jobs:
5363 ${{ runner.os }}-cargo-unit-
5464 ${{ runner.os }}-cargo-
5565
66+ - name : Check if fcctl-web exists
67+ id : check_fcctl_unit
68+ run : |
69+ if [ -d "scratchpad/firecracker-rust/fcctl-web" ]; then
70+ echo "exists=true" >> $GITHUB_OUTPUT
71+ else
72+ echo "exists=false" >> $GITHUB_OUTPUT
73+ echo "⚠️ fcctl-web not found - skipping VM execution tests (experimental code is gitignored)"
74+ fi
75+
5676 - name : Run VM execution unit tests
77+ if : steps.check_fcctl_unit.outputs.exists == 'true'
5778 run : |
5879 cargo test -p terraphim_multi_agent vm_execution \
5980 --verbose \
6081 -- --nocapture
6182
6283 - name : Run code extractor tests
84+ if : steps.check_fcctl_unit.outputs.exists == 'true'
6385 run : |
6486 cargo test -p terraphim_multi_agent code_extractor \
6587 --verbose \
6688 -- --nocapture
89+
90+ - name : Skip message
91+ if : steps.check_fcctl_unit.outputs.exists == 'false'
92+ run : echo "✅ Skipping VM execution unit tests - experimental code not present"
6793
6894 integration-tests :
6995 name : Integration Tests
@@ -114,13 +140,25 @@ jobs:
114140 restore-keys : |
115141 ${{ runner.os }}-cargo-integration-
116142 ${{ runner.os }}-cargo-
143+
144+ - name : Check if fcctl-web exists
145+ id : check_fcctl
146+ run : |
147+ if [ -d "scratchpad/firecracker-rust/fcctl-web" ]; then
148+ echo "exists=true" >> $GITHUB_OUTPUT
149+ else
150+ echo "exists=false" >> $GITHUB_OUTPUT
151+ echo "⚠️ fcctl-web not found (experimental code is gitignored)"
152+ fi
117153
118154 - name : Build fcctl-web
155+ if : steps.check_fcctl.outputs.exists == 'true'
119156 run : |
120157 cd scratchpad/firecracker-rust/fcctl-web
121158 cargo build --release
122159
123160 - name : Start fcctl-web server
161+ if : steps.check_fcctl.outputs.exists == 'true'
124162 run : |
125163 cd scratchpad/firecracker-rust/fcctl-web
126164 ./target/release/fcctl-web &
@@ -137,21 +175,27 @@ jobs:
137175 done
138176
139177 - name : Run integration tests
178+ if : steps.check_fcctl.outputs.exists == 'true'
140179 run : |
141180 cd scratchpad/firecracker-rust/fcctl-web
142181 cargo test llm_api_tests \
143182 --verbose \
144183 -- --nocapture
145184
146185 - name : Run HTTP API security tests
186+ if : steps.check_fcctl.outputs.exists == 'true'
147187 run : |
148188 cd scratchpad/firecracker-rust/fcctl-web
149189 cargo test security_tests \
150190 --verbose \
151191 -- --nocapture
192+
193+ - name : Skip message
194+ if : steps.check_fcctl.outputs.exists == 'false'
195+ run : echo "✅ Skipping integration tests - fcctl-web experimental code not present (gitignored)"
152196
153197 - name : Stop fcctl-web server
154- if : always()
198+ if : always() && steps.check_fcctl.outputs.exists == 'true'
155199 run : |
156200 if [ -n "${FCCTL_WEB_PID:-}" ]; then
157201 kill $FCCTL_WEB_PID || true
@@ -323,7 +367,18 @@ jobs:
323367 ${{ runner.os }}-cargo-security-
324368 ${{ runner.os }}-cargo-
325369
370+ - name : Check if fcctl-web exists
371+ id : check_fcctl_security
372+ run : |
373+ if [ -d "scratchpad/firecracker-rust/fcctl-web" ]; then
374+ echo "exists=true" >> $GITHUB_OUTPUT
375+ else
376+ echo "exists=false" >> $GITHUB_OUTPUT
377+ echo "⚠️ fcctl-web not found - skipping VM security tests (experimental code is gitignored)"
378+ fi
379+
326380 - name : Run dangerous pattern detection tests
381+ if : steps.check_fcctl_security.outputs.exists == 'true'
327382 run : |
328383 cargo test -p terraphim_multi_agent \
329384 test_dangerous_code_validation \
@@ -332,6 +387,7 @@ jobs:
332387 -- --nocapture
333388
334389 - name : Build fcctl-web for security tests
390+ if : steps.check_fcctl_security.outputs.exists == 'true'
335391 run : |
336392 cd scratchpad/firecracker-rust/fcctl-web
337393 cargo build --release
@@ -347,21 +403,27 @@ jobs:
347403 done
348404
349405 - name : Run security integration tests
406+ if : steps.check_fcctl_security.outputs.exists == 'true'
350407 run : |
351408 cd scratchpad/firecracker-rust/fcctl-web
352409 cargo test security_tests \
353410 --verbose \
354411 -- --nocapture
355412
356413 - name : Test agent security handling
414+ if : steps.check_fcctl_security.outputs.exists == 'true'
357415 run : |
358416 cargo test test_agent_blocks_dangerous_code \
359417 --verbose \
360418 --ignored \
361419 -- --nocapture
420+
421+ - name : Skip message
422+ if : steps.check_fcctl_security.outputs.exists == 'false'
423+ run : echo "✅ Skipping security tests - fcctl-web experimental code not present (gitignored)"
362424
363425 - name : Stop server
364- if : always()
426+ if : always() && steps.check_fcctl_security.outputs.exists == 'true'
365427 run : |
366428 if [ -n "${FCCTL_WEB_PID:-}" ]; then
367429 kill $FCCTL_WEB_PID || true
@@ -397,14 +459,26 @@ jobs:
397459 ${{ runner.os }}-cargo-perf-
398460 ${{ runner.os }}-cargo-
399461
462+ - name : Check if fcctl-web exists
463+ id : check_fcctl_perf
464+ run : |
465+ if [ -d "scratchpad/firecracker-rust/fcctl-web" ]; then
466+ echo "exists=true" >> $GITHUB_OUTPUT
467+ else
468+ echo "exists=false" >> $GITHUB_OUTPUT
469+ echo "⚠️ fcctl-web not found - skipping VM performance tests (experimental code is gitignored)"
470+ fi
471+
400472 - name : Run unit performance tests
473+ if : steps.check_fcctl_perf.outputs.exists == 'true'
401474 run : |
402475 cargo test -p terraphim_multi_agent performance_tests \
403476 --release \
404477 --verbose \
405478 -- --nocapture
406479
407480 - name : Build and start fcctl-web
481+ if : steps.check_fcctl_perf.outputs.exists == 'true'
408482 run : |
409483 cd scratchpad/firecracker-rust/fcctl-web
410484 cargo build --release
@@ -420,6 +494,7 @@ jobs:
420494 done
421495
422496 - name : Run WebSocket performance tests
497+ if : steps.check_fcctl_perf.outputs.exists == 'true'
423498 run : |
424499 cd scratchpad/firecracker-rust/fcctl-web
425500 cargo test websocket_performance_tests \
@@ -429,15 +504,20 @@ jobs:
429504 -- --nocapture
430505
431506 - name : Run agent performance tests
507+ if : steps.check_fcctl_perf.outputs.exists == 'true'
432508 run : |
433509 cargo test agent_performance_tests \
434510 --release \
435511 --ignored \
436512 --verbose \
437513 -- --nocapture
514+
515+ - name : Skip message
516+ if : steps.check_fcctl_perf.outputs.exists == 'false'
517+ run : echo "✅ Skipping performance tests - fcctl-web experimental code not present (gitignored)"
438518
439519 - name : Stop server
440- if : always()
520+ if : always() && steps.check_fcctl_perf.outputs.exists == 'true'
441521 run : |
442522 if [ -n "${FCCTL_WEB_PID:-}" ]; then
443523 kill $FCCTL_WEB_PID || true
@@ -451,23 +531,41 @@ jobs:
451531 steps :
452532 - name : Checkout code
453533 uses : actions/checkout@v4
534+
535+ - name : Check if test script exists
536+ id : check_script
537+ run : |
538+ if [ -f "scripts/test-vm-execution.sh" ]; then
539+ echo "exists=true" >> $GITHUB_OUTPUT
540+ else
541+ echo "exists=false" >> $GITHUB_OUTPUT
542+ echo "⚠️ test-vm-execution.sh not found - skipping (experimental script)"
543+ fi
454544
455545 - name : Make test script executable
546+ if : steps.check_script.outputs.exists == 'true'
456547 run : chmod +x scripts/test-vm-execution.sh
457548
458549 - name : Test script help
550+ if : steps.check_script.outputs.exists == 'true'
459551 run : ./scripts/test-vm-execution.sh --help
460552
461553 - name : Test script unit tests only
554+ if : steps.check_script.outputs.exists == 'true'
462555 run : |
463556 ./scripts/test-vm-execution.sh unit \
464557 --timeout 300 \
465558 --verbose
466559
467560 - name : Verify script creates logs
561+ if : steps.check_script.outputs.exists == 'true'
468562 run : |
469563 test -d test-logs || echo "Log directory not created"
470564 find test-logs -name "*.log" | head -5
565+
566+ - name : Skip message
567+ if : steps.check_script.outputs.exists == 'false'
568+ run : echo "✅ Skipping test script - experimental VM execution script not present"
471569
472570 coverage :
473571 name : Test Coverage
0 commit comments