ble-reticulum/tests
Torlando d475432cb0
fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30)
* fix(ble): Increase D-Bus monitoring intervals to prevent HCI errors

The D-Bus monitoring threads were polling too frequently (0.5s and 30s),
causing HCI command collisions on BCM43xx single-radio chips. These chips
cannot handle concurrent BLE operations, and the frequent D-Bus activity
was interfering with scan/advertise cycles.

Changes:
- Increase D-Bus disconnect monitor interval from 0.5s to 5s
- Increase stale connection poll interval from 30s to 120s

This eliminates HCI errors (Opcode 0x2005/0x2006) while preserving
disconnect detection functionality with slightly higher latency.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor(ble): Convert D-Bus monitoring to event-driven approach

Replace polling-based D-Bus monitoring with true event-driven pattern:

1. D-Bus monitor thread:
   - Use asyncio.Event instead of periodic sleep
   - Store loop reference for thread-safe shutdown
   - Use call_soon_threadsafe to wake loop on stop

2. Stale poll thread:
   - Replace busy-wait loop (240 x 0.5s) with single Event.wait()
   - Increase interval from 120s to 300s (safety net only)
   - Immediate response to stop signal

Benefits:
- Zero CPU usage while waiting (no periodic wakeups)
- Immediate shutdown response (ms instead of 5s)
- Cleaner, simpler code
- Maintains disconnect detection via D-Bus signals

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(ble): Add comprehensive unit tests for HCI error fixes

Add 26 new unit tests for the event-driven D-Bus monitoring fixes
that eliminated HCI errors on BCM43xx single-radio chips.

Test coverage:
- TestEventDrivenDBusMonitor: Tests asyncio.Event usage, immediate
  wake response, call_soon_threadsafe cross-thread signaling
- TestStalePollImprovements: Tests threading.Event.wait() usage,
  300s interval, immediate stop response
- TestStopShutdownBehavior: Tests stop() async signaling, RuntimeError
  handling, shutdown latency improvement
- TestIntegrationScenarios: Tests full lifecycle, multiple stop calls
- TestCodeVerification: Verifies actual source patterns match expected

All 26 tests pass without requiring pytest-asyncio plugin.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(tests): Use threading.RLock instead of asyncio.Lock in test fixtures

In Python 3.8/3.9, asyncio.Lock() requires a running event loop. When
test_hci_error_fixes.py runs first (alphabetically) and uses asyncio.run(),
it closes the event loop after each test. Subsequent test fixtures that
create asyncio.Lock() then fail with "no current event loop" errors.

Since these are mock fixtures that don't need async semantics, use
threading.RLock() instead.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(tests): Replace all asyncio.Lock() with threading.RLock() in test mocks

asyncio.Lock() requires a running event loop in Python 3.8/3.9. When
test files using asyncio.run() execute first, the event loop is closed,
causing subsequent test fixtures to fail when creating asyncio.Lock().

Fixed in:
- test_peripheral_disconnect_cleanup.py (mock_gatt_server fixture)
- test_bluez_state_cleanup.py (mock_driver fixture)
- test_ble_peer_interface.py (create_mock_peer_interface helper)
- conftest.py (create_mock_interface helper)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

---------

Co-authored-by: torlando-tech <torlando-tech@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 00:46:06 -05:00
..
conftest.py fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30) 2025-12-29 00:46:06 -05:00
mock_ble_driver.py fix(ble): Prevent data loss from peripheral reassembler race condition 2025-11-26 12:21:42 -05:00
test_ble_peer_interface.py fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30) 2025-12-29 00:46:06 -05:00
test_bleak_threading_hang.py Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
test_bleak_with_exec_loading.py Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
test_bluez_state_cleanup.py fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30) 2025-12-29 00:46:06 -05:00
test_breddr_fallback_prevention.py fix(ble): Clarify ConnectDevice() object path return as success 2025-11-10 19:47:34 -05:00
test_config_directory.py fix: support custom config directories via RNS.Reticulum.configdir 2025-10-28 19:09:48 -04:00
test_dbus_disconnect_monitoring.py fix(ble): Fix D-Bus disconnect monitoring with ObjectManager and polling fallback 2025-11-12 20:10:44 -05:00
test_error_recovery.py Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
test_fragmentation.py Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
test_gatt_server.py Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
test_gatt_server_readiness.py fix(ble): Add D-Bus verification to prevent GATT server initialization race 2025-11-10 19:51:23 -05:00
test_hci_error_fixes.py fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30) 2025-12-29 00:46:06 -05:00
test_identity_mapping_cleanup.py fix: Clean up identity mappings on disconnect to prevent stale connections 2025-11-13 15:37:54 -05:00
test_installer.sh refactor: make libffi-dev conditional for armhf (32-bit ARM) only 2025-10-29 11:02:51 -04:00
test_integration.py test: Add comprehensive v2.2 protocol test suites 2025-11-07 23:00:30 -05:00
test_multi_device_simulation.py Initial commit: BLE Reticulum interface 2025-10-26 19:14:14 -04:00
test_peripheral_disconnect_cleanup.py fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30) 2025-12-29 00:46:06 -05:00
test_prioritization.py test: Update integration tests for driver abstraction refactor 2025-11-07 22:48:38 -05:00
test_scanner_connection_coordination.py fix(ble): Event-driven D-Bus monitoring to eliminate HCI errors on BCM43xx chips (#30) 2025-12-29 00:46:06 -05:00
test_stale_connection_polling.py fix(ci): Fix integration test failures and installer container detection 2025-11-15 20:05:17 -05:00
test_v2_2_identity_handshake.py fix(ble): Prevent data loss from peripheral reassembler race condition 2025-11-26 12:21:42 -05:00
test_v2_2_mac_sorting.py test(ble): Add MAC rotation bypass tests and fix existing test expectations 2025-12-11 12:33:06 -05:00
test_v2_2_race_conditions.py test: Add comprehensive v2.2 protocol test suites 2025-11-07 23:00:30 -05:00