mcbluetooth-esp32/tests/prompts/test-prompt-v5.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

10 KiB

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)

  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 with Battery Service (Tests 30-42)

Set up ESP32 as a BLE peripheral with Environmental Sensing AND Battery Service:

  1. Enable BLE: Call esp32_ble_enable

First, add Battery Service (0x180F) for bt_ble_battery test:

  1. Add Battery Service: Call esp32_gatt_add_service with uuid="0000180f-0000-1000-8000-00805f9b34fb" (Battery Service), primary=true — save as battery_svc_handle
  2. 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
  3. Set Battery Level: Call esp32_gatt_set_value with char_handle=battery_char_handle, value="4b" (75%)

Now add Environmental Sensing Service:

  1. Add Env Service: Call esp32_gatt_add_service with uuid="0000181a-0000-1000-8000-00805f9b34fb" (Environmental Sensing), primary=true — save as env_svc_handle
  2. 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
  3. 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
  4. Set Temperature: Call esp32_gatt_set_value with char_handle=temp_handle, value="e803" (25.0°C)
  5. Set Humidity: Call esp32_gatt_set_value with char_handle=humidity_handle, value="3200" (50%)

Configure advertising:

  1. 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"]
  2. Start Advertising: Call esp32_ble_advertise with enable=true
  3. Clear Events: Call esp32_clear_events — clear event history before BLE tests
  4. 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:

  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 Battery (180f) and Environmental Sensing (181a)
  2. List Characteristics: Call bt_ble_characteristics with adapter="hci1", address= — should see Battery Level (2a19), Temperature (2a6e), Humidity (2a6f)
  3. Read Battery Level: Call bt_ble_battery with adapter="hci1", address= — should return 75 (the value we set as "4b")
  4. Read Temperature: Call bt_ble_read with adapter="hci1", address=, char_uuid="00002a6e-0000-1000-8000-00805f9b34fb" — should return hex "e803"
  5. Check Read Events: Call esp32_get_events — look for gatt_read events

Stop capture for analysis:

Phase 7: Analyze HCI Capture (Tests 52-55)

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

  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 64-68)

  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 69-73)

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 69>
  5. Disable Discoverable: Call bt_adapter_discoverable with adapter="hci1", on=false — clean up

Phase 11: Final Cleanup (Tests 74-76)

  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 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