1*d3762d15SMatthias Ringwald #include <stdint.h> 2*d3762d15SMatthias Ringwald #include <stdio.h> 3*d3762d15SMatthias Ringwald #include <stdlib.h> 4*d3762d15SMatthias Ringwald #include <string.h> 5*d3762d15SMatthias Ringwald 6*d3762d15SMatthias Ringwald #include "CppUTest/TestHarness.h" 7*d3762d15SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 8*d3762d15SMatthias Ringwald #include "CppUTestExt/MockSupport.h" 9*d3762d15SMatthias Ringwald 10*d3762d15SMatthias Ringwald #include "hci_cmd.h" 11*d3762d15SMatthias Ringwald 12*d3762d15SMatthias Ringwald #include "btstack_memory.h" 13*d3762d15SMatthias Ringwald #include "hci.h" 14*d3762d15SMatthias Ringwald #include "ble/gatt_client.h" 15*d3762d15SMatthias Ringwald #include "btstack_event.h" 16*d3762d15SMatthias Ringwald #include "hci_dump.h" 17*d3762d15SMatthias Ringwald #include "hci_dump_posix_fs.h" 18*d3762d15SMatthias Ringwald #include "btstack_debug.h" 19*d3762d15SMatthias Ringwald 20*d3762d15SMatthias Ringwald typedef struct { 21*d3762d15SMatthias Ringwald uint8_t type; 22*d3762d15SMatthias Ringwald uint16_t size; 23*d3762d15SMatthias Ringwald uint8_t buffer[258]; 24*d3762d15SMatthias Ringwald } hci_packet_t; 25*d3762d15SMatthias Ringwald 26*d3762d15SMatthias Ringwald #define MAX_HCI_PACKETS 10 27*d3762d15SMatthias Ringwald static uint16_t transport_count_packets; 28*d3762d15SMatthias Ringwald static hci_packet_t transport_packets[MAX_HCI_PACKETS]; 29*d3762d15SMatthias Ringwald 30*d3762d15SMatthias Ringwald static void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size); 31*d3762d15SMatthias Ringwald 32*d3762d15SMatthias Ringwald static const uint8_t packet_sent_event[] = { HCI_EVENT_TRANSPORT_PACKET_SENT, 0}; 33*d3762d15SMatthias Ringwald 34*d3762d15SMatthias Ringwald static int hci_transport_test_set_baudrate(uint32_t baudrate){ 35*d3762d15SMatthias Ringwald return 0; 36*d3762d15SMatthias Ringwald } 37*d3762d15SMatthias Ringwald 38*d3762d15SMatthias Ringwald static int hci_transport_test_can_send_now(uint8_t packet_type){ 39*d3762d15SMatthias Ringwald return 1; 40*d3762d15SMatthias Ringwald } 41*d3762d15SMatthias Ringwald 42*d3762d15SMatthias Ringwald static int hci_transport_test_send_packet(uint8_t packet_type, uint8_t * packet, int size){ 43*d3762d15SMatthias Ringwald btstack_assert(transport_count_packets < MAX_HCI_PACKETS); 44*d3762d15SMatthias Ringwald memcpy(transport_packets[transport_count_packets].buffer, packet, size); 45*d3762d15SMatthias Ringwald transport_packets[transport_count_packets].type = packet_type; 46*d3762d15SMatthias Ringwald transport_packets[transport_count_packets].size = size; 47*d3762d15SMatthias Ringwald transport_count_packets++; 48*d3762d15SMatthias Ringwald // notify upper stack that it can send again 49*d3762d15SMatthias Ringwald packet_handler(HCI_EVENT_PACKET, (uint8_t *) &packet_sent_event[0], sizeof(packet_sent_event)); 50*d3762d15SMatthias Ringwald return 0; 51*d3762d15SMatthias Ringwald } 52*d3762d15SMatthias Ringwald 53*d3762d15SMatthias Ringwald static void hci_transport_test_init(const void * transport_config){ 54*d3762d15SMatthias Ringwald } 55*d3762d15SMatthias Ringwald 56*d3762d15SMatthias Ringwald static int hci_transport_test_open(void){ 57*d3762d15SMatthias Ringwald return 0; 58*d3762d15SMatthias Ringwald } 59*d3762d15SMatthias Ringwald 60*d3762d15SMatthias Ringwald static int hci_transport_test_close(void){ 61*d3762d15SMatthias Ringwald return 0; 62*d3762d15SMatthias Ringwald } 63*d3762d15SMatthias Ringwald 64*d3762d15SMatthias Ringwald static void hci_transport_test_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){ 65*d3762d15SMatthias Ringwald packet_handler = handler; 66*d3762d15SMatthias Ringwald } 67*d3762d15SMatthias Ringwald 68*d3762d15SMatthias Ringwald static const hci_transport_t hci_transport_test = { 69*d3762d15SMatthias Ringwald /* const char * name; */ "TEST", 70*d3762d15SMatthias Ringwald /* void (*init) (const void *transport_config); */ &hci_transport_test_init, 71*d3762d15SMatthias Ringwald /* int (*open)(void); */ &hci_transport_test_open, 72*d3762d15SMatthias Ringwald /* int (*close)(void); */ &hci_transport_test_close, 73*d3762d15SMatthias Ringwald /* void (*register_packet_handler)(void (*handler)(...); */ &hci_transport_test_register_packet_handler, 74*d3762d15SMatthias Ringwald /* int (*can_send_packet_now)(uint8_t packet_type); */ &hci_transport_test_can_send_now, 75*d3762d15SMatthias Ringwald /* int (*send_packet)(...); */ &hci_transport_test_send_packet, 76*d3762d15SMatthias Ringwald /* int (*set_baudrate)(uint32_t baudrate); */ &hci_transport_test_set_baudrate, 77*d3762d15SMatthias Ringwald /* void (*reset_link)(void); */ NULL, 78*d3762d15SMatthias Ringwald /* void (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL, 79*d3762d15SMatthias Ringwald }; 80*d3762d15SMatthias Ringwald 81*d3762d15SMatthias Ringwald static uint16_t next_hci_packet; 82*d3762d15SMatthias Ringwald 83*d3762d15SMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ 84*d3762d15SMatthias Ringwald for (int i=0; i<size; i++){ 85*d3762d15SMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]); 86*d3762d15SMatthias Ringwald } 87*d3762d15SMatthias Ringwald } 88*d3762d15SMatthias Ringwald 89*d3762d15SMatthias Ringwald void CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command){ 90*d3762d15SMatthias Ringwald uint16_t actual_opcode = little_endian_read_16(transport_packets[next_hci_packet].buffer, 0); 91*d3762d15SMatthias Ringwald next_hci_packet++; 92*d3762d15SMatthias Ringwald CHECK_EQUAL(expected_hci_command->opcode, actual_opcode); 93*d3762d15SMatthias Ringwald } 94*d3762d15SMatthias Ringwald 95*d3762d15SMatthias Ringwald TEST_GROUP(HCI){ 96*d3762d15SMatthias Ringwald void setup(void){ 97*d3762d15SMatthias Ringwald transport_count_packets = 0; 98*d3762d15SMatthias Ringwald next_hci_packet = 0; 99*d3762d15SMatthias Ringwald hci_init(&hci_transport_test, NULL); 100*d3762d15SMatthias Ringwald hci_simulate_working_fuzz(); 101*d3762d15SMatthias Ringwald hci_setup_test_connections_fuzz(); 102*d3762d15SMatthias Ringwald // register for HCI events 103*d3762d15SMatthias Ringwald mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1); 104*d3762d15SMatthias Ringwald } 105*d3762d15SMatthias Ringwald void teardown(void){ 106*d3762d15SMatthias Ringwald mock().clear(); 107*d3762d15SMatthias Ringwald } 108*d3762d15SMatthias Ringwald }; 109*d3762d15SMatthias Ringwald 110*d3762d15SMatthias Ringwald TEST(HCI, GetSetConnectionRange){ 111*d3762d15SMatthias Ringwald le_connection_parameter_range_t range; 112*d3762d15SMatthias Ringwald gap_get_connection_parameter_range(&range); 113*d3762d15SMatthias Ringwald gap_set_connection_parameter_range(&range); 114*d3762d15SMatthias Ringwald } 115*d3762d15SMatthias Ringwald 116*d3762d15SMatthias Ringwald TEST(HCI, ConnectionRangeValid){ 117*d3762d15SMatthias Ringwald le_connection_parameter_range_t range = { 118*d3762d15SMatthias Ringwald 1, 10, 119*d3762d15SMatthias Ringwald 1, 10, 120*d3762d15SMatthias Ringwald 1,10 121*d3762d15SMatthias Ringwald }; 122*d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 0, 0, 0, 0)); 123*d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 0, 0, 0)); 124*d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 0, 0)); 125*d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 10, 0)); 126*d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 0)); 127*d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 11)); 128*d3762d15SMatthias Ringwald CHECK_EQUAL( 1, gap_connection_parameter_range_included(&range, 2, 9, 5, 5)); 129*d3762d15SMatthias Ringwald } 130*d3762d15SMatthias Ringwald 131*d3762d15SMatthias Ringwald TEST(HCI, NumPeripherals){ 132*d3762d15SMatthias Ringwald gap_set_max_number_peripheral_connections(1); 133*d3762d15SMatthias Ringwald } 134*d3762d15SMatthias Ringwald 135*d3762d15SMatthias Ringwald TEST(HCI, MaxAclLen){ 136*d3762d15SMatthias Ringwald hci_max_acl_data_packet_length(); 137*d3762d15SMatthias Ringwald } 138*d3762d15SMatthias Ringwald 139*d3762d15SMatthias Ringwald TEST(HCI, Flushable){ 140*d3762d15SMatthias Ringwald hci_non_flushable_packet_boundary_flag_supported(); 141*d3762d15SMatthias Ringwald } 142*d3762d15SMatthias Ringwald 143*d3762d15SMatthias Ringwald TEST(HCI, DoubleReserve){ 144*d3762d15SMatthias Ringwald CHECK_TRUE(hci_reserve_packet_buffer()); 145*d3762d15SMatthias Ringwald CHECK_FALSE(hci_reserve_packet_buffer()); 146*d3762d15SMatthias Ringwald } 147*d3762d15SMatthias Ringwald 148*d3762d15SMatthias Ringwald TEST(HCI, RemovePacketHandler){ 149*d3762d15SMatthias Ringwald hci_remove_event_handler(NULL); 150*d3762d15SMatthias Ringwald } 151*d3762d15SMatthias Ringwald 152*d3762d15SMatthias Ringwald static void dummy_fn(const void * config){}; 153*d3762d15SMatthias Ringwald TEST(HCI, SetChipset){ 154*d3762d15SMatthias Ringwald hci_set_chipset(NULL); 155*d3762d15SMatthias Ringwald btstack_chipset_t chipset_driver = { 0 }; 156*d3762d15SMatthias Ringwald hci_set_chipset(NULL); 157*d3762d15SMatthias Ringwald chipset_driver.init = dummy_fn; 158*d3762d15SMatthias Ringwald } 159*d3762d15SMatthias Ringwald 160*d3762d15SMatthias Ringwald TEST(HCI, SetControl){ 161*d3762d15SMatthias Ringwald btstack_control_t hardware_control = { .init = &dummy_fn}; 162*d3762d15SMatthias Ringwald hci_set_control(&hardware_control); 163*d3762d15SMatthias Ringwald } 164*d3762d15SMatthias Ringwald 165*d3762d15SMatthias Ringwald //TEST(HCI, Close){ 166*d3762d15SMatthias Ringwald // hci_close(); 167*d3762d15SMatthias Ringwald //} 168*d3762d15SMatthias Ringwald 169*d3762d15SMatthias Ringwald TEST(HCI, SetPublicAddress){ 170*d3762d15SMatthias Ringwald bd_addr_t addr = { 0 }; 171*d3762d15SMatthias Ringwald hci_set_bd_addr(addr); 172*d3762d15SMatthias Ringwald } 173*d3762d15SMatthias Ringwald 174*d3762d15SMatthias Ringwald TEST(HCI, DisconnectSecurityBlock){ 175*d3762d15SMatthias Ringwald hci_disconnect_security_block(HCI_CON_HANDLE_INVALID); 176*d3762d15SMatthias Ringwald hci_disconnect_security_block(3); 177*d3762d15SMatthias Ringwald } 178*d3762d15SMatthias Ringwald 179*d3762d15SMatthias Ringwald TEST(HCI, SetDuplicateFilter){ 180*d3762d15SMatthias Ringwald gap_set_scan_duplicate_filter(true); 181*d3762d15SMatthias Ringwald } 182*d3762d15SMatthias Ringwald 183*d3762d15SMatthias Ringwald TEST(HCI, ConnectCancel){ 184*d3762d15SMatthias Ringwald gap_connect_cancel(); 185*d3762d15SMatthias Ringwald } 186*d3762d15SMatthias Ringwald 187*d3762d15SMatthias Ringwald TEST(HCI, SetGapConnParams){ 188*d3762d15SMatthias Ringwald gap_set_connection_parameters(0, 0, 0, 0, 0, 0, 0, 0); 189*d3762d15SMatthias Ringwald } 190*d3762d15SMatthias Ringwald 191*d3762d15SMatthias Ringwald TEST(HCI, UpdateConnParams){ 192*d3762d15SMatthias Ringwald gap_update_connection_parameters(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0); 193*d3762d15SMatthias Ringwald gap_update_connection_parameters(5, 0, 0, 0, 0); 194*d3762d15SMatthias Ringwald } 195*d3762d15SMatthias Ringwald 196*d3762d15SMatthias Ringwald TEST(HCI, RequestConnParamUpdate){ 197*d3762d15SMatthias Ringwald gap_request_connection_parameter_update(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0); 198*d3762d15SMatthias Ringwald gap_request_connection_parameter_update(5, 0, 0, 0, 0); 199*d3762d15SMatthias Ringwald } 200*d3762d15SMatthias Ringwald 201*d3762d15SMatthias Ringwald TEST(HCI, SetScanResponse){ 202*d3762d15SMatthias Ringwald gap_scan_response_set_data(0, NULL); 203*d3762d15SMatthias Ringwald } 204*d3762d15SMatthias Ringwald 205*d3762d15SMatthias Ringwald TEST(HCI, SetAddrType){ 206*d3762d15SMatthias Ringwald hci_le_set_own_address_type(0); 207*d3762d15SMatthias Ringwald hci_le_set_own_address_type(1); 208*d3762d15SMatthias Ringwald } 209*d3762d15SMatthias Ringwald 210*d3762d15SMatthias Ringwald TEST(HCI, AdvEnable){ 211*d3762d15SMatthias Ringwald gap_advertisements_enable(0); 212*d3762d15SMatthias Ringwald gap_advertisements_enable(1); 213*d3762d15SMatthias Ringwald } 214*d3762d15SMatthias Ringwald 215*d3762d15SMatthias Ringwald TEST(HCI, SetRandomAddr){ 216*d3762d15SMatthias Ringwald bd_addr_t addr = { 0 }; 217*d3762d15SMatthias Ringwald hci_le_random_address_set(addr); 218*d3762d15SMatthias Ringwald } 219*d3762d15SMatthias Ringwald 220*d3762d15SMatthias Ringwald TEST(HCI, Disconnect){ 221*d3762d15SMatthias Ringwald gap_disconnect(HCI_CON_HANDLE_INVALID); 222*d3762d15SMatthias Ringwald gap_disconnect(5); 223*d3762d15SMatthias Ringwald } 224*d3762d15SMatthias Ringwald 225*d3762d15SMatthias Ringwald TEST(HCI, GetRole){ 226*d3762d15SMatthias Ringwald gap_get_role(HCI_CON_HANDLE_INVALID); 227*d3762d15SMatthias Ringwald gap_get_role(5); 228*d3762d15SMatthias Ringwald } 229*d3762d15SMatthias Ringwald 230*d3762d15SMatthias Ringwald int main (int argc, const char * argv[]){ 231*d3762d15SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 232*d3762d15SMatthias Ringwald } 233