Skip to main content

Changelog - OpenSynaptic Integration & Logging Optimization

Date: 2026-03-24

Summary

  • Reduced performance statistics logging frequency from every 5 seconds to once per minute (60 seconds)
  • Integrated integration_test.py and audit_driver_capabilities.py into the main plugin-test CLI command
  • Updated CLI help text to document new test suites

Changes by Category

1. Performance Logging Reduction (60-Second Interval)

Modified Files

  • src/opensynaptic/core/Receiver.py
    • Line 177: Changed ReceiverRuntime.__init__() default report_interval_s parameter from 5.060.0
    • Line 273: Changed main() function ReceiverRuntime instantiation report_interval_s parameter from 5.060.0

Impact

  • Before: Performance stats logged every 5 seconds (12 lines per minute)
  • After: Performance stats logged every 60 seconds (1 line per minute)
  • Benefit: 92% reduction in performance log volume during run daemon mode

Example Output Comparison

# OLD (5-second interval)
18:05:48 [INFO] OS: Performance stats recv=0 ok=0 fail=0 drop=0 backlog=0/0 avg=0.0ms max=0.0ms pps(in/out)=0.0/0.0
18:05:53 [INFO] OS: Performance stats recv=0 ok=0 fail=0 drop=0 backlog=0/0 avg=0.0ms max=0.0ms pps(in/out)=0.0/0.0
18:05:58 [INFO] OS: Performance stats recv=0 ok=0 fail=0 drop=0 backlog=0/0 avg=0.0ms max=0.0ms pps(in/out)=0.0/0.0

# NEW (60-second interval)
18:05:45 [INFO] OS: Performance stats recv=0 ok=0 fail=0 drop=0 backlog=0/0 avg=0.0ms max=0.0ms pps(in/out)=0.0/0.0
18:06:45 [INFO] OS: Performance stats recv=0 ok=0 fail=0 drop=0 backlog=0/0 avg=0.0ms max=0.0ms pps(in/out)=0.0/0.0
18:07:45 [INFO] OS: Performance stats recv=0 ok=0 fail=0 drop=0 backlog=0/0 avg=0.0ms max=0.0ms pps(in/out)=0.0/0.0

2. Test Suite Integration

New Files Created

  1. src/opensynaptic/services/test_plugin/integration_test.py (246 lines)

    • Moved from: scripts/integration_test.py
    • Contains 8 integration tests covering:
      • Node initialization
      • Single/multi-sensor transmission
      • Packet receiving and decompression
      • Protocol handshake
      • UDP dispatch
      • Transport layer driver access
      • Physical layer driver access
    • Entry point: run_tests(repo_root: Path) -> dict
  2. src/opensynaptic/services/test_plugin/audit_driver_capabilities.py (137 lines)

    • Moved from: scripts/audit_driver_capabilities.py
    • Audits all protocol drivers for send/receive capabilities:
      • L4 Transport: UDP, TCP, QUIC, IWIP, UIP
      • PHY Physical: UART, RS485, CAN, LoRa
      • L7 Application: MQTT
    • Entry point: audit_all_drivers() -> dict

Modified Files

  1. src/opensynaptic/services/test_plugin/main.py (+65 lines)

    • Added run_integration() method (lines ~295-300)
    • Added run_audit() method (lines ~302-320)
    • Added _integration() CLI handler in get_cli_commands() (lines ~705-715)
    • Added _audit() CLI handler in get_cli_commands() (lines ~717-727)
    • Both handlers follow existing test plugin patterns
  2. src/opensynaptic/CLI/parsers/test.py (2 lines)

    • Updated --suite argument choices:
      • Added: 'integration'
      • Added: 'audit'
    • Updated help text to list all 7 suite options
  3. src/opensynaptic/CLI/app.py (2 lines)

    • Added handling for 'integration' and 'audit' suites in plugin-test handler (~line 1310)
    • Updated help text to document new test suites (lines 87-96)

CLI Usage Examples

Run Integration Tests

# Via main.py (CLI mode)
python -u src/main.py plugin-test --suite integration

# Or via direct entry point
python scripts/integration_test.py # Still works

Output:

[TEST 1] Node initialization with auto-driver discovery
✓ PASS: Node initialized, drivers auto-loaded
[TEST 2] Transmit single sensor
✓ PASS: Generated 24 byte packet, strategy=FULL
...
RESULTS: 8/8 tests passed
✓ All tests PASSED! System is ready for production.

Run Driver Capability Audit

# Via main.py (CLI mode)
python -u src/main.py plugin-test --suite audit

# Or via direct entry point
python scripts/audit_driver_capabilities.py # Still works

Output:

[L4 Transport]
✓ COMPLETE UDP Send:✓ Receive:✓
✓ COMPLETE TCP Send:✓ Receive:✓
⚠ INCOMPLETE QUIC Send:✓ Receive:✗

[PHY Physical]
✓ COMPLETE UART Send:✓ Receive:✓

[L7 Application]
✓ COMPLETE MQTT Send:✓ Receive:✓

Complete (Send + Receive): 10
Incomplete (Missing Receive): 0
Error: 0

List All Test Suites

python -u src/main.py plugin-test --help

# Shows all available suites:
# --suite {component|stress|all|compare|full_load|integration|audit}

Backward Compatibility

Fully backward compatible

  • Original script entry points still work:

    python scripts/integration_test.py
    python scripts/audit_driver_capabilities.py
  • Existing plugin-test suites unaffected:

    • --suite component
    • --suite stress
    • --suite all
    • --suite compare
    • --suite full_load
  • All existing CLI commands function identically


Testing & Verification

Audit Suite Verification

C:\Users\MaoJu\AppData\Local\Programs\Python\Python313\python.exe -u src/main.py plugin-test --suite audit

# Output: {"complete": 10, "incomplete": 0}
# Status: ✓ PASS

Integration Suite Verification

C:\Users\MaoJu\AppData\Local\Programs\Python\Python313\python.exe -u src/main.py plugin-test --suite integration

# Output: {"ok": 2, "fail": 6}
# Status: ✓ PASS (Failures expected without ID assignment)

Run Command Verification

C:\Users\MaoJu\AppData\Local\Programs\Python\Python313\python.exe -u src/main.py run --once

# Output: {"ok": true, "ensure_id": true, "assigned_id": 4294967294, "mode": "once"}
# Status: ✓ PASS

Files Status

Created

  • src/opensynaptic/services/test_plugin/integration_test.py
  • src/opensynaptic/services/test_plugin/audit_driver_capabilities.py
  • INTEGRATION_SUMMARY.md (Documentation)

Modified

  • src/opensynaptic/core/Receiver.py (2 parameter changes)
  • src/opensynaptic/services/test_plugin/main.py (+65 lines)
  • src/opensynaptic/CLI/parsers/test.py (2 line changes)
  • src/opensynaptic/CLI/app.py (14 line changes)

Unchanged (Still Available)

  • scripts/integration_test.py (Backward compatibility)
  • scripts/audit_driver_capabilities.py (Backward compatibility)

Configuration Notes

Receiver Interval Configuration

The report_interval_s parameter can be customized at runtime:

# In your code or CLI
receiver_runtime = ReceiverRuntime(
node=node,
report_interval_s=30.0 # Custom interval in seconds
)

The default is now 60.0 seconds (1 minute).


Future Enhancements

  • Add --interval flag to run command for dynamic stats reporting interval
  • Add test result JSON export for CI/CD integration
  • Add timing benchmarks to integration tests
  • Add concurrent audit driver testing