- docs/automated-e2e-testing.md: Guide for running headless Claude CLI tests with both mcbluetooth and mcbluetooth-esp32 MCP servers - tests/prompts/test-prompt-v4.md: 71-test suite covering Classic BT, BLE GATT, HCI capture, device management - tests/prompts/test-prompt-v5.md: 76-test suite adding Battery Service (0x180F) and bt_ble_battery verification Test results from v4: 71/71 PASS with 143 HCI packets captured
171 lines
10 KiB
Markdown
171 lines
10 KiB
Markdown
# ESP32 + BlueZ Full E2E Bluetooth Test Suite (v5 - Complete Coverage)
|
|
|
|
You have two MCP servers available:
|
|
- **esp32** (prefix: `mcp__esp32__`) — controls an ESP32 dev board via serial/UART
|
|
- **bluez** (prefix: `mcp__bluez__`) — controls the Linux BlueZ Bluetooth stack
|
|
|
|
Run ALL tests IN ORDER. For each test, report PASS or FAIL with actual response data.
|
|
If a test fails, note the error and continue with remaining tests.
|
|
|
|
**Important**: The Linux adapter is `hci1` (not hci0). Use `hci1` for all BlueZ calls.
|
|
|
|
---
|
|
|
|
## Phase 1: ESP32 Connection & System (Tests 1-4)
|
|
|
|
1. **Connect**: Call `esp32_connect` — should return connected=true AND ready=true
|
|
2. **Ping**: Call `esp32_ping` — expect `{"pong": true}`
|
|
3. **Get Info**: Call `esp32_get_info` — note the chip model, FW version, and BT MAC address (you'll need the MAC later)
|
|
4. **Get Status**: Call `esp32_status` — confirm bt_enabled=false, ble_enabled=false
|
|
|
|
## Phase 2: BlueZ Adapter Deep Dive (Tests 5-8)
|
|
|
|
5. **List Adapters**: Call `bt_list_adapters` — find the powered adapter, note its name (probably hci1)
|
|
6. **Adapter Info**: Call `bt_adapter_info` with the adapter name — report full details including the adapter's MAC address
|
|
7. **Set Pairable**: Call `bt_adapter_pairable` with adapter, on=true — enable pairing acceptance
|
|
8. **Set Discoverable**: Call `bt_adapter_discoverable` with adapter, on=true, timeout=300 — make Linux visible
|
|
|
|
## Phase 3: Classic BT + SSP Pairing (Tests 9-24)
|
|
|
|
IMPORTANT: Enable Classic BT FIRST, then configure IO capabilities.
|
|
|
|
9. **Enable Classic**: Call `esp32_classic_enable`
|
|
10. **Configure ESP32**: Call `esp32_configure` with name="SSP-Test-Device", io_cap="display_yesno"
|
|
11. **Set SSP Mode**: Call `esp32_set_ssp_mode` with mode="numeric_comparison", auto_accept=true
|
|
12. **Check Status**: Call `esp32_status` — confirm bt_enabled=true
|
|
13. **Set ESP32 Discoverable**: Call `esp32_classic_set_discoverable` with discoverable=true, timeout=120
|
|
14. **Scan from Linux**: Call `bt_scan` with adapter="hci1", mode="classic", timeout=10 — find the ESP32 by its MAC
|
|
|
|
Now initiate pairing:
|
|
|
|
15. **Check Pairing Status Before**: Call `bt_pairing_status` — should show no pending requests
|
|
16. **Start Pairing**: Call `bt_pair` with adapter="hci1", address=<ESP32 MAC>, pairing_mode="auto"
|
|
17. **Check ESP32 Pair Events**: Call `esp32_get_events` — look for pair_request and pair_complete events
|
|
18. **Verify Paired on Linux**: Call `bt_device_info` with adapter="hci1", address=<ESP32 MAC> — check paired=true
|
|
|
|
Post-pairing device management:
|
|
|
|
19. **List Known Devices**: Call `bt_list_devices` with adapter="hci1", filter="paired" — ESP32 should be in the list
|
|
20. **Trust Device**: Call `bt_trust` with adapter="hci1", address=<ESP32 MAC>, trusted=true
|
|
21. **Set Alias**: Call `bt_device_set_alias` with adapter="hci1", address=<ESP32 MAC>, alias="My ESP32 Test Device"
|
|
22. **Block Device**: Call `bt_block` with adapter="hci1", address=<ESP32 MAC>, blocked=true — block the device
|
|
23. **Unblock Device**: Call `bt_block` with adapter="hci1", address=<ESP32 MAC>, blocked=false — unblock it
|
|
24. **Unpair**: Call `bt_unpair` with adapter="hci1", address=<ESP32 MAC> — clean up pairing
|
|
|
|
## Phase 4: Classic Cleanup + Event System (Tests 25-29)
|
|
|
|
25. **Disable Classic**: Call `esp32_classic_disable`
|
|
26. **Get All Events**: Call `esp32_get_events` — report ALL events captured so far
|
|
27. **Clear Events**: Call `esp32_clear_events`
|
|
28. **Verify Cleared**: Call `esp32_get_events` — should return empty list
|
|
29. **Check Status**: Call `esp32_status` — confirm bt_enabled=false
|
|
|
|
## Phase 5: BLE GATT Setup with Battery Service (Tests 30-42)
|
|
|
|
Set up ESP32 as a BLE peripheral with Environmental Sensing AND Battery Service:
|
|
|
|
30. **Enable BLE**: Call `esp32_ble_enable`
|
|
|
|
First, add Battery Service (0x180F) for bt_ble_battery test:
|
|
|
|
31. **Add Battery Service**: Call `esp32_gatt_add_service` with uuid="0000180f-0000-1000-8000-00805f9b34fb" (Battery Service), primary=true — save as battery_svc_handle
|
|
32. **Add Battery Level Char**: Call `esp32_gatt_add_characteristic` with service_handle=battery_svc_handle, uuid="00002a19-0000-1000-8000-00805f9b34fb" (Battery Level), properties=["read"] — save as battery_char_handle
|
|
33. **Set Battery Level**: Call `esp32_gatt_set_value` with char_handle=battery_char_handle, value="4b" (75%)
|
|
|
|
Now add Environmental Sensing Service:
|
|
|
|
34. **Add Env Service**: Call `esp32_gatt_add_service` with uuid="0000181a-0000-1000-8000-00805f9b34fb" (Environmental Sensing), primary=true — save as env_svc_handle
|
|
35. **Add Temperature Char**: Call `esp32_gatt_add_characteristic` with service_handle=env_svc_handle, uuid="00002a6e-0000-1000-8000-00805f9b34fb" (Temperature), properties=["read","notify"] — save as temp_handle
|
|
36. **Add Humidity Char**: Call `esp32_gatt_add_characteristic` with service_handle=env_svc_handle, uuid="00002a6f-0000-1000-8000-00805f9b34fb" (Humidity), properties=["read","write"] — save as humidity_handle
|
|
37. **Set Temperature**: Call `esp32_gatt_set_value` with char_handle=temp_handle, value="e803" (25.0°C)
|
|
38. **Set Humidity**: Call `esp32_gatt_set_value` with char_handle=humidity_handle, value="3200" (50%)
|
|
|
|
Configure advertising:
|
|
|
|
39. **Set Adv Data**: Call `esp32_ble_set_adv_data` with name="BLE-Sensor-Test", service_uuids=["0000180f-0000-1000-8000-00805f9b34fb", "0000181a-0000-1000-8000-00805f9b34fb"]
|
|
40. **Start Advertising**: Call `esp32_ble_advertise` with enable=true
|
|
41. **Clear Events**: Call `esp32_clear_events` — clear event history before BLE tests
|
|
42. **Check BLE Status**: Call `esp32_status` — confirm ble_enabled=true
|
|
|
|
## Phase 6: HCI Capture + BLE Discovery (Tests 43-51)
|
|
|
|
Start HCI packet capture BEFORE connecting:
|
|
|
|
43. **Start HCI Capture**: Call `bt_capture_start` with adapter="hci1", output_file="/tmp/ble-gatt-capture.btsnoop"
|
|
44. **List Active Captures**: Call `bt_capture_list_active` — verify capture is running
|
|
45. **BLE Scan**: Call `bt_ble_scan` with adapter="hci1", timeout=10 — find the ESP32, verify name="BLE-Sensor-Test"
|
|
46. **Connect BLE**: Call `bt_connect` with adapter="hci1", address=<ESP32 MAC>
|
|
|
|
Wait 3 seconds for service discovery to complete, then:
|
|
|
|
47. **List Services**: Call `bt_ble_services` with adapter="hci1", address=<ESP32 MAC> — should see Battery (180f) and Environmental Sensing (181a)
|
|
48. **List Characteristics**: Call `bt_ble_characteristics` with adapter="hci1", address=<ESP32 MAC> — should see Battery Level (2a19), Temperature (2a6e), Humidity (2a6f)
|
|
49. **Read Battery Level**: Call `bt_ble_battery` with adapter="hci1", address=<ESP32 MAC> — should return 75 (the value we set as "4b")
|
|
50. **Read Temperature**: Call `bt_ble_read` with adapter="hci1", address=<ESP32 MAC>, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should return hex "e803"
|
|
51. **Check Read Events**: Call `esp32_get_events` — look for gatt_read events
|
|
|
|
Stop capture for analysis:
|
|
|
|
## Phase 7: Analyze HCI Capture (Tests 52-55)
|
|
|
|
52. **Stop HCI Capture**: Call `bt_capture_stop` with capture_id from test 43
|
|
53. **Parse Capture**: Call `bt_capture_parse` with filepath="/tmp/ble-gatt-capture.btsnoop", max_packets=50 — report packet count and types
|
|
54. **Analyze Capture**: Call `bt_capture_analyze` with filepath="/tmp/ble-gatt-capture.btsnoop" — report statistics
|
|
55. **Read Raw Packets**: Call `bt_capture_read_raw` with filepath="/tmp/ble-gatt-capture.btsnoop", count=20 — show decoded packets
|
|
|
|
## Phase 8: BLE GATT Write + Notifications (Tests 56-63)
|
|
|
|
56. **Write Humidity**: Call `bt_ble_write` with adapter="hci1", address=<ESP32 MAC>, char_uuid="00002a6f-0000-1000-8000-00805f9b34fb", value="4b00", value_type="hex"
|
|
57. **Check Write Event**: Call `esp32_get_events` — look for a gatt_write event with the written value
|
|
58. **Subscribe Notifications**: Call `bt_ble_notify` with adapter="hci1", address=<ESP32 MAC>, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb", enable=true
|
|
59. **Check Subscribe Event**: Call `esp32_get_events` — look for a gatt_subscribe event
|
|
60. **Push Notification**: First call `esp32_gatt_set_value` with char_handle=temp_handle, value="f401" (50.0°C), then call `esp32_gatt_notify` with char_handle=temp_handle
|
|
61. **Read Updated Value**: Call `bt_ble_read` with adapter="hci1", address=<ESP32 MAC>, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should now return "f401"
|
|
62. **Unsubscribe**: Call `bt_ble_notify` with adapter="hci1", address=<ESP32 MAC>, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb", enable=false
|
|
63. **Disconnect BLE**: Call `bt_disconnect` with adapter="hci1", address=<ESP32 MAC>
|
|
|
|
## Phase 9: BLE Cleanup (Tests 64-68)
|
|
|
|
64. **Stop Advertising**: Call `esp32_ble_advertise` with enable=false
|
|
65. **Clear GATT**: Call `esp32_gatt_clear`
|
|
66. **Disable BLE**: Call `esp32_ble_disable`
|
|
67. **Final Status**: Call `esp32_status` — bt_enabled=false, ble_enabled=false
|
|
68. **Clear ESP32 Events**: Call `esp32_clear_events`
|
|
|
|
## Phase 10: Adapter Self-Management (Tests 69-73)
|
|
|
|
These tests verify adapter configuration tools. Done at the end to not interfere with earlier tests.
|
|
|
|
69. **Get Original Alias**: Call `bt_adapter_info` with adapter="hci1" — note the current alias
|
|
70. **Set New Alias**: Call `bt_adapter_set_alias` with adapter="hci1", alias="E2E-Test-Adapter" — change the name
|
|
71. **Verify Alias Changed**: Call `bt_adapter_info` with adapter="hci1" — confirm alias is "E2E-Test-Adapter"
|
|
72. **Restore Original Alias**: Call `bt_adapter_set_alias` with adapter="hci1", alias=<original alias from test 69>
|
|
73. **Disable Discoverable**: Call `bt_adapter_discoverable` with adapter="hci1", on=false — clean up
|
|
|
|
## Phase 11: Final Cleanup (Tests 74-76)
|
|
|
|
74. **Reset ESP32**: Call `esp32_reset`
|
|
75. **Disconnect Serial**: Call `esp32_disconnect`
|
|
76. **Final Adapter Check**: Call `bt_adapter_info` with adapter="hci1" — verify adapter is still powered and healthy
|
|
|
|
---
|
|
|
|
## Summary
|
|
|
|
After all tests, print a DETAILED summary table:
|
|
|
|
| # | Test | Result | Notes |
|
|
|---|------|--------|-------|
|
|
| 1 | Connect | PASS/FAIL | ... |
|
|
| ... | ... | ... | ... |
|
|
|
|
Report:
|
|
- Total PASS/FAIL counts
|
|
- Whether pairing succeeded (phase 3)
|
|
- What ESP32 events were captured (phases 4, 6, 8)
|
|
- Whether bt_ble_battery returned the expected value 75 (test 49)
|
|
- Whether GATT read returned expected value (test 50)
|
|
- Whether GATT write succeeded (test 56)
|
|
- Whether the updated value was readable after notification (test 61)
|
|
- HCI capture statistics (tests 53-55): packet count, types captured, any errors
|