mcbluetooth-esp32/tests/prompts/test-prompt-v4.md
Ryan Malloy 88d006e9c4 Add automated E2E testing documentation and test prompts
- 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
2026-02-03 11:18:37 -07:00

9.3 KiB

ESP32 + BlueZ Full E2E Bluetooth Test Suite (v4 - Extended 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)

  1. List Adapters: Call bt_list_adapters — find the powered adapter, note its name (probably hci1)
  2. Adapter Info: Call bt_adapter_info with the adapter name — report full details including the adapter's MAC address
  3. Set Pairable: Call bt_adapter_pairable with adapter, on=true — enable pairing acceptance
  4. 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.

  1. Enable Classic: Call esp32_classic_enable
  2. Configure ESP32: Call esp32_configure with name="SSP-Test-Device", io_cap="display_yesno"
  3. Set SSP Mode: Call esp32_set_ssp_mode with mode="numeric_comparison", auto_accept=true
  4. Check Status: Call esp32_status — confirm bt_enabled=true
  5. Set ESP32 Discoverable: Call esp32_classic_set_discoverable with discoverable=true, timeout=120
  6. Scan from Linux: Call bt_scan with adapter="hci1", mode="classic", timeout=10 — find the ESP32 by its MAC

Now initiate pairing:

  1. Check Pairing Status Before: Call bt_pairing_status — should show no pending requests
  2. Start Pairing: Call bt_pair with adapter="hci1", address=, pairing_mode="auto"
  3. Check ESP32 Pair Events: Call esp32_get_events — look for pair_request and pair_complete events
  4. Verify Paired on Linux: Call bt_device_info with adapter="hci1", address= — check paired=true

Post-pairing device management:

  1. List Known Devices: Call bt_list_devices with adapter="hci1", filter="paired" — ESP32 should be in the list
  2. Trust Device: Call bt_trust with adapter="hci1", address=, trusted=true
  3. Set Alias: Call bt_device_set_alias with adapter="hci1", address=, alias="My ESP32 Test Device"
  4. Block Device: Call bt_block with adapter="hci1", address=, blocked=true — block the device
  5. Unblock Device: Call bt_block with adapter="hci1", address=, blocked=false — unblock it
  6. Unpair: Call bt_unpair with adapter="hci1", address= — clean up pairing

Phase 4: Classic Cleanup + Event System (Tests 25-29)

  1. Disable Classic: Call esp32_classic_disable
  2. Get All Events: Call esp32_get_events — report ALL events captured so far
  3. Clear Events: Call esp32_clear_events
  4. Verify Cleared: Call esp32_get_events — should return empty list
  5. Check Status: Call esp32_status — confirm bt_enabled=false

Phase 5: BLE GATT Setup (Tests 30-38)

Set up ESP32 as a BLE peripheral with multiple characteristics:

  1. Enable BLE: Call esp32_ble_enable
  2. Add Service: Call esp32_gatt_add_service with uuid="0000181a-0000-1000-8000-00805f9b34fb" (Environmental Sensing), primary=true — save the service_handle
  3. Add Read+Notify Char: Call esp32_gatt_add_characteristic with the service_handle, uuid="00002a6e-0000-1000-8000-00805f9b34fb" (Temperature), properties=["read","notify"] — save as temp_handle
  4. Add Read+Write Char: Call esp32_gatt_add_characteristic with the service_handle, uuid="00002a6f-0000-1000-8000-00805f9b34fb" (Humidity), properties=["read","write"] — save as humidity_handle
  5. Set Temperature: Call esp32_gatt_set_value with char_handle=temp_handle, value="e803" (25.0°C)
  6. Set Humidity: Call esp32_gatt_set_value with char_handle=humidity_handle, value="3200" (50%)
  7. Set Adv Data: Call esp32_ble_set_adv_data with name="BLE-Sensor-Test", service_uuids=["0000181a-0000-1000-8000-00805f9b34fb"]
  8. Start Advertising: Call esp32_ble_advertise with enable=true
  9. Clear Events: Call esp32_clear_events — clear event history before BLE tests

