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