mirror of
https://github.com/bluekitchen/btstack.git
synced 2025-04-17 20:42:47 +00:00
test/gap: more tests
This commit is contained in:
parent
9ca3a83442
commit
566df4e8af
@ -95,11 +95,14 @@ void CHECK_HCI_COMMAND(const hci_cmd_t * expected_hci_command){
|
|||||||
}
|
}
|
||||||
|
|
||||||
TEST_GROUP(HCI){
|
TEST_GROUP(HCI){
|
||||||
void setup(void){
|
hci_stack_t * hci_stack;
|
||||||
|
|
||||||
|
void setup(void){
|
||||||
transport_count_packets = 0;
|
transport_count_packets = 0;
|
||||||
can_send_now = 1;
|
can_send_now = 1;
|
||||||
next_hci_packet = 0;
|
next_hci_packet = 0;
|
||||||
hci_init(&hci_transport_test, NULL);
|
hci_init(&hci_transport_test, NULL);
|
||||||
|
hci_stack = hci_get_stack();
|
||||||
hci_simulate_working_fuzz();
|
hci_simulate_working_fuzz();
|
||||||
hci_setup_test_connections_fuzz();
|
hci_setup_test_connections_fuzz();
|
||||||
// register for HCI events
|
// register for HCI events
|
||||||
@ -243,10 +246,23 @@ TEST(HCI, hci_number_free_acl_slots_for_handle){
|
|||||||
CHECK_EQUAL(0, free_acl_slots_num);
|
CHECK_EQUAL(0, free_acl_slots_num);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(HCI, hci_send_acl_packet_buffer_no_connection){
|
||||||
|
hci_reserve_packet_buffer();
|
||||||
|
uint8_t status = hci_send_acl_packet_buffer(16);
|
||||||
|
CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
|
||||||
|
}
|
||||||
|
|
||||||
TEST(HCI, hci_send_acl_packet_buffer){
|
TEST(HCI, hci_send_acl_packet_buffer){
|
||||||
hci_reserve_packet_buffer();
|
hci_reserve_packet_buffer();
|
||||||
uint8_t status = hci_send_acl_packet_buffer(HCI_CON_HANDLE_INVALID);
|
uint8_t * packet = hci_get_outgoing_packet_buffer();
|
||||||
CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
|
uint8_t flags = 0x02;
|
||||||
|
// LE Packet
|
||||||
|
uint16_t acl_len = 50;
|
||||||
|
hci_stack->le_data_packets_length = acl_len - 10;;
|
||||||
|
little_endian_store_16(packet, 0, 0x05 | (flags << 12));
|
||||||
|
uint8_t status = hci_send_acl_packet_buffer(acl_len);
|
||||||
|
CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
|
||||||
|
hci_stack->le_data_packets_length = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(HCI, hci_send_cmd_packet){
|
TEST(HCI, hci_send_cmd_packet){
|
||||||
@ -412,11 +428,20 @@ TEST(HCI, hci_can_send_acl_le_packet_now) {
|
|||||||
can_send_now = 1;
|
can_send_now = 1;
|
||||||
hci_can_send_acl_le_packet_now();
|
hci_can_send_acl_le_packet_now();
|
||||||
}
|
}
|
||||||
|
TEST(HCI, hci_number_free_acl_slots_for_connection_type) {
|
||||||
TEST(HCI, hci_close) {
|
CHECK_EQUAL(0, hci_number_free_acl_slots_for_connection_type(BD_ADDR_TYPE_UNKNOWN));
|
||||||
hci_close();
|
CHECK_EQUAL(255, hci_number_free_acl_slots_for_connection_type(BD_ADDR_TYPE_ACL));
|
||||||
|
CHECK_EQUAL(255, hci_number_free_acl_slots_for_connection_type(BD_ADDR_TYPE_LE_PUBLIC));
|
||||||
|
// tweak stack
|
||||||
|
hci_stack_t * hci_stack = hci_get_stack();
|
||||||
|
hci_stack->le_acl_packets_total_num = 1;
|
||||||
|
CHECK_EQUAL(1, hci_number_free_acl_slots_for_connection_type(BD_ADDR_TYPE_LE_PUBLIC));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TEST(HCI, hci_close) {
|
||||||
|
// hci_close();
|
||||||
|
// }
|
||||||
|
|
||||||
TEST(HCI, gap_connect) {
|
TEST(HCI, gap_connect) {
|
||||||
bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
|
bd_addr_type_t addr_type = BD_ADDR_TYPE_LE_PUBLIC;
|
||||||
bd_addr_t addr = { 0 };
|
bd_addr_t addr = { 0 };
|
||||||
@ -475,6 +500,102 @@ TEST(HCI, gap_privacy_client) {
|
|||||||
gap_privacy_client_unregister(&client);
|
gap_privacy_client_unregister(&client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(HCI, acl_handling) {
|
||||||
|
uint16_t con_handle = 1;
|
||||||
|
uint8_t flags = 0;
|
||||||
|
|
||||||
|
uint8_t packet[16];
|
||||||
|
// no connection for invalid handle
|
||||||
|
memset(packet, 0xff, sizeof(packet));
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
// invalid length
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
// fix length
|
||||||
|
little_endian_store_16(packet, 2, 12);
|
||||||
|
little_endian_store_16(packet, 6, 8);
|
||||||
|
|
||||||
|
// unexpected acl continuation
|
||||||
|
flags = 0x01;
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
// invalid packet boundary flags
|
||||||
|
flags = 0x03;
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
// oversized first fragment
|
||||||
|
flags = 0x02;
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
little_endian_store_16(packet, 2, 1996);
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, 2000);
|
||||||
|
|
||||||
|
// 1a store first flushable fragment
|
||||||
|
flags = 0x02;
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
little_endian_store_16(packet, 2, 12);
|
||||||
|
little_endian_store_16(packet, 4, 20);
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
|
||||||
|
// 1b another first non-flushable
|
||||||
|
flags = 0x06;
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
|
||||||
|
// 1c another first
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, sizeof(packet));
|
||||||
|
|
||||||
|
// oversized continuation fragment
|
||||||
|
flags = 0x01;
|
||||||
|
little_endian_store_16(packet, 0, con_handle | (flags << 12));
|
||||||
|
little_endian_store_16(packet, 2, 1996);
|
||||||
|
packet_handler(HCI_ACL_DATA_PACKET, packet, 2000);
|
||||||
|
}
|
||||||
|
TEST(HCI, gap_le_get_own_address) {
|
||||||
|
uint8_t addr_type;
|
||||||
|
bd_addr_t addr;
|
||||||
|
hci_stack->le_own_addr_type = BD_ADDR_TYPE_LE_PUBLIC;
|
||||||
|
gap_le_get_own_address(&addr_type, addr);
|
||||||
|
hci_stack->le_own_addr_type = BD_ADDR_TYPE_LE_RANDOM;
|
||||||
|
gap_le_get_own_address(&addr_type, addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void simulate_hci_command_complete(uint16_t opcode, uint8_t status) {
|
||||||
|
uint8_t packet[30];
|
||||||
|
packet[0] = HCI_EVENT_COMMAND_COMPLETE;
|
||||||
|
packet[1] = sizeof(packet)-2;
|
||||||
|
packet[2] = 1;
|
||||||
|
little_endian_store_16(packet, 3, opcode);
|
||||||
|
packet[5] = status;
|
||||||
|
packet_handler(HCI_EVENT_PACKET, packet, sizeof(packet));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(HCI, handle_command_complete_event) {
|
||||||
|
struct {
|
||||||
|
uint16_t opcode;
|
||||||
|
uint8_t status;
|
||||||
|
} variations[] = {
|
||||||
|
{HCI_OPCODE_HCI_READ_LOCAL_NAME, ERROR_CODE_SUCCESS},
|
||||||
|
{HCI_OPCODE_HCI_READ_LOCAL_NAME, ERROR_CODE_UNKNOWN_HCI_COMMAND },
|
||||||
|
{HCI_OPCODE_HCI_READ_BUFFER_SIZE, ERROR_CODE_SUCCESS},
|
||||||
|
{HCI_OPCODE_HCI_READ_RSSI, ERROR_CODE_SUCCESS},
|
||||||
|
{HCI_OPCODE_HCI_READ_RSSI, ERROR_CODE_UNKNOWN_HCI_COMMAND},
|
||||||
|
};
|
||||||
|
for (uint8_t i = 0; i < sizeof(variations) / sizeof(variations[0]); i++) {
|
||||||
|
// extras
|
||||||
|
uint16_t opcode = variations[i].opcode;
|
||||||
|
uint8_t status = variations[i].status;
|
||||||
|
switch (opcode) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
simulate_hci_command_complete(opcode, status);
|
||||||
|
switch (opcode) {
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main (int argc, const char * argv[]){
|
int main (int argc, const char * argv[]){
|
||||||
btstack_run_loop_init(btstack_run_loop_posix_get_instance());
|
btstack_run_loop_init(btstack_run_loop_posix_get_instance());
|
||||||
return CommandLineTestRunner::RunAllTests(argc, argv);
|
return CommandLineTestRunner::RunAllTests(argc, argv);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user