Phase 6: HCI Capture + BLE Discovery (Tests 39-47)

Start HCI packet capture BEFORE connecting, then analyze it afterwards:

  1. Start HCI Capture: Call bt_capture_start with adapter="hci1", output_file="/tmp/ble-gatt-capture.btsnoop"
  2. List Active Captures: Call bt_capture_list_active — verify capture is running
  3. BLE Scan: Call bt_ble_scan with adapter="hci1", timeout=10 — find the ESP32, verify name="BLE-Sensor-Test"
  4. Connect BLE: Call bt_connect with adapter="hci1", address=

Wait 3 seconds for service discovery to complete, then:

  1. List Services: Call bt_ble_services with adapter="hci1", address= — should see Environmental Sensing (181a)
  2. List Characteristics: Call bt_ble_characteristics with adapter="hci1", address= — should see Temperature (2a6e) and Humidity (2a6f)
  3. Read Temperature: Call bt_ble_read with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should return hex "e803"
  4. Check Read Event on ESP32: Call esp32_get_events — look for a gatt_read event
  5. Stop HCI Capture: Call bt_capture_stop with capture_id from test 39

Phase 7: Analyze HCI Capture (Tests 48-50)

  1. Parse Capture: Call bt_capture_parse with filepath="/tmp/ble-gatt-capture.btsnoop", max_packets=50 — report packet count and types
  2. Analyze Capture: Call bt_capture_analyze with filepath="/tmp/ble-gatt-capture.btsnoop" — report statistics
  3. 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 51-58)

  1. Write Humidity: Call bt_ble_write with adapter="hci1", address=, char_uuid="00002a6f-0000-1000-8000-00805f9b34fb", value="4b00", value_type="hex"
  2. Check Write Event: Call esp32_get_events — look for a gatt_write event with the written value
  3. Subscribe Notifications: Call bt_ble_notify with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb", enable=true
  4. Check Subscribe Event: Call esp32_get_events — look for a gatt_subscribe event
  5. 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
  6. Read Updated Value: Call bt_ble_read with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should now return "f401"
  7. Unsubscribe: Call bt_ble_notify with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb", enable=false
  8. Disconnect BLE: Call bt_disconnect with adapter="hci1", address=

Phase 9: BLE Cleanup (Tests 59-63)

  1. Stop Advertising: Call esp32_ble_advertise with enable=false
  2. Clear GATT: Call esp32_gatt_clear
  3. Disable BLE: Call esp32_ble_disable
  4. Final Status: Call esp32_status — bt_enabled=false, ble_enabled=false
  5. Clear ESP32 Events: Call esp32_clear_events

Phase 10: Adapter Self-Management (Tests 64-68)

These tests verify adapter configuration tools. Done at the end to not interfere with earlier tests.

  1. Get Original Alias: Call bt_adapter_info with adapter="hci1" — note the current alias
  2. Set New Alias: Call bt_adapter_set_alias with adapter="hci1", alias="E2E-Test-Adapter" — change the name
  3. Verify Alias Changed: Call bt_adapter_info with adapter="hci1" — confirm alias is "E2E-Test-Adapter"
  4. Restore Original Alias: Call bt_adapter_set_alias with adapter="hci1", alias=<original alias from test 64>
  5. Disable Discoverable: Call bt_adapter_discoverable with adapter="hci1", on=false — clean up

Phase 11: Final Cleanup (Tests 69-71)

  1. Reset ESP32: Call esp32_reset
  2. Disconnect Serial: Call esp32_disconnect
  3. 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 GATT read returned expected value (test 45)
  • Whether GATT write succeeded (test 51)
  • Whether the updated value was readable after notification (test 56)
  • HCI capture statistics (tests 48-50): packet count, types captured, any errors