1*1d3bd1e5SMatthias Ringwald 2*1d3bd1e5SMatthias Ringwald // ***************************************************************************** 3*1d3bd1e5SMatthias Ringwald // 4*1d3bd1e5SMatthias Ringwald // test rfcomm query tests 5*1d3bd1e5SMatthias Ringwald // 6*1d3bd1e5SMatthias Ringwald // ***************************************************************************** 7*1d3bd1e5SMatthias Ringwald 8*1d3bd1e5SMatthias Ringwald 9*1d3bd1e5SMatthias Ringwald #include <stdint.h> 10*1d3bd1e5SMatthias Ringwald #include <stdio.h> 11*1d3bd1e5SMatthias Ringwald #include <stdlib.h> 12*1d3bd1e5SMatthias Ringwald #include <string.h> 13*1d3bd1e5SMatthias Ringwald 14*1d3bd1e5SMatthias Ringwald #include "CppUTest/TestHarness.h" 15*1d3bd1e5SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 16*1d3bd1e5SMatthias Ringwald #include "CppUTestExt/MockSupport.h" 17*1d3bd1e5SMatthias Ringwald 18*1d3bd1e5SMatthias Ringwald #include "hci_cmd.h" 19*1d3bd1e5SMatthias Ringwald 20*1d3bd1e5SMatthias Ringwald #include "btstack_memory.h" 21*1d3bd1e5SMatthias Ringwald #include "hci.h" 22*1d3bd1e5SMatthias Ringwald #include "ble/gatt_client.h" 23*1d3bd1e5SMatthias Ringwald #include "btstack_event.h" 24*1d3bd1e5SMatthias Ringwald 25*1d3bd1e5SMatthias Ringwald static uint8_t advertisement_received; 26*1d3bd1e5SMatthias Ringwald static uint8_t connected; 27*1d3bd1e5SMatthias Ringwald static uint8_t advertisement_packet[150]; 28*1d3bd1e5SMatthias Ringwald static btstack_packet_callback_registration_t hci_event_callback_registration; 29*1d3bd1e5SMatthias Ringwald 30*1d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_hci_state_working(void); 31*1d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_command_complete(const hci_cmd_t *cmd); 32*1d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_scan_response(void); 33*1d3bd1e5SMatthias Ringwald extern "C" void mock_simulate_connected(void); 34*1d3bd1e5SMatthias Ringwald 35*1d3bd1e5SMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ 36*1d3bd1e5SMatthias Ringwald for (int i=0; i<size; i++){ 37*1d3bd1e5SMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]); 38*1d3bd1e5SMatthias Ringwald } 39*1d3bd1e5SMatthias Ringwald } 40*1d3bd1e5SMatthias Ringwald 41*1d3bd1e5SMatthias Ringwald // ----------------------------------------------------- 42*1d3bd1e5SMatthias Ringwald 43*1d3bd1e5SMatthias Ringwald static void handle_hci_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 44*1d3bd1e5SMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return; 45*1d3bd1e5SMatthias Ringwald 46*1d3bd1e5SMatthias Ringwald bd_addr_t address; 47*1d3bd1e5SMatthias Ringwald uint8_t event = packet[0]; 48*1d3bd1e5SMatthias Ringwald switch (event) { 49*1d3bd1e5SMatthias Ringwald case GAP_EVENT_ADVERTISING_REPORT:{ 50*1d3bd1e5SMatthias Ringwald advertisement_received = 1; 51*1d3bd1e5SMatthias Ringwald memcpy(advertisement_packet, packet, size); 52*1d3bd1e5SMatthias Ringwald gap_event_advertising_report_get_address(packet, address); 53*1d3bd1e5SMatthias Ringwald gap_connect(address, (bd_addr_type_t)packet[3]); 54*1d3bd1e5SMatthias Ringwald break; 55*1d3bd1e5SMatthias Ringwald } 56*1d3bd1e5SMatthias Ringwald case HCI_EVENT_LE_META: 57*1d3bd1e5SMatthias Ringwald // wait for connection complete 58*1d3bd1e5SMatthias Ringwald if (hci_event_le_meta_get_subevent_code(packet) != HCI_SUBEVENT_LE_CONNECTION_COMPLETE) break; 59*1d3bd1e5SMatthias Ringwald connected = 1; 60*1d3bd1e5SMatthias Ringwald break; 61*1d3bd1e5SMatthias Ringwald case HCI_EVENT_DISCONNECTION_COMPLETE: 62*1d3bd1e5SMatthias Ringwald exit(0); 63*1d3bd1e5SMatthias Ringwald break; 64*1d3bd1e5SMatthias Ringwald default: 65*1d3bd1e5SMatthias Ringwald break; 66*1d3bd1e5SMatthias Ringwald } 67*1d3bd1e5SMatthias Ringwald } 68*1d3bd1e5SMatthias Ringwald 69*1d3bd1e5SMatthias Ringwald 70*1d3bd1e5SMatthias Ringwald TEST_GROUP(LECentral){ 71*1d3bd1e5SMatthias Ringwald void setup(void){ 72*1d3bd1e5SMatthias Ringwald advertisement_received = 0; 73*1d3bd1e5SMatthias Ringwald connected = 0; 74*1d3bd1e5SMatthias Ringwald // register for HCI events 75*1d3bd1e5SMatthias Ringwald hci_event_callback_registration.callback = &handle_hci_event; 76*1d3bd1e5SMatthias Ringwald hci_add_event_handler(&hci_event_callback_registration); 77*1d3bd1e5SMatthias Ringwald 78*1d3bd1e5SMatthias Ringwald l2cap_init(); 79*1d3bd1e5SMatthias Ringwald 80*1d3bd1e5SMatthias Ringwald mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1); 81*1d3bd1e5SMatthias Ringwald mock_simulate_hci_state_working(); 82*1d3bd1e5SMatthias Ringwald } 83*1d3bd1e5SMatthias Ringwald 84*1d3bd1e5SMatthias Ringwald void teardown(void){ 85*1d3bd1e5SMatthias Ringwald mock().clear(); 86*1d3bd1e5SMatthias Ringwald } 87*1d3bd1e5SMatthias Ringwald }; 88*1d3bd1e5SMatthias Ringwald 89*1d3bd1e5SMatthias Ringwald 90*1d3bd1e5SMatthias Ringwald 91*1d3bd1e5SMatthias Ringwald TEST(LECentral, TestScanningAndConnect){ 92*1d3bd1e5SMatthias Ringwald uint8_t expected_bt_addr[] = {0x34, 0xB1, 0xF7, 0xD1, 0x77, 0x9B}; 93*1d3bd1e5SMatthias Ringwald 94*1d3bd1e5SMatthias Ringwald mock_simulate_scan_response(); 95*1d3bd1e5SMatthias Ringwald 96*1d3bd1e5SMatthias Ringwald CHECK(advertisement_received); 97*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0xE2, advertisement_packet[2]); // event type 98*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0x01, advertisement_packet[3]); // address type 99*1d3bd1e5SMatthias Ringwald CHECK_EQUAL_ARRAY(expected_bt_addr, &advertisement_packet[4], 6); 100*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0xCC, advertisement_packet[10]); // rssi 101*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(0x09, advertisement_packet[11]); // data size 102*1d3bd1e5SMatthias Ringwald 103*1d3bd1e5SMatthias Ringwald for (int i=0; i<0x09; i++){ // data 104*1d3bd1e5SMatthias Ringwald CHECK_EQUAL(i, advertisement_packet[12+i]); 105*1d3bd1e5SMatthias Ringwald } 106*1d3bd1e5SMatthias Ringwald mock_simulate_connected(); 107*1d3bd1e5SMatthias Ringwald CHECK(connected); 108*1d3bd1e5SMatthias Ringwald } 109*1d3bd1e5SMatthias Ringwald 110*1d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){ 111*1d3bd1e5SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 112*1d3bd1e5SMatthias Ringwald } 113