1d3762d15SMatthias Ringwald #include <stdint.h> 2d3762d15SMatthias Ringwald #include <stdio.h> 3d3762d15SMatthias Ringwald #include <stdlib.h> 4d3762d15SMatthias Ringwald #include <string.h> 5d3762d15SMatthias Ringwald 6d3762d15SMatthias Ringwald #include "CppUTest/TestHarness.h" 7d3762d15SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 8d3762d15SMatthias Ringwald #include "CppUTestExt/MockSupport.h" 9d3762d15SMatthias Ringwald 10d3762d15SMatthias Ringwald #include "hci_cmd.h" 11d3762d15SMatthias Ringwald 12d3762d15SMatthias Ringwald #include "btstack_memory.h" 13d3762d15SMatthias Ringwald #include "hci.h" 14d3762d15SMatthias Ringwald #include "ble/gatt_client.h" 15d3762d15SMatthias Ringwald #include "btstack_event.h" 16d3762d15SMatthias Ringwald #include "hci_dump.h" 17d3762d15SMatthias Ringwald #include "hci_dump_posix_fs.h" 18d3762d15SMatthias Ringwald #include "btstack_debug.h" 19fcebe167SMilanka Ringwald #include "btstack_util.h" 20fcebe167SMilanka Ringwald #include "btstack_run_loop_posix.h" 21d3762d15SMatthias Ringwald 22d3762d15SMatthias Ringwald typedef struct { 23d3762d15SMatthias Ringwald uint8_t type; 24d3762d15SMatthias Ringwald uint16_t size; 25d3762d15SMatthias Ringwald uint8_t buffer[258]; 26d3762d15SMatthias Ringwald } hci_packet_t; 27d3762d15SMatthias Ringwald 28d3762d15SMatthias Ringwald #define MAX_HCI_PACKETS 10 29d3762d15SMatthias Ringwald static uint16_t transport_count_packets; 30d3762d15SMatthias Ringwald static hci_packet_t transport_packets[MAX_HCI_PACKETS]; 31*28739e5fSMatthias Ringwald static int can_send_now = 1; 32d3762d15SMatthias Ringwald static void (*packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size); 33d3762d15SMatthias Ringwald 34d3762d15SMatthias Ringwald static const uint8_t packet_sent_event[] = { HCI_EVENT_TRANSPORT_PACKET_SENT, 0}; 35d3762d15SMatthias Ringwald 36d3762d15SMatthias Ringwald static int hci_transport_test_set_baudrate(uint32_t baudrate){ 37d3762d15SMatthias Ringwald return 0; 38d3762d15SMatthias Ringwald } 39d3762d15SMatthias Ringwald 40d3762d15SMatthias Ringwald static int hci_transport_test_can_send_now(uint8_t packet_type){ 41*28739e5fSMatthias Ringwald return can_send_now; 42d3762d15SMatthias Ringwald } 43d3762d15SMatthias Ringwald 44d3762d15SMatthias Ringwald static int hci_transport_test_send_packet(uint8_t packet_type, uint8_t * packet, int size){ 45d3762d15SMatthias Ringwald btstack_assert(transport_count_packets < MAX_HCI_PACKETS); 46d3762d15SMatthias Ringwald memcpy(transport_packets[transport_count_packets].buffer, packet, size); 47d3762d15SMatthias Ringwald transport_packets[transport_count_packets].type = packet_type; 48d3762d15SMatthias Ringwald transport_packets[transport_count_packets].size = size; 49d3762d15SMatthias Ringwald transport_count_packets++; 50d3762d15SMatthias Ringwald // notify upper stack that it can send again 51d3762d15SMatthias Ringwald packet_handler(HCI_EVENT_PACKET, (uint8_t *) &packet_sent_event[0], sizeof(packet_sent_event)); 52d3762d15SMatthias Ringwald return 0; 53d3762d15SMatthias Ringwald } 54d3762d15SMatthias Ringwald 55d3762d15SMatthias Ringwald static void hci_transport_test_init(const void * transport_config){ 56d3762d15SMatthias Ringwald } 57d3762d15SMatthias Ringwald 58d3762d15SMatthias Ringwald static int hci_transport_test_open(void){ 59d3762d15SMatthias Ringwald return 0; 60d3762d15SMatthias Ringwald } 61d3762d15SMatthias Ringwald 62d3762d15SMatthias Ringwald static int hci_transport_test_close(void){ 63d3762d15SMatthias Ringwald return 0; 64d3762d15SMatthias Ringwald } 65d3762d15SMatthias Ringwald 66d3762d15SMatthias Ringwald static void hci_transport_test_register_packet_handler(void (*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size)){ 67d3762d15SMatthias Ringwald packet_handler = handler; 68d3762d15SMatthias Ringwald } 69d3762d15SMatthias Ringwald 70d3762d15SMatthias Ringwald static const hci_transport_t hci_transport_test = { 71d3762d15SMatthias Ringwald /* const char * name; */ "TEST", 72d3762d15SMatthias Ringwald /* void (*init) (const void *transport_config); */ &hci_transport_test_init, 73d3762d15SMatthias Ringwald /* int (*open)(void); */ &hci_transport_test_open, 74d3762d15SMatthias Ringwald /* int (*close)(void); */ &hci_transport_test_close, 75d3762d15SMatthias Ringwald /* void (*register_packet_handler)(void (*handler)(...); */ &hci_transport_test_register_packet_handler, 76d3762d15SMatthias Ringwald /* int (*can_send_packet_now)(uint8_t packet_type); */ &hci_transport_test_can_send_now, 77d3762d15SMatthias Ringwald /* int (*send_packet)(...); */ &hci_transport_test_send_packet, 78d3762d15SMatthias Ringwald /* int (*set_baudrate)(uint32_t baudrate); */ &hci_transport_test_set_baudrate, 79d3762d15SMatthias Ringwald /* void (*reset_link)(void); */ NULL, 80d3762d15SMatthias Ringwald /* void (*set_sco_config)(uint16_t voice_setting, int num_connections); */ NULL, 81d3762d15SMatthias Ringwald }; 82d3762d15SMatthias Ringwald 83d3762d15SMatthias Ringwald static uint16_t next_hci_packet; 84d3762d15SMatthias Ringwald 85d3762d15SMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ 86d3762d15SMatthias Ringwald for (int i=0; i<size; i++){ 87d3762d15SMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]); 88d3762d15SMatthias Ringwald } 89d3762d15SMatthias Ringwald } 90d3762d15SMatthias Ringwald 91d3762d15SMatthias Ringwald void CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command){ 92d3762d15SMatthias Ringwald uint16_t actual_opcode = little_endian_read_16(transport_packets[next_hci_packet].buffer, 0); 93d3762d15SMatthias Ringwald next_hci_packet++; 94d3762d15SMatthias Ringwald CHECK_EQUAL(expected_hci_command->opcode, actual_opcode); 95d3762d15SMatthias Ringwald } 96d3762d15SMatthias Ringwald 97d3762d15SMatthias Ringwald TEST_GROUP(HCI){ 98d3762d15SMatthias Ringwald void setup(void){ 99d3762d15SMatthias Ringwald transport_count_packets = 0; 100*28739e5fSMatthias Ringwald can_send_now = 1; 101d3762d15SMatthias Ringwald next_hci_packet = 0; 102d3762d15SMatthias Ringwald hci_init(&hci_transport_test, NULL); 103d3762d15SMatthias Ringwald hci_simulate_working_fuzz(); 104d3762d15SMatthias Ringwald hci_setup_test_connections_fuzz(); 105d3762d15SMatthias Ringwald // register for HCI events 106d3762d15SMatthias Ringwald mock().expectOneCall("hci_can_send_packet_now_using_packet_buffer").andReturnValue(1); 107d3762d15SMatthias Ringwald } 108d3762d15SMatthias Ringwald void teardown(void){ 109d3762d15SMatthias Ringwald mock().clear(); 110d3762d15SMatthias Ringwald } 111d3762d15SMatthias Ringwald }; 112d3762d15SMatthias Ringwald 113d3762d15SMatthias Ringwald TEST(HCI, GetSetConnectionRange){ 114d3762d15SMatthias Ringwald le_connection_parameter_range_t range; 115d3762d15SMatthias Ringwald gap_get_connection_parameter_range(&range); 116d3762d15SMatthias Ringwald gap_set_connection_parameter_range(&range); 117d3762d15SMatthias Ringwald } 118d3762d15SMatthias Ringwald 119d3762d15SMatthias Ringwald TEST(HCI, ConnectionRangeValid){ 120d3762d15SMatthias Ringwald le_connection_parameter_range_t range = { 121fcebe167SMilanka Ringwald .le_conn_interval_min = 1, 122fcebe167SMilanka Ringwald .le_conn_interval_max = 10, 123fcebe167SMilanka Ringwald .le_conn_latency_min = 1, 124fcebe167SMilanka Ringwald .le_conn_latency_max = 10, 125fcebe167SMilanka Ringwald .le_supervision_timeout_min = 1, 126fcebe167SMilanka Ringwald .le_supervision_timeout_max = 10 127d3762d15SMatthias Ringwald }; 128d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 0, 0, 0, 0)); 129fcebe167SMilanka Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 11, 0, 0)); 130fcebe167SMilanka Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 11, 0)); 131d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 0, 0, 0)); 132d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 0, 0)); 133d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 10, 0)); 134d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 0)); 135d3762d15SMatthias Ringwald CHECK_EQUAL( 0, gap_connection_parameter_range_included(&range, 2, 9, 5, 11)); 136d3762d15SMatthias Ringwald CHECK_EQUAL( 1, gap_connection_parameter_range_included(&range, 2, 9, 5, 5)); 137d3762d15SMatthias Ringwald } 138d3762d15SMatthias Ringwald 139fcebe167SMilanka Ringwald TEST(HCI, other_functions){ 140fcebe167SMilanka Ringwald gap_set_scan_phys(1); 141fcebe167SMilanka Ringwald gap_set_connection_phys(1); 142fcebe167SMilanka Ringwald hci_enable_custom_pre_init(); 143fcebe167SMilanka Ringwald gap_whitelist_clear(); 144fcebe167SMilanka Ringwald } 145fcebe167SMilanka Ringwald 146fcebe167SMilanka Ringwald TEST(HCI, gap_whitelist_add_remove){ 147fcebe167SMilanka Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_ACL; 148fcebe167SMilanka Ringwald bd_addr_t addr = { 0 }; 149fcebe167SMilanka Ringwald 150fcebe167SMilanka Ringwald uint8_t status = gap_whitelist_add(addr_type, addr); 151fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 152fcebe167SMilanka Ringwald 153fcebe167SMilanka Ringwald status = gap_whitelist_add(addr_type, addr); 154fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status); 155fcebe167SMilanka Ringwald 156fcebe167SMilanka Ringwald status = gap_whitelist_remove(addr_type, addr); 157fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 158fcebe167SMilanka Ringwald 159fcebe167SMilanka Ringwald status = gap_whitelist_remove(addr_type, addr); 160e406aa8dSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 161fcebe167SMilanka Ringwald 162fcebe167SMilanka Ringwald status = gap_whitelist_remove(BD_ADDR_TYPE_SCO, addr); 163fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 164fcebe167SMilanka Ringwald } 165fcebe167SMilanka Ringwald 166fcebe167SMilanka Ringwald TEST(HCI, gap_connect_with_whitelist){ 167fcebe167SMilanka Ringwald uint8_t status = gap_connect_with_whitelist(); 168fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 169fcebe167SMilanka Ringwald 170*28739e5fSMatthias Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC; 171*28739e5fSMatthias Ringwald bd_addr_t addr = { 0 }; 172*28739e5fSMatthias Ringwald gap_auto_connection_start(addr_type, addr); 173*28739e5fSMatthias Ringwald 174fcebe167SMilanka Ringwald status = gap_connect_with_whitelist(); 175fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status); 176fcebe167SMilanka Ringwald } 177fcebe167SMilanka Ringwald 178fcebe167SMilanka Ringwald TEST(HCI, gap_auto_connection_start_stop){ 179fcebe167SMilanka Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC; 180fcebe167SMilanka Ringwald bd_addr_t addr = { 0 }; 181fcebe167SMilanka Ringwald 182fcebe167SMilanka Ringwald uint8_t status = gap_auto_connection_start(addr_type, addr); 183fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 184fcebe167SMilanka Ringwald 185fcebe167SMilanka Ringwald status = gap_auto_connection_stop(addr_type, addr); 186fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 187fcebe167SMilanka Ringwald } 188fcebe167SMilanka Ringwald 189fcebe167SMilanka Ringwald TEST(HCI, gap_auto_connection_stop_all){ 190fcebe167SMilanka Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC; 191fcebe167SMilanka Ringwald bd_addr_t addr = { 0 }; 192fcebe167SMilanka Ringwald 193fcebe167SMilanka Ringwald uint8_t status = gap_auto_connection_start(addr_type, addr); 194fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 195fcebe167SMilanka Ringwald 196fcebe167SMilanka Ringwald status = gap_auto_connection_stop_all(); 197fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 198fcebe167SMilanka Ringwald } 199fcebe167SMilanka Ringwald 200fcebe167SMilanka Ringwald TEST(HCI, gap_read_rssi){ 201fcebe167SMilanka Ringwald int status = gap_read_rssi(HCI_CON_HANDLE_INVALID); 202fcebe167SMilanka Ringwald CHECK_EQUAL(0, status); 203fcebe167SMilanka Ringwald 204fcebe167SMilanka Ringwald status = gap_read_rssi(0x01); 205fcebe167SMilanka Ringwald CHECK_EQUAL(1, status); 206fcebe167SMilanka Ringwald } 207fcebe167SMilanka Ringwald 208fcebe167SMilanka Ringwald TEST(HCI, gap_le_connection_interval){ 209fcebe167SMilanka Ringwald uint16_t con_interval = gap_le_connection_interval(HCI_CON_HANDLE_INVALID); 210fcebe167SMilanka Ringwald CHECK_EQUAL(0, con_interval); 211fcebe167SMilanka Ringwald 212fcebe167SMilanka Ringwald con_interval = gap_le_connection_interval(0x01); 213fcebe167SMilanka Ringwald CHECK_EQUAL(0, con_interval); 214fcebe167SMilanka Ringwald } 215fcebe167SMilanka Ringwald 216fcebe167SMilanka Ringwald 217fcebe167SMilanka Ringwald TEST(HCI, gap_get_connection_type){ 218fcebe167SMilanka Ringwald gap_connection_type_t type = gap_get_connection_type(HCI_CON_HANDLE_INVALID); 219fcebe167SMilanka Ringwald CHECK_EQUAL(GAP_CONNECTION_INVALID, type); 220fcebe167SMilanka Ringwald 221fcebe167SMilanka Ringwald type = gap_get_connection_type(0x01); 222fcebe167SMilanka Ringwald CHECK_EQUAL(GAP_CONNECTION_ACL, type); 223fcebe167SMilanka Ringwald } 224fcebe167SMilanka Ringwald 225fcebe167SMilanka Ringwald TEST(HCI, gap_le_set_phy){ 226fcebe167SMilanka Ringwald uint8_t status = gap_le_set_phy(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0); 227fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 228fcebe167SMilanka Ringwald 229fcebe167SMilanka Ringwald status = gap_le_set_phy(0x01, 0, 0, 0, 0); 230fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 231fcebe167SMilanka Ringwald } 232fcebe167SMilanka Ringwald 233fcebe167SMilanka Ringwald TEST(HCI, hci_connection_for_bd_addr_and_type){ 234fcebe167SMilanka Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_ACL; 235fcebe167SMilanka Ringwald bd_addr_t addr = { 0 }; 236fcebe167SMilanka Ringwald 237fcebe167SMilanka Ringwald hci_connection_t * con = hci_connection_for_bd_addr_and_type(addr , addr_type); 238fcebe167SMilanka Ringwald CHECK_EQUAL(NULL, con); 239fcebe167SMilanka Ringwald } 240fcebe167SMilanka Ringwald 241fcebe167SMilanka Ringwald TEST(HCI, hci_number_free_acl_slots_for_handle){ 242fcebe167SMilanka Ringwald int free_acl_slots_num = hci_number_free_acl_slots_for_handle(HCI_CON_HANDLE_INVALID); 243fcebe167SMilanka Ringwald CHECK_EQUAL(0, free_acl_slots_num); 244fcebe167SMilanka Ringwald } 245fcebe167SMilanka Ringwald 246fcebe167SMilanka Ringwald TEST(HCI, hci_send_acl_packet_buffer){ 247fcebe167SMilanka Ringwald hci_reserve_packet_buffer(); 248fcebe167SMilanka Ringwald uint8_t status = hci_send_acl_packet_buffer(HCI_CON_HANDLE_INVALID); 249fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 250fcebe167SMilanka Ringwald } 251fcebe167SMilanka Ringwald 252fcebe167SMilanka Ringwald TEST(HCI, hci_send_cmd_packet){ 253fcebe167SMilanka Ringwald bd_addr_t addr = { 0 }; 254fcebe167SMilanka Ringwald 255fcebe167SMilanka Ringwald uint8_t status = hci_send_cmd(&hci_write_loopback_mode, 1); 256fcebe167SMilanka Ringwald CHECK_EQUAL(0, status); 257fcebe167SMilanka Ringwald 258fcebe167SMilanka Ringwald uint8_t i; 259fcebe167SMilanka Ringwald for (i = 0; i < 3; i++){ 260fcebe167SMilanka Ringwald status = hci_send_cmd(&hci_le_create_connection, 261fcebe167SMilanka Ringwald 1000, // scan interval: 625 ms 262fcebe167SMilanka Ringwald 1000, // scan interval: 625 ms 263fcebe167SMilanka Ringwald i, // don't use whitelist 264fcebe167SMilanka Ringwald 0, // peer address type: public 265fcebe167SMilanka Ringwald addr, // remote bd addr 266fcebe167SMilanka Ringwald 0, // random or public 267fcebe167SMilanka Ringwald 80, // conn interval min 268fcebe167SMilanka Ringwald 80, // conn interval max (3200 * 0.625) 269fcebe167SMilanka Ringwald 0, // conn latency 270fcebe167SMilanka Ringwald 2000, // supervision timeout 271fcebe167SMilanka Ringwald 0, // min ce length 272fcebe167SMilanka Ringwald 1000 // max ce length 273fcebe167SMilanka Ringwald ); 274fcebe167SMilanka Ringwald CHECK_EQUAL(0, status); 275fcebe167SMilanka Ringwald } 276fcebe167SMilanka Ringwald } 277fcebe167SMilanka Ringwald 278fcebe167SMilanka Ringwald TEST(HCI, hci_send_cmd_va_arg){ 279fcebe167SMilanka Ringwald hci_reserve_packet_buffer(); 280fcebe167SMilanka Ringwald uint8_t status = hci_send_cmd(&hci_write_loopback_mode, 1); 281fcebe167SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status); 282fcebe167SMilanka Ringwald } 283fcebe167SMilanka Ringwald 284fcebe167SMilanka Ringwald TEST(HCI, hci_power_control){ 285fcebe167SMilanka Ringwald int status = hci_power_control(HCI_POWER_ON); 286fcebe167SMilanka Ringwald CHECK_EQUAL(0, status); 287fcebe167SMilanka Ringwald } 288fcebe167SMilanka Ringwald 289d3762d15SMatthias Ringwald TEST(HCI, NumPeripherals){ 290d3762d15SMatthias Ringwald gap_set_max_number_peripheral_connections(1); 291d3762d15SMatthias Ringwald } 292d3762d15SMatthias Ringwald 293d3762d15SMatthias Ringwald TEST(HCI, MaxAclLen){ 294d3762d15SMatthias Ringwald hci_max_acl_data_packet_length(); 295d3762d15SMatthias Ringwald } 296d3762d15SMatthias Ringwald 297d3762d15SMatthias Ringwald TEST(HCI, Flushable){ 298d3762d15SMatthias Ringwald hci_non_flushable_packet_boundary_flag_supported(); 299d3762d15SMatthias Ringwald } 300d3762d15SMatthias Ringwald 301d3762d15SMatthias Ringwald TEST(HCI, RemovePacketHandler){ 302d3762d15SMatthias Ringwald hci_remove_event_handler(NULL); 303d3762d15SMatthias Ringwald } 304d3762d15SMatthias Ringwald 305d3762d15SMatthias Ringwald static void dummy_fn(const void * config){}; 306d3762d15SMatthias Ringwald TEST(HCI, SetChipset){ 307d3762d15SMatthias Ringwald hci_set_chipset(NULL); 308d3762d15SMatthias Ringwald btstack_chipset_t chipset_driver = { 0 }; 309d3762d15SMatthias Ringwald hci_set_chipset(NULL); 310d3762d15SMatthias Ringwald chipset_driver.init = dummy_fn; 311d3762d15SMatthias Ringwald } 312d3762d15SMatthias Ringwald 313d3762d15SMatthias Ringwald TEST(HCI, SetControl){ 314d3762d15SMatthias Ringwald btstack_control_t hardware_control = { .init = &dummy_fn}; 315d3762d15SMatthias Ringwald hci_set_control(&hardware_control); 316d3762d15SMatthias Ringwald } 317d3762d15SMatthias Ringwald 318d3762d15SMatthias Ringwald //TEST(HCI, Close){ 319d3762d15SMatthias Ringwald // hci_close(); 320d3762d15SMatthias Ringwald //} 321d3762d15SMatthias Ringwald 322d3762d15SMatthias Ringwald TEST(HCI, SetPublicAddress){ 323d3762d15SMatthias Ringwald bd_addr_t addr = { 0 }; 324d3762d15SMatthias Ringwald hci_set_bd_addr(addr); 325d3762d15SMatthias Ringwald } 326d3762d15SMatthias Ringwald 327d3762d15SMatthias Ringwald TEST(HCI, DisconnectSecurityBlock){ 328d3762d15SMatthias Ringwald hci_disconnect_security_block(HCI_CON_HANDLE_INVALID); 329d3762d15SMatthias Ringwald hci_disconnect_security_block(3); 330d3762d15SMatthias Ringwald } 331d3762d15SMatthias Ringwald 332d3762d15SMatthias Ringwald TEST(HCI, SetDuplicateFilter){ 333d3762d15SMatthias Ringwald gap_set_scan_duplicate_filter(true); 334d3762d15SMatthias Ringwald } 335d3762d15SMatthias Ringwald 336d3762d15SMatthias Ringwald TEST(HCI, ConnectCancel){ 337*28739e5fSMatthias Ringwald uint8_t status; 338*28739e5fSMatthias Ringwald status = gap_connect_with_whitelist(); 339*28739e5fSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 340*28739e5fSMatthias Ringwald gap_connect_cancel(); 341*28739e5fSMatthias Ringwald 342*28739e5fSMatthias Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC; 343*28739e5fSMatthias Ringwald bd_addr_t addr = { 0 }; 344*28739e5fSMatthias Ringwald gap_connect(addr, addr_type); 345d3762d15SMatthias Ringwald gap_connect_cancel(); 346d3762d15SMatthias Ringwald } 347d3762d15SMatthias Ringwald 348d3762d15SMatthias Ringwald TEST(HCI, SetGapConnParams){ 349d3762d15SMatthias Ringwald gap_set_connection_parameters(0, 0, 0, 0, 0, 0, 0, 0); 350d3762d15SMatthias Ringwald } 351d3762d15SMatthias Ringwald 352d3762d15SMatthias Ringwald TEST(HCI, UpdateConnParams){ 353d3762d15SMatthias Ringwald gap_update_connection_parameters(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0); 354d3762d15SMatthias Ringwald gap_update_connection_parameters(5, 0, 0, 0, 0); 355d3762d15SMatthias Ringwald } 356d3762d15SMatthias Ringwald 357d3762d15SMatthias Ringwald TEST(HCI, RequestConnParamUpdate){ 358d3762d15SMatthias Ringwald gap_request_connection_parameter_update(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0); 359d3762d15SMatthias Ringwald gap_request_connection_parameter_update(5, 0, 0, 0, 0); 360d3762d15SMatthias Ringwald } 361d3762d15SMatthias Ringwald 362d3762d15SMatthias Ringwald TEST(HCI, SetScanResponse){ 363d3762d15SMatthias Ringwald gap_scan_response_set_data(0, NULL); 364d3762d15SMatthias Ringwald } 365d3762d15SMatthias Ringwald 366d3762d15SMatthias Ringwald TEST(HCI, SetAddrType){ 367d3762d15SMatthias Ringwald hci_le_set_own_address_type(0); 368d3762d15SMatthias Ringwald hci_le_set_own_address_type(1); 369d3762d15SMatthias Ringwald } 370d3762d15SMatthias Ringwald 371d3762d15SMatthias Ringwald TEST(HCI, AdvEnable){ 372d3762d15SMatthias Ringwald gap_advertisements_enable(0); 373d3762d15SMatthias Ringwald gap_advertisements_enable(1); 374d3762d15SMatthias Ringwald } 375d3762d15SMatthias Ringwald 376d3762d15SMatthias Ringwald TEST(HCI, SetRandomAddr){ 377d3762d15SMatthias Ringwald bd_addr_t addr = { 0 }; 378d3762d15SMatthias Ringwald hci_le_random_address_set(addr); 379d3762d15SMatthias Ringwald } 380d3762d15SMatthias Ringwald 381d3762d15SMatthias Ringwald TEST(HCI, Disconnect){ 382d3762d15SMatthias Ringwald gap_disconnect(HCI_CON_HANDLE_INVALID); 383d3762d15SMatthias Ringwald gap_disconnect(5); 384d3762d15SMatthias Ringwald } 385d3762d15SMatthias Ringwald 386d3762d15SMatthias Ringwald TEST(HCI, GetRole){ 387d3762d15SMatthias Ringwald gap_get_role(HCI_CON_HANDLE_INVALID); 388d3762d15SMatthias Ringwald gap_get_role(5); 389d3762d15SMatthias Ringwald } 390*28739e5fSMatthias Ringwald TEST(HCI, hci_is_le_identity_address_type_other){ 391*28739e5fSMatthias Ringwald hci_is_le_identity_address_type(BD_ADDR_TYPE_LE_PUBLIC_IDENTITY); 392*28739e5fSMatthias Ringwald hci_is_le_identity_address_type(BD_ADDR_TYPE_LE_RANDOM); 393*28739e5fSMatthias Ringwald } 394*28739e5fSMatthias Ringwald 395*28739e5fSMatthias Ringwald TEST(HCI, hci_can_send_command_packet_now){ 396*28739e5fSMatthias Ringwald can_send_now = 0; 397*28739e5fSMatthias Ringwald hci_can_send_command_packet_now(); 398*28739e5fSMatthias Ringwald can_send_now = 1; 399*28739e5fSMatthias Ringwald hci_can_send_command_packet_now(); 400*28739e5fSMatthias Ringwald } 401*28739e5fSMatthias Ringwald 402*28739e5fSMatthias Ringwald TEST(HCI, hci_can_send_prepared_acl_packet_now){ 403*28739e5fSMatthias Ringwald can_send_now = 0; 404*28739e5fSMatthias Ringwald hci_can_send_prepared_acl_packet_now(0); 405*28739e5fSMatthias Ringwald can_send_now = 1; 406*28739e5fSMatthias Ringwald hci_can_send_prepared_acl_packet_now(0); 407*28739e5fSMatthias Ringwald } 408*28739e5fSMatthias Ringwald 409*28739e5fSMatthias Ringwald TEST(HCI, hci_can_send_acl_le_packet_now) { 410*28739e5fSMatthias Ringwald can_send_now = 0; 411*28739e5fSMatthias Ringwald hci_can_send_acl_le_packet_now(); 412*28739e5fSMatthias Ringwald can_send_now = 1; 413*28739e5fSMatthias Ringwald hci_can_send_acl_le_packet_now(); 414*28739e5fSMatthias Ringwald } 415*28739e5fSMatthias Ringwald 416*28739e5fSMatthias Ringwald TEST(HCI, hci_close) { 417*28739e5fSMatthias Ringwald hci_close(); 418*28739e5fSMatthias Ringwald } 419*28739e5fSMatthias Ringwald 420*28739e5fSMatthias Ringwald TEST(HCI, gap_connect) { 421*28739e5fSMatthias Ringwald bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC; 422*28739e5fSMatthias Ringwald bd_addr_t addr = { 0 }; 423*28739e5fSMatthias Ringwald 424*28739e5fSMatthias Ringwald uint8_t status; 425*28739e5fSMatthias Ringwald status = gap_connect(addr, addr_type); 426*28739e5fSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 427*28739e5fSMatthias Ringwald status = gap_connect(addr, addr_type); 428*28739e5fSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status); 429*28739e5fSMatthias Ringwald } 430*28739e5fSMatthias Ringwald 431*28739e5fSMatthias Ringwald TEST(HCI, hci_emit_state) { 432*28739e5fSMatthias Ringwald hci_emit_state(); 433*28739e5fSMatthias Ringwald } 434*28739e5fSMatthias Ringwald 435*28739e5fSMatthias Ringwald TEST(HCI, gap_request_connection_subrating) { 436*28739e5fSMatthias Ringwald int status = gap_request_connection_subrating(HCI_CON_HANDLE_INVALID, 0, 0, 0, 0, 0); 437*28739e5fSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 438*28739e5fSMatthias Ringwald status = gap_request_connection_subrating(0x01, 0, 0, 0, 0, 0); 439*28739e5fSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 440*28739e5fSMatthias Ringwald } 441*28739e5fSMatthias Ringwald 442*28739e5fSMatthias Ringwald 443*28739e5fSMatthias Ringwald TEST(HCI, hci_set_hardware_error_callback) { 444*28739e5fSMatthias Ringwald hci_set_hardware_error_callback(NULL); 445*28739e5fSMatthias Ringwald } 446*28739e5fSMatthias Ringwald 447*28739e5fSMatthias Ringwald TEST(HCI, hci_disconnect_all) { 448*28739e5fSMatthias Ringwald hci_disconnect_all(); 449*28739e5fSMatthias Ringwald } 450*28739e5fSMatthias Ringwald 451*28739e5fSMatthias Ringwald TEST(HCI, hci_get_manufacturer) { 452*28739e5fSMatthias Ringwald hci_get_manufacturer(); 453*28739e5fSMatthias Ringwald } 454*28739e5fSMatthias Ringwald TEST(HCI, gap_authorization_state) { 455*28739e5fSMatthias Ringwald gap_authorization_state(HCI_CON_HANDLE_INVALID); 456*28739e5fSMatthias Ringwald } 457*28739e5fSMatthias Ringwald #ifdef ENABLE_LE_PRIVACY_ADDRESS_RESOLUTION 458*28739e5fSMatthias Ringwald TEST(HCI, hci_load_le_device_db_entry_into_resolving_list) { 459*28739e5fSMatthias Ringwald hci_load_le_device_db_entry_into_resolving_list(0); 460*28739e5fSMatthias Ringwald } 461*28739e5fSMatthias Ringwald 462*28739e5fSMatthias Ringwald TEST(HCI, hci_remove_le_device_db_entry_from_resolving_list) { 463*28739e5fSMatthias Ringwald hci_remove_le_device_db_entry_from_resolving_list(0); 464*28739e5fSMatthias Ringwald } 465*28739e5fSMatthias Ringwald 466*28739e5fSMatthias Ringwald TEST(HCI, gap_load_resolving_list_from_le_device_db) { 467*28739e5fSMatthias Ringwald gap_load_resolving_list_from_le_device_db(); 468*28739e5fSMatthias Ringwald } 469*28739e5fSMatthias Ringwald #endif 470*28739e5fSMatthias Ringwald 471*28739e5fSMatthias Ringwald TEST(HCI, gap_privacy_client) { 472*28739e5fSMatthias Ringwald gap_privacy_client_t client; 473*28739e5fSMatthias Ringwald gap_privacy_client_register(&client); 474*28739e5fSMatthias Ringwald gap_privacy_client_ready(&client); 475*28739e5fSMatthias Ringwald gap_privacy_client_unregister(&client); 476*28739e5fSMatthias Ringwald } 477d3762d15SMatthias Ringwald 478d3762d15SMatthias Ringwald int main (int argc, const char * argv[]){ 479fcebe167SMilanka Ringwald btstack_run_loop_init(btstack_run_loop_posix_get_instance()); 480d3762d15SMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 481d3762d15SMatthias Ringwald } 482