From 782c1ae95b5e8035a6670f5ba28aab3ae636d8e7 Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Thu, 24 Sep 2020 18:54:44 +0200 Subject: [PATCH] gatt_server_test: test indicate --- test/gatt_server/gatt_server_test.c | 77 ++++++++++++++++++++++++++--- test/gatt_server/mock.c | 9 +++- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/test/gatt_server/gatt_server_test.c b/test/gatt_server/gatt_server_test.c index 7b62b16ff..de4a40359 100644 --- a/test/gatt_server/gatt_server_test.c +++ b/test/gatt_server/gatt_server_test.c @@ -24,6 +24,10 @@ #include "bluetooth_gatt.h" static uint8_t battery_level = 100; +static const uint8_t uuid128_with_bluetooth_base[] = { 0x00, 0x00, 0xBB, 0xBB, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; +static const uint8_t uuid128_no_bluetooth_base[] = { 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0xAA, 0xAA, 0x00, 0x00 }; + +void l2cap_can_send_fixed_channel_packet_now_set_status(uint8_t status); static uint16_t att_read_callback(hci_con_handle_t connection_handle, uint16_t att_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ UNUSED(connection_handle); @@ -46,6 +50,7 @@ static int att_write_callback(hci_con_handle_t connection_handle, uint16_t att_h return 0; } + TEST_GROUP(ATT_SERVER){ void setup(void){ @@ -54,7 +59,7 @@ TEST_GROUP(ATT_SERVER){ // 0x180F att_db_util_add_service_uuid16(ORG_BLUETOOTH_SERVICE_BATTERY_SERVICE); // 0x2A19 - att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL, ATT_PROPERTY_WRITE | ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); + att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL, ATT_PROPERTY_WRITE | ATT_PROPERTY_READ | ATT_PROPERTY_INDICATE, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); // 0x2A1B att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL_STATE, ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); // 0x2A1A @@ -63,15 +68,14 @@ TEST_GROUP(ATT_SERVER){ att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BLOOD_PRESSURE_FEATURE, ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_READ | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); // 0x2A35 att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BLOOD_PRESSURE_MEASUREMENT, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC, ATT_SECURITY_AUTHENTICATED, ATT_SECURITY_AUTHENTICATED, &battery_level, 1); + + + att_db_util_add_characteristic_uuid128(uuid128_no_bluetooth_base, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); // 0x2A38 att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BODY_SENSOR_LOCATION, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); - const uint8_t uuid128[] = {0x00, 0x00, 0xFF, 0x11, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; - att_db_util_add_characteristic_uuid128(uuid128, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); - - // 0x2AA7 - att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_CGM_MEASUREMENT, ATT_PROPERTY_WRITE_WITHOUT_RESPONSE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_AUTHENTICATED, ATT_SECURITY_AUTHENTICATED, &battery_level, 1); + att_db_util_add_characteristic_uuid128(uuid128_with_bluetooth_base, ATT_PROPERTY_WRITE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); // 0x2AAB att_db_util_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_CGM_SESSION_RUN_TIME, ATT_PROPERTY_WRITE_WITHOUT_RESPONSE | ATT_PROPERTY_DYNAMIC | ATT_PROPERTY_NOTIFY, ATT_SECURITY_NONE, ATT_SECURITY_NONE, &battery_level, 1); @@ -80,8 +84,65 @@ TEST_GROUP(ATT_SERVER){ } }; -TEST(ATT_SERVER, test){ - +TEST(ATT_SERVER, gatt_server_get_value_handle_for_characteristic_with_uuid16){ + // att_dump_attributes(); + uint16_t value_handle; + + // start handle > value handle + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0xf000, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL); + CHECK_EQUAL(0, value_handle); + + // end handle < value handle + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0x02, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL); + CHECK_EQUAL(0, value_handle); + + // search value handle for unknown UUID + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, 0xffff); + CHECK_EQUAL(0, value_handle); + + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, 0); + CHECK_EQUAL(0, value_handle); + + // search value handle after one with uuid128_no_bluetooth_base + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BODY_SENSOR_LOCATION); + CHECK_EQUAL(0x0014, value_handle); + + // search value handle after one with uuid128_with_bluetooth_base + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_CGM_SESSION_RUN_TIME); + CHECK_EQUAL(0x001a, value_handle); + + // search value handle registered with bluetooth_base + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, 0xbbbb); + CHECK_EQUAL(0x0017, value_handle); + + // correct read + value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL); + CHECK_EQUAL(0x03, value_handle); +} + + +TEST(ATT_SERVER, att_server_indicate){ + static uint8_t value[] = {0x55}; + uint16_t value_handle = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL); + uint8_t status; + + // invalid conneciton handle + status = att_server_indicate(0x50, value_handle, &value[0], 0); + CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); + + // L2CAP cannot send + l2cap_can_send_fixed_channel_packet_now_set_status(0); + status = att_server_indicate(0x00, value_handle, &value[0], 0); + CHECK_EQUAL(BTSTACK_ACL_BUFFERS_FULL, status); + l2cap_can_send_fixed_channel_packet_now_set_status(1); + + // correct command + status = att_server_indicate(0x00, value_handle, &value[0], 0); + CHECK_EQUAL(ERROR_CODE_SUCCESS, status); + + // already in progress + status = att_server_indicate(0x00, value_handle, &value[0], 0); + CHECK_EQUAL(ATT_HANDLE_VALUE_INDICATION_IN_PROGRESS, status); } diff --git a/test/gatt_server/mock.c b/test/gatt_server/mock.c index 77f178279..6a5de94d2 100644 --- a/test/gatt_server/mock.c +++ b/test/gatt_server/mock.c @@ -125,8 +125,14 @@ int l2cap_reserve_packet_buffer(void){ void l2cap_release_packet_buffer(void){ } +static uint8_t l2cap_can_send_fixed_channel_packet_now_status = 1; + +void l2cap_can_send_fixed_channel_packet_now_set_status(uint8_t status){ + l2cap_can_send_fixed_channel_packet_now_status = status; +} + int l2cap_can_send_fixed_channel_packet_now(uint16_t handle, uint16_t channel_id){ - return 1; + return l2cap_can_send_fixed_channel_packet_now_status; } void l2cap_request_can_send_fix_channel_now_event(uint16_t handle, uint16_t channel_id){ @@ -190,6 +196,7 @@ hci_connection_t * hci_connection_for_bd_addr_and_type(bd_addr_t addr, bd_addr_t return NULL; } hci_connection_t * hci_connection_for_handle(hci_con_handle_t con_handle){ + if (con_handle != 0) return NULL; return &hci_connection; } void hci_connections_get_iterator(btstack_linked_list_iterator_t *it){