14902524cSMatthias Ringwald 24902524cSMatthias Ringwald // ***************************************************************************** 34902524cSMatthias Ringwald // 44902524cSMatthias Ringwald // test rfcomm query tests 54902524cSMatthias Ringwald // 64902524cSMatthias Ringwald // ***************************************************************************** 74902524cSMatthias Ringwald 84902524cSMatthias Ringwald 94902524cSMatthias Ringwald #include <stdint.h> 104902524cSMatthias Ringwald #include <stdio.h> 114902524cSMatthias Ringwald #include <stdlib.h> 124902524cSMatthias Ringwald #include <string.h> 134902524cSMatthias Ringwald 144902524cSMatthias Ringwald #include "CppUTest/TestHarness.h" 154902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 164902524cSMatthias Ringwald 174902524cSMatthias Ringwald #include "hci_cmd.h" 184902524cSMatthias Ringwald 194902524cSMatthias Ringwald #include "btstack_memory.h" 204902524cSMatthias Ringwald #include "hci.h" 214902524cSMatthias Ringwald #include "hci_dump.h" 224902524cSMatthias Ringwald #include "ble/gatt_client.h" 234902524cSMatthias Ringwald #include "ble/att_db.h" 244902524cSMatthias Ringwald #include "profile.h" 254902524cSMatthias Ringwald #include "expected_results.h" 264902524cSMatthias Ringwald 278404d3b7SMilanka Ringwald extern "C" void hci_setup_le_connection(uint16_t con_handle); 288404d3b7SMilanka Ringwald 294902524cSMatthias Ringwald static uint16_t gatt_client_handle = 0x40; 304902524cSMatthias Ringwald static int gatt_query_complete = 0; 314902524cSMatthias Ringwald 324902524cSMatthias Ringwald typedef enum { 334902524cSMatthias Ringwald IDLE, 344902524cSMatthias Ringwald DISCOVER_PRIMARY_SERVICES, 354902524cSMatthias Ringwald DISCOVER_PRIMARY_SERVICE_WITH_UUID16, 364902524cSMatthias Ringwald DISCOVER_PRIMARY_SERVICE_WITH_UUID128, 374902524cSMatthias Ringwald 384902524cSMatthias Ringwald DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16, 394902524cSMatthias Ringwald DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128, 404902524cSMatthias Ringwald 414902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16, 424902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128, 434902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_BY_UUID16, 444902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_BY_UUID128, 454902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID, 464902524cSMatthias Ringwald 474902524cSMatthias Ringwald READ_CHARACTERISTIC_VALUE, 484902524cSMatthias Ringwald READ_LONG_CHARACTERISTIC_VALUE, 494902524cSMatthias Ringwald WRITE_CHARACTERISTIC_VALUE, 504902524cSMatthias Ringwald WRITE_LONG_CHARACTERISTIC_VALUE, 514902524cSMatthias Ringwald 524902524cSMatthias Ringwald DISCOVER_CHARACTERISTIC_DESCRIPTORS, 534902524cSMatthias Ringwald READ_CHARACTERISTIC_DESCRIPTOR, 544902524cSMatthias Ringwald WRITE_CHARACTERISTIC_DESCRIPTOR, 554902524cSMatthias Ringwald WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION, 564902524cSMatthias Ringwald READ_LONG_CHARACTERISTIC_DESCRIPTOR, 574902524cSMatthias Ringwald WRITE_LONG_CHARACTERISTIC_DESCRIPTOR, 584902524cSMatthias Ringwald WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE, 594902524cSMatthias Ringwald WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE 604902524cSMatthias Ringwald } current_test_t; 614902524cSMatthias Ringwald 624902524cSMatthias Ringwald current_test_t test = IDLE; 634902524cSMatthias Ringwald 644902524cSMatthias Ringwald uint8_t characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb}; 654902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000; 664902524cSMatthias Ringwald 674902524cSMatthias Ringwald static int result_index; 684902524cSMatthias Ringwald static uint8_t result_counter; 694902524cSMatthias Ringwald 704902524cSMatthias Ringwald static gatt_client_service_t services[50]; 714902524cSMatthias Ringwald static gatt_client_service_t included_services[50]; 724902524cSMatthias Ringwald 734902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50]; 744902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50]; 754902524cSMatthias Ringwald 764902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void); 774902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void); 784902524cSMatthias Ringwald 794902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ 804902524cSMatthias Ringwald for (int i=0; i<size; i++){ 814902524cSMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]); 824902524cSMatthias Ringwald } 834902524cSMatthias Ringwald } 844902524cSMatthias Ringwald 854902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) { 864902524cSMatthias Ringwald printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 874902524cSMatthias Ringwald uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], 884902524cSMatthias Ringwald uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); 894902524cSMatthias Ringwald } 904902524cSMatthias Ringwald 914902524cSMatthias Ringwald //static int counter = 0; 924902524cSMatthias Ringwald void CHECK_EQUAL_GATT_ATTRIBUTE(const uint8_t * exp_uuid, const uint8_t * exp_handles, uint8_t * uuid, uint16_t start_handle, uint16_t end_handle){ 934902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16); 944902524cSMatthias Ringwald if (!exp_handles) return; 954902524cSMatthias Ringwald CHECK_EQUAL(exp_handles[0], start_handle); 964902524cSMatthias Ringwald CHECK_EQUAL(exp_handles[1], end_handle); 974902524cSMatthias Ringwald } 984902524cSMatthias Ringwald 994902524cSMatthias Ringwald // ----------------------------------------------------- 1004902524cSMatthias Ringwald 1014902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){ 1024902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1034902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuid16, primary_service_uuid16_handles, services[0].uuid128, services[0].start_group_handle, services[0].end_group_handle); 1044902524cSMatthias Ringwald } 1054902524cSMatthias Ringwald 1064902524cSMatthias Ringwald 1074902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){ 1084902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1094902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuid128, primary_service_uuid128_handles, services[0].uuid128, services[0].start_group_handle, services[0].end_group_handle); 1104902524cSMatthias Ringwald } 1114902524cSMatthias Ringwald 1124902524cSMatthias Ringwald static void verify_primary_services(void){ 1134902524cSMatthias Ringwald CHECK_EQUAL(6, result_index); 1144902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1154902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle); 1164902524cSMatthias Ringwald } 1174902524cSMatthias Ringwald } 1184902524cSMatthias Ringwald 1194902524cSMatthias Ringwald static void verify_included_services_uuid16(void){ 1204902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1214902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(included_services_uuid16, included_services_uuid16_handles, included_services[0].uuid128, included_services[0].start_group_handle, included_services[0].end_group_handle); 1224902524cSMatthias Ringwald } 1234902524cSMatthias Ringwald 1244902524cSMatthias Ringwald static void verify_included_services_uuid128(void){ 1254902524cSMatthias Ringwald CHECK_EQUAL(2, result_index); 1264902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1274902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(included_services_uuid128[i], included_services_uuid128_handles[i], included_services[i].uuid128, included_services[i].start_group_handle, included_services[i].end_group_handle); 1284902524cSMatthias Ringwald } 1294902524cSMatthias Ringwald } 1304902524cSMatthias Ringwald 1314902524cSMatthias Ringwald static void verify_charasteristics(void){ 1324902524cSMatthias Ringwald CHECK_EQUAL(15, result_index); 1334902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1344902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle); 1354902524cSMatthias Ringwald } 1364902524cSMatthias Ringwald } 1374902524cSMatthias Ringwald 1384902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){ 1394902524cSMatthias Ringwald uint8_t * expected_value = (uint8_t*)&long_value[value_offset]; 1404902524cSMatthias Ringwald CHECK(value_length); 1414902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(expected_value, value, value_length); 1424902524cSMatthias Ringwald if (value_offset + value_length != sizeof(long_value)) return; 1434902524cSMatthias Ringwald result_counter++; 1444902524cSMatthias Ringwald } 1454902524cSMatthias Ringwald 1464902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 1474902524cSMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return; 1484902524cSMatthias Ringwald uint8_t status; 1494902524cSMatthias Ringwald gatt_client_service_t service; 1504902524cSMatthias Ringwald gatt_client_characteristic_t characteristic; 1514902524cSMatthias Ringwald gatt_client_characteristic_descriptor_t descriptor; 1524902524cSMatthias Ringwald switch (packet[0]){ 1534902524cSMatthias Ringwald case GATT_EVENT_QUERY_COMPLETE: 1544902524cSMatthias Ringwald status = packet[4]; 1554902524cSMatthias Ringwald gatt_query_complete = 1; 1564902524cSMatthias Ringwald if (status){ 1574902524cSMatthias Ringwald gatt_query_complete = 0; 1584902524cSMatthias Ringwald printf("GATT_EVENT_QUERY_COMPLETE failed with status 0x%02X\n", status); 1594902524cSMatthias Ringwald } 1604902524cSMatthias Ringwald break; 1614902524cSMatthias Ringwald case GATT_EVENT_SERVICE_QUERY_RESULT: 1624902524cSMatthias Ringwald service.start_group_handle = little_endian_read_16(packet, 4); 1634902524cSMatthias Ringwald service.end_group_handle = little_endian_read_16(packet, 6); 1644902524cSMatthias Ringwald service.uuid16 = 0; 1654902524cSMatthias Ringwald reverse_128(&packet[8], service.uuid128); 1664902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(service.uuid128)){ 1674902524cSMatthias Ringwald service.uuid16 = big_endian_read_32(service.uuid128, 0); 1684902524cSMatthias Ringwald } 1694902524cSMatthias Ringwald services[result_index++] = service; 1704902524cSMatthias Ringwald result_counter++; 1714902524cSMatthias Ringwald break; 1724902524cSMatthias Ringwald case GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT: 1734902524cSMatthias Ringwald service.start_group_handle = little_endian_read_16(packet, 6); 1744902524cSMatthias Ringwald service.end_group_handle = little_endian_read_16(packet, 8); 1754902524cSMatthias Ringwald service.uuid16 = 0; 1764902524cSMatthias Ringwald reverse_128(&packet[10], service.uuid128); 1774902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(service.uuid128)){ 1784902524cSMatthias Ringwald service.uuid16 = big_endian_read_32(service.uuid128, 0); 1794902524cSMatthias Ringwald } 1804902524cSMatthias Ringwald included_services[result_index++] = service; 1814902524cSMatthias Ringwald result_counter++; 1824902524cSMatthias Ringwald break; 1834902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT: 1844902524cSMatthias Ringwald characteristic.start_handle = little_endian_read_16(packet, 4); 1854902524cSMatthias Ringwald characteristic.value_handle = little_endian_read_16(packet, 6); 1864902524cSMatthias Ringwald characteristic.end_handle = little_endian_read_16(packet, 8); 1874902524cSMatthias Ringwald characteristic.properties = little_endian_read_16(packet, 10); 1884902524cSMatthias Ringwald characteristic.uuid16 = 0; 1894902524cSMatthias Ringwald reverse_128(&packet[12], characteristic.uuid128); 1904902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(characteristic.uuid128)){ 1914902524cSMatthias Ringwald characteristic.uuid16 = big_endian_read_32(characteristic.uuid128, 0); 1924902524cSMatthias Ringwald } 1934902524cSMatthias Ringwald characteristics[result_index++] = characteristic; 1944902524cSMatthias Ringwald result_counter++; 1954902524cSMatthias Ringwald break; 1964902524cSMatthias Ringwald case GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT: 1974902524cSMatthias Ringwald descriptor.handle = little_endian_read_16(packet, 4); 1984902524cSMatthias Ringwald reverse_128(&packet[6], descriptor.uuid128); 1994902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(descriptor.uuid128)){ 2004902524cSMatthias Ringwald descriptor.uuid16 = big_endian_read_32(descriptor.uuid128, 0); 2014902524cSMatthias Ringwald } 2024902524cSMatthias Ringwald descriptors[result_index++] = descriptor; 2034902524cSMatthias Ringwald result_counter++; 2044902524cSMatthias Ringwald break; 2054902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT: 2064902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT: 2074902524cSMatthias Ringwald CHECK_EQUAL(short_value_length, little_endian_read_16(packet, 6)); 2084902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t*)short_value, &packet[8], short_value_length); 2094902524cSMatthias Ringwald result_counter++; 2104902524cSMatthias Ringwald break; 2114902524cSMatthias Ringwald case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT: 2124902524cSMatthias Ringwald case GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT: 2134902524cSMatthias Ringwald verify_blob(little_endian_read_16(packet, 8), little_endian_read_16(packet, 6), &packet[10]); 2144902524cSMatthias Ringwald result_counter++; 2154902524cSMatthias Ringwald break; 2164902524cSMatthias Ringwald } 2174902524cSMatthias Ringwald } 2184902524cSMatthias Ringwald 2194902524cSMatthias Ringwald extern "C" int att_write_callback(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size){ 2204902524cSMatthias Ringwald switch(test){ 2214902524cSMatthias Ringwald case WRITE_CHARACTERISTIC_DESCRIPTOR: 2224902524cSMatthias Ringwald case WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION: 2234902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode); 2244902524cSMatthias Ringwald CHECK_EQUAL(0, offset); 2254902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(indication, buffer, 2); 2264902524cSMatthias Ringwald result_counter++; 2274902524cSMatthias Ringwald break; 2284902524cSMatthias Ringwald case WRITE_CHARACTERISTIC_VALUE: 2294902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode); 2304902524cSMatthias Ringwald CHECK_EQUAL(0, offset); 2314902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t *)short_value, buffer, short_value_length); 2324902524cSMatthias Ringwald result_counter++; 2334902524cSMatthias Ringwald break; 2344902524cSMatthias Ringwald case WRITE_LONG_CHARACTERISTIC_DESCRIPTOR: 2354902524cSMatthias Ringwald case WRITE_LONG_CHARACTERISTIC_VALUE: 2364902524cSMatthias Ringwald case WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE: 2374902524cSMatthias Ringwald if (transaction_mode == ATT_TRANSACTION_MODE_VALIDATE) break; 2384902524cSMatthias Ringwald if (transaction_mode == ATT_TRANSACTION_MODE_EXECUTE) break; 2394902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_ACTIVE, transaction_mode); 2404902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t *)&long_value[offset], buffer, buffer_size); 2414902524cSMatthias Ringwald if (offset + buffer_size != sizeof(long_value)) break; 2424902524cSMatthias Ringwald result_counter++; 2434902524cSMatthias Ringwald break; 2444902524cSMatthias Ringwald default: 2454902524cSMatthias Ringwald break; 2464902524cSMatthias Ringwald } 2474902524cSMatthias Ringwald return 0; 2484902524cSMatthias Ringwald } 2494902524cSMatthias Ringwald 2504902524cSMatthias Ringwald int copy_bytes(uint8_t * value, uint16_t value_length, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ 2514902524cSMatthias Ringwald int blob_length = value_length - offset; 2524902524cSMatthias Ringwald if (blob_length >= buffer_size) blob_length = buffer_size; 2534902524cSMatthias Ringwald 2544902524cSMatthias Ringwald memcpy(buffer, &value[offset], blob_length); 2554902524cSMatthias Ringwald return blob_length; 2564902524cSMatthias Ringwald } 2574902524cSMatthias Ringwald 2584902524cSMatthias Ringwald extern "C" uint16_t att_read_callback(uint16_t handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ 2594902524cSMatthias Ringwald //printf("gatt client test, att_read_callback_t handle 0x%04x, offset %u, buffer %p, buffer_size %u\n", handle, offset, buffer, buffer_size); 2604902524cSMatthias Ringwald switch(test){ 2614902524cSMatthias Ringwald case READ_CHARACTERISTIC_DESCRIPTOR: 2624902524cSMatthias Ringwald case READ_CHARACTERISTIC_VALUE: 2634902524cSMatthias Ringwald result_counter++; 2644902524cSMatthias Ringwald if (buffer){ 2654902524cSMatthias Ringwald return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size); 2664902524cSMatthias Ringwald } 2674902524cSMatthias Ringwald return short_value_length; 2684902524cSMatthias Ringwald case READ_LONG_CHARACTERISTIC_DESCRIPTOR: 2694902524cSMatthias Ringwald case READ_LONG_CHARACTERISTIC_VALUE: 2704902524cSMatthias Ringwald result_counter++; 2714902524cSMatthias Ringwald if (buffer) { 2724902524cSMatthias Ringwald return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size); 2734902524cSMatthias Ringwald } 2744902524cSMatthias Ringwald return long_value_length; 2754902524cSMatthias Ringwald default: 2764902524cSMatthias Ringwald break; 2774902524cSMatthias Ringwald } 2784902524cSMatthias Ringwald return 0; 2794902524cSMatthias Ringwald } 2804902524cSMatthias Ringwald 2814902524cSMatthias Ringwald // static const char * decode_status(uint8_t status){ 2824902524cSMatthias Ringwald // switch (status){ 2834902524cSMatthias Ringwald // case 0: return "0"; 2844902524cSMatthias Ringwald // case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE"; 2854902524cSMatthias Ringwald // case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS"; 2864902524cSMatthias Ringwald // case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED"; 2874902524cSMatthias Ringwald // case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG"; 2884902524cSMatthias Ringwald // case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY"; 2894902524cSMatthias Ringwald // case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED"; 2904902524cSMatthias Ringwald // case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED"; 2914902524cSMatthias Ringwald // } 2924902524cSMatthias Ringwald // } 2934902524cSMatthias Ringwald 2944902524cSMatthias Ringwald TEST_GROUP(GATTClient){ 2954902524cSMatthias Ringwald int acl_buffer_size; 2964902524cSMatthias Ringwald uint8_t acl_buffer[27]; 2974902524cSMatthias Ringwald uint8_t status; 2984902524cSMatthias Ringwald 2994902524cSMatthias Ringwald void setup(void){ 3004902524cSMatthias Ringwald result_counter = 0; 3014902524cSMatthias Ringwald result_index = 0; 3024902524cSMatthias Ringwald test = IDLE; 3038404d3b7SMilanka Ringwald hci_setup_le_connection(gatt_client_handle); 3044902524cSMatthias Ringwald } 3054902524cSMatthias Ringwald 3064902524cSMatthias Ringwald void reset_query_state(void){ 3078404d3b7SMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 3088404d3b7SMilanka Ringwald gatt_client->gatt_client_state = P_READY; 309a382a4adSMilanka Ringwald gatt_client_set_required_security_level(LEVEL_0); 310a382a4adSMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(1); 3118404d3b7SMilanka Ringwald 3124902524cSMatthias Ringwald gatt_query_complete = 0; 3134902524cSMatthias Ringwald result_counter = 0; 3144902524cSMatthias Ringwald result_index = 0; 3154902524cSMatthias Ringwald } 3168404d3b7SMilanka Ringwald 3178404d3b7SMilanka Ringwald void set_wrong_gatt_client_state(void){ 3188404d3b7SMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 3198404d3b7SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 3208404d3b7SMilanka Ringwald gatt_client->gatt_client_state = P_W2_SEND_SERVICE_QUERY; 3218404d3b7SMilanka Ringwald } 3224902524cSMatthias Ringwald }; 3234902524cSMatthias Ringwald 324a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_setters){ 325a382a4adSMilanka Ringwald gatt_client_set_required_security_level(LEVEL_4); 326a382a4adSMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(0); 327a382a4adSMilanka Ringwald } 3284902524cSMatthias Ringwald 329*617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_is_ready_mtu_exchange_disabled){ 330*617a2595SMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(0); 331*617a2595SMilanka Ringwald int status = gatt_client_is_ready(gatt_client_handle); 332*617a2595SMilanka Ringwald CHECK_EQUAL(1, status); 333*617a2595SMilanka Ringwald } 334*617a2595SMilanka Ringwald 3354902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){ 3364902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICES; 3378404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 3388404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 3398404d3b7SMilanka Ringwald 3408404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 3418404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3428404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 3438404d3b7SMilanka Ringwald 3444902524cSMatthias Ringwald reset_query_state(); 3454902524cSMatthias Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3464902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3474902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3484902524cSMatthias Ringwald verify_primary_services(); 3494902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3504902524cSMatthias Ringwald } 3514902524cSMatthias Ringwald 3524902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){ 3534902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16; 3544902524cSMatthias Ringwald reset_query_state(); 3554902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3564902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3574902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3584902524cSMatthias Ringwald verify_primary_services_with_uuid16(); 3594902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3604902524cSMatthias Ringwald } 3614902524cSMatthias Ringwald 3624902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){ 3634902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128; 3644902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3654902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3664902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3674902524cSMatthias Ringwald verify_primary_services_with_uuid128(); 3684902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 369a382a4adSMilanka Ringwald 370a382a4adSMilanka Ringwald // invalid con handle 371a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, primary_service_uuid128); 372a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 373a382a4adSMilanka Ringwald 374a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 375a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 376a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 3774902524cSMatthias Ringwald } 3784902524cSMatthias Ringwald 3794902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){ 3804902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16; 3814902524cSMatthias Ringwald reset_query_state(); 3824902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3834902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3844902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3854902524cSMatthias Ringwald 3864902524cSMatthias Ringwald reset_query_state(); 3874902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 3884902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3894902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3904902524cSMatthias Ringwald verify_included_services_uuid16(); 3914902524cSMatthias Ringwald } 3924902524cSMatthias Ringwald 3934902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){ 3944902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128; 3954902524cSMatthias Ringwald reset_query_state(); 3964902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3974902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3984902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3994902524cSMatthias Ringwald 4004902524cSMatthias Ringwald reset_query_state(); 4014902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 4024902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4034902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4044902524cSMatthias Ringwald verify_included_services_uuid128(); 405a382a4adSMilanka Ringwald 406a382a4adSMilanka Ringwald // invalid con handle 407a382a4adSMilanka Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); 408a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 409a382a4adSMilanka Ringwald 410a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 411a382a4adSMilanka Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 412a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4134902524cSMatthias Ringwald } 4144902524cSMatthias Ringwald 4154902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){ 4164902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16; 4174902524cSMatthias Ringwald reset_query_state(); 4184902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4194902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4204902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4214902524cSMatthias Ringwald 4224902524cSMatthias Ringwald reset_query_state(); 4234902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 4244902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4254902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4264902524cSMatthias Ringwald verify_charasteristics(); 427a382a4adSMilanka Ringwald 428a382a4adSMilanka Ringwald // invalid con handle 429a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); 430a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 431a382a4adSMilanka Ringwald 432a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 433a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 434a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4354902524cSMatthias Ringwald } 4364902524cSMatthias Ringwald 4374902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){ 4384902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID16; 4394902524cSMatthias Ringwald reset_query_state(); 4404902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 4414902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4424902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4434902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 444a382a4adSMilanka Ringwald 445a382a4adSMilanka Ringwald // invalid con handle 446a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 0x30, 0x32, 0xF102); 447a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 448a382a4adSMilanka Ringwald 449a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 450a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 451a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4524902524cSMatthias Ringwald } 4534902524cSMatthias Ringwald 4544902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){ 4554902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID128; 4564902524cSMatthias Ringwald reset_query_state(); 4574902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid128(handle_ble_client_event, gatt_client_handle, characteristic_handles[1][0], characteristic_handles[1][1], characteristic_uuids[1]); 4584902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4594902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4604902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 461a382a4adSMilanka Ringwald 462a382a4adSMilanka Ringwald // invalid con handle 463a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristic_handles[1][0], characteristic_handles[1][1], characteristic_uuids[1]); 464a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 465a382a4adSMilanka Ringwald 466a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 467a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid128(handle_ble_client_event, gatt_client_handle, characteristic_handles[1][0], characteristic_handles[1][1], characteristic_uuids[1]); 468a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4694902524cSMatthias Ringwald } 4704902524cSMatthias Ringwald 4714902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){ 4724902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4734902524cSMatthias Ringwald reset_query_state(); 4744902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 4754902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4764902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4774902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4784902524cSMatthias Ringwald 4794902524cSMatthias Ringwald reset_query_state(); 4804902524cSMatthias Ringwald uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 4814902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 4824902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4834902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4844902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4854902524cSMatthias Ringwald 4864902524cSMatthias Ringwald reset_query_state(); 4874902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 4884902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4894902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4904902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4914902524cSMatthias Ringwald } 4924902524cSMatthias Ringwald 4934902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){ 4944902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4954902524cSMatthias Ringwald reset_query_state(); 4964902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4974902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4984902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4994902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5004902524cSMatthias Ringwald 5014902524cSMatthias Ringwald reset_query_state(); 5024902524cSMatthias Ringwald uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 5034902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 5044902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5054902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5064902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5074902524cSMatthias Ringwald 5084902524cSMatthias Ringwald reset_query_state(); 5094902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5104902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5114902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5124902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5134902524cSMatthias Ringwald } 5144902524cSMatthias Ringwald 5154902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){ 5164902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTIC_DESCRIPTORS; 5178404d3b7SMilanka Ringwald 5188404d3b7SMilanka Ringwald reset_query_state(); 5198404d3b7SMilanka Ringwald // invalid con handle 5208404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16); 5218404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 5228404d3b7SMilanka Ringwald 5238404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 5248404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5258404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5268404d3b7SMilanka Ringwald 5274902524cSMatthias Ringwald reset_query_state(); 5284902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5294902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5304902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5314902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5324902524cSMatthias Ringwald 5334902524cSMatthias Ringwald reset_query_state(); 5344902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5354902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5364902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5374902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5384902524cSMatthias Ringwald 5394902524cSMatthias Ringwald reset_query_state(); 5404902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 5414902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5424902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5434902524cSMatthias Ringwald CHECK(result_counter); 5444902524cSMatthias Ringwald CHECK_EQUAL(3, result_index); 5454902524cSMatthias Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 5464902524cSMatthias Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 5474902524cSMatthias Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 5484902524cSMatthias Ringwald } 5494902524cSMatthias Ringwald 5504902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){ 5514902524cSMatthias Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 5524902524cSMatthias Ringwald reset_query_state(); 5534902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5544902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5554902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5564902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5574902524cSMatthias Ringwald 5584902524cSMatthias Ringwald reset_query_state(); 5594902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5604902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5614902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5624902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5634902524cSMatthias Ringwald 5648404d3b7SMilanka Ringwald // invalid con handle 5658404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5668404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 5678404d3b7SMilanka Ringwald 5688404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 5698404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5708404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5718404d3b7SMilanka Ringwald 5724902524cSMatthias Ringwald reset_query_state(); 5734902524cSMatthias Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5744902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5754902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5764902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5778404d3b7SMilanka Ringwald 5788404d3b7SMilanka Ringwald reset_query_state(); 5798404d3b7SMilanka Ringwald characteristics->properties = 0; 5808404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5818404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status); 5828404d3b7SMilanka Ringwald 5838404d3b7SMilanka Ringwald reset_query_state(); 5848404d3b7SMilanka Ringwald characteristics->properties = 0; 5858404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); 5868404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status); 5874902524cSMatthias Ringwald } 5884902524cSMatthias Ringwald 5894902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){ 5904902524cSMatthias Ringwald test = READ_CHARACTERISTIC_DESCRIPTOR; 5914902524cSMatthias Ringwald reset_query_state(); 5924902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5934902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5944902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5954902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5964902524cSMatthias Ringwald 5974902524cSMatthias Ringwald reset_query_state(); 5984902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5994902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6004902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6014902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6024902524cSMatthias Ringwald 6034902524cSMatthias Ringwald reset_query_state(); 6044902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 6054902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6064902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6074902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6084902524cSMatthias Ringwald 609a382a4adSMilanka Ringwald // invalid con handle 610a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0]); 611a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 612a382a4adSMilanka Ringwald 613a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 614a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 615a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 616a382a4adSMilanka Ringwald 617a382a4adSMilanka Ringwald reset_query_state(); 618a382a4adSMilanka Ringwald uint16_t end_handle = characteristics[0].end_handle; 619a382a4adSMilanka Ringwald characteristics[0].end_handle = characteristics[0].value_handle; 620a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 621a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 622a382a4adSMilanka Ringwald characteristics[0].end_handle = end_handle; 623a382a4adSMilanka Ringwald 6244902524cSMatthias Ringwald reset_query_state(); 6254902524cSMatthias Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6264902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6274902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6284902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6298404d3b7SMilanka Ringwald 6308404d3b7SMilanka Ringwald // invalid con handle 6318404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]); 6328404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 6338404d3b7SMilanka Ringwald 6348404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 6358404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6368404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 6374902524cSMatthias Ringwald } 6384902524cSMatthias Ringwald 639a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristic_using_value_handle){ 640a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 641a382a4adSMilanka Ringwald reset_query_state(); 642a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 643a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 644a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 645a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 646a382a4adSMilanka Ringwald 647a382a4adSMilanka Ringwald reset_query_state(); 648a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 649a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 650a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 651a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 652a382a4adSMilanka Ringwald 653a382a4adSMilanka Ringwald // invalid con handle 654a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle); 655a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 656a382a4adSMilanka Ringwald 657a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 658a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle); 659a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 660a382a4adSMilanka Ringwald reset_query_state(); 661a382a4adSMilanka Ringwald } 662a382a4adSMilanka Ringwald 663a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset){ 664a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 665a382a4adSMilanka Ringwald reset_query_state(); 666a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 667a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 668a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 669a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 670a382a4adSMilanka Ringwald 671a382a4adSMilanka Ringwald reset_query_state(); 672a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 673a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 674a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 675a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 676a382a4adSMilanka Ringwald 677a382a4adSMilanka Ringwald // invalid con handle 678a382a4adSMilanka Ringwald status = gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, 0); 679a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 680a382a4adSMilanka Ringwald 681a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 682a382a4adSMilanka Ringwald status = gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0); 683a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 684a382a4adSMilanka Ringwald reset_query_state(); 685a382a4adSMilanka Ringwald } 686a382a4adSMilanka Ringwald 687a382a4adSMilanka Ringwald 688a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid16){ 689a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 690a382a4adSMilanka Ringwald reset_query_state(); 691a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 692a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 693a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 694a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 695a382a4adSMilanka Ringwald 696a382a4adSMilanka Ringwald reset_query_state(); 697a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 698a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 699a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 700a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 701a382a4adSMilanka Ringwald 702a382a4adSMilanka Ringwald reset_query_state(); 703a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristics_by_uuid16(handle_ble_client_event, gatt_client_handle, characteristics[0].start_handle, characteristics[0].end_handle, characteristics[0].uuid16); 704a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 705a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 706a382a4adSMilanka Ringwald 707a382a4adSMilanka Ringwald // invalid con handle 708a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristics_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].start_handle, characteristics[0].end_handle, characteristics[0].uuid16); 709a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 710a382a4adSMilanka Ringwald 711a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 712a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristics_by_uuid16(handle_ble_client_event, gatt_client_handle, characteristics[0].start_handle, characteristics[0].end_handle, characteristics[0].uuid16); 713a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 714a382a4adSMilanka Ringwald reset_query_state(); 715a382a4adSMilanka Ringwald } 716a382a4adSMilanka Ringwald 717a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid128){ 718a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 719a382a4adSMilanka Ringwald reset_query_state(); 720a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 721a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 722a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 723a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 724a382a4adSMilanka Ringwald 725a382a4adSMilanka Ringwald reset_query_state(); 726a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 727a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 728a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 729a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 730a382a4adSMilanka Ringwald 731a382a4adSMilanka Ringwald reset_query_state(); 732a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristics_by_uuid128(handle_ble_client_event, gatt_client_handle, characteristics[0].start_handle, characteristics[0].end_handle, characteristics[0].uuid128); 733a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 734a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 735a382a4adSMilanka Ringwald 736a382a4adSMilanka Ringwald // invalid con handle 737a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristics_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].start_handle, characteristics[0].end_handle, characteristics[0].uuid128); 738a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 739a382a4adSMilanka Ringwald 740a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 741a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristics_by_uuid128(handle_ble_client_event, gatt_client_handle, characteristics[0].start_handle, characteristics[0].end_handle, characteristics[0].uuid128); 742a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 743a382a4adSMilanka Ringwald reset_query_state(); 744a382a4adSMilanka Ringwald } 745a382a4adSMilanka Ringwald 746a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_write_characteristic_descriptor_using_descriptor_handle){ 747a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 748a382a4adSMilanka Ringwald reset_query_state(); 749a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 750a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 751a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 752a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 753a382a4adSMilanka Ringwald 754a382a4adSMilanka Ringwald reset_query_state(); 755a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 756a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 757a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 758a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 759a382a4adSMilanka Ringwald 760a382a4adSMilanka Ringwald 761a382a4adSMilanka Ringwald reset_query_state(); 762a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 763a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 764a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 765a382a4adSMilanka Ringwald CHECK_EQUAL(3, result_counter); 766a382a4adSMilanka Ringwald 767a382a4adSMilanka Ringwald reset_query_state(); 768a382a4adSMilanka Ringwald status = gatt_client_write_characteristic_descriptor_using_descriptor_handle(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, characteristics[0].end_handle, characteristics[0].uuid128); 769a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 770a382a4adSMilanka Ringwald 771a382a4adSMilanka Ringwald // invalid con handle 772a382a4adSMilanka Ringwald status = gatt_client_write_characteristic_descriptor_using_descriptor_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, descriptors[0].handle, characteristics[0].end_handle, characteristics[0].uuid128); 773a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 774a382a4adSMilanka Ringwald 775a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 776a382a4adSMilanka Ringwald status = gatt_client_write_characteristic_descriptor_using_descriptor_handle(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, characteristics[0].end_handle, characteristics[0].uuid128); 777a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 778a382a4adSMilanka Ringwald reset_query_state(); 779a382a4adSMilanka Ringwald } 780a382a4adSMilanka Ringwald 781a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_prepare_write){ 782a382a4adSMilanka Ringwald reset_query_state(); 783a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 784a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 785a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 786a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 787a382a4adSMilanka Ringwald 788a382a4adSMilanka Ringwald reset_query_state(); 789a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 790a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 791a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 792a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 793a382a4adSMilanka Ringwald 794a382a4adSMilanka Ringwald reset_query_state(); 795a382a4adSMilanka Ringwald status = gatt_client_prepare_write(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, short_value_length, (uint8_t*)short_value); 796a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 797a382a4adSMilanka Ringwald 798a382a4adSMilanka Ringwald // invalid con handle 799a382a4adSMilanka Ringwald status = gatt_client_prepare_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, 0, short_value_length, (uint8_t*)short_value); 800a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 801a382a4adSMilanka Ringwald 802a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 803a382a4adSMilanka Ringwald status = gatt_client_prepare_write(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, short_value_length, (uint8_t*)short_value); 804a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 805a382a4adSMilanka Ringwald reset_query_state(); 806a382a4adSMilanka Ringwald } 807a382a4adSMilanka Ringwald 808a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_execute_write){ 809a382a4adSMilanka Ringwald reset_query_state(); 810a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); 811a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 812a382a4adSMilanka Ringwald 813a382a4adSMilanka Ringwald // invalid con handle 814a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 815a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 816a382a4adSMilanka Ringwald 817a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 818a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); 819a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 820a382a4adSMilanka Ringwald reset_query_state(); 821a382a4adSMilanka Ringwald } 822a382a4adSMilanka Ringwald 823a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_cancel_write){ 824a382a4adSMilanka Ringwald reset_query_state(); 825a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); 826a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 827a382a4adSMilanka Ringwald 828a382a4adSMilanka Ringwald // invalid con handle 829a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 830a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 831a382a4adSMilanka Ringwald 832a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 833a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); 834a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 835a382a4adSMilanka Ringwald reset_query_state(); 836a382a4adSMilanka Ringwald } 837a382a4adSMilanka Ringwald 8384902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){ 8394902524cSMatthias Ringwald test = READ_CHARACTERISTIC_VALUE; 8404902524cSMatthias Ringwald reset_query_state(); 8414902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 8424902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8434902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8444902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8454902524cSMatthias Ringwald 8464902524cSMatthias Ringwald reset_query_state(); 8474902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 8484902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8494902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8504902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8514902524cSMatthias Ringwald 8524902524cSMatthias Ringwald reset_query_state(); 8534902524cSMatthias Ringwald status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 8544902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8554902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8564902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 8574902524cSMatthias Ringwald } 8584902524cSMatthias Ringwald 8594902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){ 8604902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_VALUE; 8614902524cSMatthias Ringwald reset_query_state(); 8624902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 8634902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8644902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8654902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8664902524cSMatthias Ringwald 8674902524cSMatthias Ringwald reset_query_state(); 8684902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 8694902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8704902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8714902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8724902524cSMatthias Ringwald 8738404d3b7SMilanka Ringwald // invalid con handle 8748404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, short_value_length, (uint8_t*)short_value); 8758404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 8768404d3b7SMilanka Ringwald 8778404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 8788404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, short_value_length, (uint8_t*)short_value); 8798404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 8808404d3b7SMilanka Ringwald 8818404d3b7SMilanka Ringwald 8824902524cSMatthias Ringwald reset_query_state(); 8834902524cSMatthias Ringwald status = gatt_client_write_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, short_value_length, (uint8_t*)short_value); 8844902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8854902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8864902524cSMatthias Ringwald } 8874902524cSMatthias Ringwald 8884902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){ 8894902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_DESCRIPTOR; 8904902524cSMatthias Ringwald reset_query_state(); 8914902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 8924902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8934902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8944902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8954902524cSMatthias Ringwald 8964902524cSMatthias Ringwald reset_query_state(); 8974902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 8984902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8994902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9004902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9014902524cSMatthias Ringwald 9024902524cSMatthias Ringwald reset_query_state(); 9034902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9044902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9054902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9064902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9074902524cSMatthias Ringwald 9084902524cSMatthias Ringwald reset_query_state(); 9094902524cSMatthias Ringwald status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication); 9104902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9114902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9124902524cSMatthias Ringwald } 9134902524cSMatthias Ringwald 9144902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){ 9154902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_VALUE; 9164902524cSMatthias Ringwald reset_query_state(); 9174902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9184902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9194902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9204902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9214902524cSMatthias Ringwald 9224902524cSMatthias Ringwald reset_query_state(); 9234902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 9244902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9254902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9264902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9274902524cSMatthias Ringwald 9284902524cSMatthias Ringwald reset_query_state(); 9294902524cSMatthias Ringwald status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9304902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9314902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9328404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 9334902524cSMatthias Ringwald } 9344902524cSMatthias Ringwald 9354902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){ 9364902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_DESCRIPTOR; 9374902524cSMatthias Ringwald reset_query_state(); 9384902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 9394902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9404902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9414902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9424902524cSMatthias Ringwald 9434902524cSMatthias Ringwald reset_query_state(); 9444902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 9454902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9464902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9474902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9484902524cSMatthias Ringwald 9494902524cSMatthias Ringwald reset_query_state(); 9504902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9514902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9524902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9534902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9544902524cSMatthias Ringwald 9554902524cSMatthias Ringwald reset_query_state(); 9564902524cSMatthias Ringwald result_counter = 0; 9574902524cSMatthias Ringwald status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 9584902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9594902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9608404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 9614902524cSMatthias Ringwald } 9624902524cSMatthias Ringwald 9634902524cSMatthias Ringwald 9644902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){ 9654902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR; 9664902524cSMatthias Ringwald reset_query_state(); 9674902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 9684902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9694902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9704902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9714902524cSMatthias Ringwald 9724902524cSMatthias Ringwald reset_query_state(); 9734902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 9744902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9754902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9764902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9774902524cSMatthias Ringwald 9784902524cSMatthias Ringwald reset_query_state(); 9794902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9804902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9814902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9824902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9834902524cSMatthias Ringwald 9844902524cSMatthias Ringwald result_counter = 0; 9854902524cSMatthias Ringwald status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value); 9864902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9874902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9884902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9894902524cSMatthias Ringwald } 9904902524cSMatthias Ringwald 9914902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){ 9924902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_VALUE; 9934902524cSMatthias Ringwald reset_query_state(); 9944902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9954902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9964902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9974902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9984902524cSMatthias Ringwald 9994902524cSMatthias Ringwald reset_query_state(); 10004902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10014902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10024902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10034902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10044902524cSMatthias Ringwald 10054902524cSMatthias Ringwald 10064902524cSMatthias Ringwald reset_query_state(); 10074902524cSMatthias Ringwald status = gatt_client_write_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 10084902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10094902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10104902524cSMatthias Ringwald } 10114902524cSMatthias Ringwald 10124902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){ 10134902524cSMatthias Ringwald test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE; 10144902524cSMatthias Ringwald reset_query_state(); 10154902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10164902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10174902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10184902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10194902524cSMatthias Ringwald 10204902524cSMatthias Ringwald reset_query_state(); 10214902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10224902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10234902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10244902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10254902524cSMatthias Ringwald 10268404d3b7SMilanka Ringwald // invalid con handle 10278404d3b7SMilanka Ringwald status = gatt_client_reliable_write_long_value_of_characteristic(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 10288404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 10298404d3b7SMilanka Ringwald 10308404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 10318404d3b7SMilanka Ringwald status = gatt_client_reliable_write_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 10328404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 10338404d3b7SMilanka Ringwald 10344902524cSMatthias Ringwald reset_query_state(); 10354902524cSMatthias Ringwald status = gatt_client_reliable_write_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 10364902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10374902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10384902524cSMatthias Ringwald } 10394902524cSMatthias Ringwald 10408404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){ 10418404d3b7SMilanka Ringwald reset_query_state(); 10428404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10438404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10448404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10458404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10468404d3b7SMilanka Ringwald 10478404d3b7SMilanka Ringwald reset_query_state(); 10488404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10498404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10508404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10518404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10528404d3b7SMilanka Ringwald 10538404d3b7SMilanka Ringwald reset_query_state(); 10548404d3b7SMilanka Ringwald status = gatt_client_write_long_value_of_characteristic_with_offset(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, long_value_length, (uint8_t*)long_value); 10558404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10568404d3b7SMilanka Ringwald 10578404d3b7SMilanka Ringwald reset_query_state(); 10588404d3b7SMilanka Ringwald // invalid con handle 10598404d3b7SMilanka Ringwald status = gatt_client_write_long_value_of_characteristic_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, 0, long_value_length, (uint8_t*)long_value); 10608404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 10618404d3b7SMilanka Ringwald 10628404d3b7SMilanka Ringwald reset_query_state(); 10638404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 10648404d3b7SMilanka Ringwald status = gatt_client_write_long_value_of_characteristic_with_offset(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, long_value_length, (uint8_t*)long_value); 10658404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 10668404d3b7SMilanka Ringwald } 10678404d3b7SMilanka Ringwald 10688404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){ 10698404d3b7SMilanka Ringwald reset_query_state(); 10708404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10718404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10728404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10738404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10748404d3b7SMilanka Ringwald 10758404d3b7SMilanka Ringwald reset_query_state(); 10768404d3b7SMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 10778404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10788404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10798404d3b7SMilanka Ringwald CHECK(result_counter); 10808404d3b7SMilanka Ringwald CHECK_EQUAL(3, result_index); 10818404d3b7SMilanka Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 10828404d3b7SMilanka Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 10838404d3b7SMilanka Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 10848404d3b7SMilanka Ringwald 10858404d3b7SMilanka Ringwald reset_query_state(); 10868404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 10878404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10888404d3b7SMilanka Ringwald 10898404d3b7SMilanka Ringwald reset_query_state(); 10908404d3b7SMilanka Ringwald // invalid con handle 10918404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, descriptors[0].handle, 0); 10928404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 10938404d3b7SMilanka Ringwald 10948404d3b7SMilanka Ringwald reset_query_state(); 10958404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 10968404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 10978404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 10988404d3b7SMilanka Ringwald } 10998404d3b7SMilanka Ringwald 11008404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){ 11018404d3b7SMilanka Ringwald reset_query_state(); 11028404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 11038404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11048404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11058404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11068404d3b7SMilanka Ringwald 11078404d3b7SMilanka Ringwald reset_query_state(); 11088404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 11098404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11108404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11118404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11128404d3b7SMilanka Ringwald 11138404d3b7SMilanka Ringwald uint16_t value_handles[] = {characteristics[0].value_handle}; 11148404d3b7SMilanka Ringwald 11158404d3b7SMilanka Ringwald reset_query_state(); 11168404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 11178404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11188404d3b7SMilanka Ringwald 11198404d3b7SMilanka Ringwald reset_query_state(); 11208404d3b7SMilanka Ringwald // invalid con handle 11218404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles); 11228404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 11238404d3b7SMilanka Ringwald 11248404d3b7SMilanka Ringwald reset_query_state(); 11258404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11268404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 11278404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 11288404d3b7SMilanka Ringwald } 11298404d3b7SMilanka Ringwald 11308404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){ 11318404d3b7SMilanka Ringwald reset_query_state(); 11328404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 11338404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11348404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11358404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11368404d3b7SMilanka Ringwald 11378404d3b7SMilanka Ringwald reset_query_state(); 11388404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 11398404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11408404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11418404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11428404d3b7SMilanka Ringwald 11438404d3b7SMilanka Ringwald uint16_t value_handles[] = {characteristics[0].value_handle}; 11448404d3b7SMilanka Ringwald 11458404d3b7SMilanka Ringwald reset_query_state(); 11468404d3b7SMilanka Ringwald // invalid con handle 11478404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 11488404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 11498404d3b7SMilanka Ringwald 11508404d3b7SMilanka Ringwald reset_query_state(); 11518404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11528404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 11538404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status); 11548404d3b7SMilanka Ringwald 11558404d3b7SMilanka Ringwald reset_query_state(); 11568404d3b7SMilanka Ringwald 11578404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value); 11588404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11598404d3b7SMilanka Ringwald } 11604902524cSMatthias Ringwald 1161a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_is_ready){ 1162a382a4adSMilanka Ringwald int status = gatt_client_is_ready(HCI_CON_HANDLE_INVALID); 1163a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1164a382a4adSMilanka Ringwald 1165a382a4adSMilanka Ringwald status = gatt_client_is_ready(gatt_client_handle); 1166a382a4adSMilanka Ringwald CHECK_EQUAL(1, status); 1167a382a4adSMilanka Ringwald } 1168a382a4adSMilanka Ringwald 1169a382a4adSMilanka Ringwald 1170a382a4adSMilanka Ringwald TEST(GATTClient, register_for_notification){ 1171a382a4adSMilanka Ringwald reset_query_state(); 1172a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 1173a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1174a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1175a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1176a382a4adSMilanka Ringwald 1177a382a4adSMilanka Ringwald reset_query_state(); 1178a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 1179a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1180a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1181a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1182a382a4adSMilanka Ringwald 1183a382a4adSMilanka Ringwald gatt_client_notification_t notification; 1184a382a4adSMilanka Ringwald 1185a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, &characteristics[0]); 1186a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1187a382a4adSMilanka Ringwald 1188a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, NULL); 1189a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1190a382a4adSMilanka Ringwald } 1191a382a4adSMilanka Ringwald 1192a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_signed_write_without_response){ 1193a382a4adSMilanka Ringwald reset_query_state(); 1194a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 1195a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1196a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1197a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1198a382a4adSMilanka Ringwald 1199a382a4adSMilanka Ringwald reset_query_state(); 1200a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 1201a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1202a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1203a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1204a382a4adSMilanka Ringwald 1205a382a4adSMilanka Ringwald reset_query_state(); 1206a382a4adSMilanka Ringwald // invalid con handle 1207a382a4adSMilanka Ringwald status = gatt_client_signed_write_without_response(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 1208a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 1209a382a4adSMilanka Ringwald 1210a382a4adSMilanka Ringwald reset_query_state(); 1211a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 1212a382a4adSMilanka Ringwald status = gatt_client_signed_write_without_response(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 1213a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1214a382a4adSMilanka Ringwald 1215a382a4adSMilanka Ringwald reset_query_state(); 1216a382a4adSMilanka Ringwald 1217a382a4adSMilanka Ringwald status = gatt_client_signed_write_without_response(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 1218a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1219a382a4adSMilanka Ringwald } 1220a382a4adSMilanka Ringwald 1221a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_discover_secondary_services){ 1222a382a4adSMilanka Ringwald reset_query_state(); 1223a382a4adSMilanka Ringwald // invalid con handle 1224a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 1225a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 1226a382a4adSMilanka Ringwald 1227a382a4adSMilanka Ringwald reset_query_state(); 1228a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 1229a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); 1230a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1231a382a4adSMilanka Ringwald 1232a382a4adSMilanka Ringwald reset_query_state(); 1233a382a4adSMilanka Ringwald 1234a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); 1235a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1236a382a4adSMilanka Ringwald } 1237a382a4adSMilanka Ringwald 1238*617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_request_can_write_without_response_event){ 1239*617a2595SMilanka Ringwald int status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 1240*617a2595SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 1241a382a4adSMilanka Ringwald 1242*617a2595SMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 1243*617a2595SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1244*617a2595SMilanka Ringwald btstack_packet_handler_t write_without_response_callback; 1245*617a2595SMilanka Ringwald gatt_client->write_without_response_callback = write_without_response_callback; 1246*617a2595SMilanka Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 1247*617a2595SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1248*617a2595SMilanka Ringwald 1249*617a2595SMilanka Ringwald gatt_client->write_without_response_callback = NULL; 1250*617a2595SMilanka Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 1251*617a2595SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 1252*617a2595SMilanka Ringwald } 1253*617a2595SMilanka Ringwald 1254*617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_send_mtu_negotiation){ 1255*617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 1256*617a2595SMilanka Ringwald 1257*617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); 1258*617a2595SMilanka Ringwald 1259*617a2595SMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 1260*617a2595SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1261*617a2595SMilanka Ringwald gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 1262*617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); 1263*617a2595SMilanka Ringwald 1264*617a2595SMilanka Ringwald gatt_client->mtu_state = SEND_MTU_EXCHANGE; 1265*617a2595SMilanka Ringwald } 1266a382a4adSMilanka Ringwald 1267a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_get_mtu){ 1268a382a4adSMilanka Ringwald reset_query_state(); 1269a382a4adSMilanka Ringwald uint16_t mtu; 1270a382a4adSMilanka Ringwald int status = gatt_client_get_mtu(HCI_CON_HANDLE_INVALID, &mtu); 1271a382a4adSMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 1272a382a4adSMilanka Ringwald 1273a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1274a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1275a382a4adSMilanka Ringwald CHECK_EQUAL(ATT_DEFAULT_MTU, mtu); 1276a382a4adSMilanka Ringwald 1277a382a4adSMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 1278a382a4adSMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1279a382a4adSMilanka Ringwald gatt_client->mtu = 30; 1280a382a4adSMilanka Ringwald 1281a382a4adSMilanka Ringwald gatt_client->mtu_state = MTU_EXCHANGED; 1282a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1283a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1284a382a4adSMilanka Ringwald CHECK_EQUAL(gatt_client->mtu, mtu); 1285a382a4adSMilanka Ringwald 1286a382a4adSMilanka Ringwald gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 1287a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1288a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1289a382a4adSMilanka Ringwald CHECK_EQUAL(gatt_client->mtu, mtu); 1290a382a4adSMilanka Ringwald 1291a382a4adSMilanka Ringwald gatt_client->mtu_state = SEND_MTU_EXCHANGE; 1292a382a4adSMilanka Ringwald } 1293a382a4adSMilanka Ringwald 1294a382a4adSMilanka Ringwald 12954902524cSMatthias Ringwald int main (int argc, const char * argv[]){ 12964902524cSMatthias Ringwald att_set_db(profile_data); 12974902524cSMatthias Ringwald att_set_write_callback(&att_write_callback); 12984902524cSMatthias Ringwald att_set_read_callback(&att_read_callback); 12994902524cSMatthias Ringwald 13004902524cSMatthias Ringwald gatt_client_init(); 13014902524cSMatthias Ringwald 13024902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 13034902524cSMatthias Ringwald } 1304