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 27*8404d3b7SMilanka Ringwald extern "C" void hci_setup_le_connection(uint16_t con_handle); 28*8404d3b7SMilanka 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; 303*8404d3b7SMilanka Ringwald hci_setup_le_connection(gatt_client_handle); 3044902524cSMatthias Ringwald } 3054902524cSMatthias Ringwald 3064902524cSMatthias Ringwald void reset_query_state(void){ 307*8404d3b7SMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 308*8404d3b7SMilanka Ringwald gatt_client->gatt_client_state = P_READY; 309*8404d3b7SMilanka Ringwald 3104902524cSMatthias Ringwald gatt_query_complete = 0; 3114902524cSMatthias Ringwald result_counter = 0; 3124902524cSMatthias Ringwald result_index = 0; 3134902524cSMatthias Ringwald } 314*8404d3b7SMilanka Ringwald 315*8404d3b7SMilanka Ringwald void set_wrong_gatt_client_state(void){ 316*8404d3b7SMilanka Ringwald gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle); 317*8404d3b7SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 318*8404d3b7SMilanka Ringwald gatt_client->gatt_client_state = P_W2_SEND_SERVICE_QUERY; 319*8404d3b7SMilanka Ringwald } 3204902524cSMatthias Ringwald }; 3214902524cSMatthias Ringwald 3224902524cSMatthias Ringwald 3234902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){ 3244902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICES; 325*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 326*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 327*8404d3b7SMilanka Ringwald 328*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 329*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 330*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 331*8404d3b7SMilanka Ringwald 3324902524cSMatthias Ringwald reset_query_state(); 3334902524cSMatthias Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3344902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3354902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3364902524cSMatthias Ringwald verify_primary_services(); 3374902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3384902524cSMatthias Ringwald } 3394902524cSMatthias Ringwald 3404902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){ 3414902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16; 3424902524cSMatthias Ringwald reset_query_state(); 3434902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3444902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3454902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3464902524cSMatthias Ringwald verify_primary_services_with_uuid16(); 3474902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3484902524cSMatthias Ringwald } 3494902524cSMatthias Ringwald 3504902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){ 3514902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128; 3524902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3534902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3544902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3554902524cSMatthias Ringwald verify_primary_services_with_uuid128(); 3564902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3574902524cSMatthias Ringwald } 3584902524cSMatthias Ringwald 3594902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){ 3604902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16; 3614902524cSMatthias Ringwald reset_query_state(); 3624902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3634902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3644902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3654902524cSMatthias Ringwald 3664902524cSMatthias Ringwald reset_query_state(); 3674902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 3684902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3694902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3704902524cSMatthias Ringwald verify_included_services_uuid16(); 3714902524cSMatthias Ringwald } 3724902524cSMatthias Ringwald 3734902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){ 3744902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128; 3754902524cSMatthias Ringwald reset_query_state(); 3764902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3774902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3784902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3794902524cSMatthias Ringwald 3804902524cSMatthias Ringwald reset_query_state(); 3814902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 3824902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3834902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3844902524cSMatthias Ringwald verify_included_services_uuid128(); 3854902524cSMatthias Ringwald } 3864902524cSMatthias Ringwald 3874902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){ 3884902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16; 3894902524cSMatthias Ringwald reset_query_state(); 3904902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3914902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3924902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3934902524cSMatthias Ringwald 3944902524cSMatthias Ringwald reset_query_state(); 3954902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 3964902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3974902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3984902524cSMatthias Ringwald verify_charasteristics(); 3994902524cSMatthias Ringwald } 4004902524cSMatthias Ringwald 4014902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){ 4024902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID16; 4034902524cSMatthias Ringwald reset_query_state(); 4044902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 4054902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4064902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4074902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4084902524cSMatthias Ringwald } 4094902524cSMatthias Ringwald 4104902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){ 4114902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID128; 4124902524cSMatthias Ringwald reset_query_state(); 4134902524cSMatthias 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]); 4144902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4154902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4164902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4174902524cSMatthias Ringwald } 4184902524cSMatthias Ringwald 4194902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){ 4204902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4214902524cSMatthias Ringwald reset_query_state(); 4224902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 4234902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4244902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4254902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4264902524cSMatthias Ringwald 4274902524cSMatthias Ringwald reset_query_state(); 4284902524cSMatthias Ringwald uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 4294902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 4304902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4314902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4324902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4334902524cSMatthias Ringwald 4344902524cSMatthias Ringwald reset_query_state(); 4354902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 4364902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4374902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4384902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4394902524cSMatthias Ringwald } 4404902524cSMatthias Ringwald 4414902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){ 4424902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4434902524cSMatthias Ringwald reset_query_state(); 4444902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4454902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4464902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4474902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4484902524cSMatthias Ringwald 4494902524cSMatthias Ringwald reset_query_state(); 4504902524cSMatthias Ringwald uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 4514902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 4524902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4534902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4544902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4554902524cSMatthias Ringwald 4564902524cSMatthias Ringwald reset_query_state(); 4574902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 4584902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4594902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4604902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4614902524cSMatthias Ringwald } 4624902524cSMatthias Ringwald 4634902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){ 4644902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTIC_DESCRIPTORS; 465*8404d3b7SMilanka Ringwald 466*8404d3b7SMilanka Ringwald reset_query_state(); 467*8404d3b7SMilanka Ringwald // invalid con handle 468*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16); 469*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 470*8404d3b7SMilanka Ringwald 471*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 472*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 473*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 474*8404d3b7SMilanka Ringwald 4754902524cSMatthias Ringwald reset_query_state(); 4764902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4774902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4784902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4794902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4804902524cSMatthias Ringwald 4814902524cSMatthias Ringwald reset_query_state(); 4824902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 4834902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4844902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4854902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4864902524cSMatthias Ringwald 4874902524cSMatthias Ringwald reset_query_state(); 4884902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 4894902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4904902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4914902524cSMatthias Ringwald CHECK(result_counter); 4924902524cSMatthias Ringwald CHECK_EQUAL(3, result_index); 4934902524cSMatthias Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 4944902524cSMatthias Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 4954902524cSMatthias Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 4964902524cSMatthias Ringwald } 4974902524cSMatthias Ringwald 4984902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){ 4994902524cSMatthias Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 5004902524cSMatthias Ringwald reset_query_state(); 5014902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5024902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5034902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5044902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5054902524cSMatthias Ringwald 5064902524cSMatthias Ringwald reset_query_state(); 5074902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5084902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5094902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5104902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5114902524cSMatthias Ringwald 512*8404d3b7SMilanka Ringwald // invalid con handle 513*8404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 514*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 515*8404d3b7SMilanka Ringwald 516*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 517*8404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 518*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 519*8404d3b7SMilanka Ringwald 5204902524cSMatthias Ringwald reset_query_state(); 5214902524cSMatthias Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5224902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5234902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5244902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 525*8404d3b7SMilanka Ringwald 526*8404d3b7SMilanka Ringwald reset_query_state(); 527*8404d3b7SMilanka Ringwald characteristics->properties = 0; 528*8404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 529*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status); 530*8404d3b7SMilanka Ringwald 531*8404d3b7SMilanka Ringwald reset_query_state(); 532*8404d3b7SMilanka Ringwald characteristics->properties = 0; 533*8404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); 534*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status); 5354902524cSMatthias Ringwald } 5364902524cSMatthias Ringwald 5374902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){ 5384902524cSMatthias Ringwald test = READ_CHARACTERISTIC_DESCRIPTOR; 5394902524cSMatthias Ringwald reset_query_state(); 5404902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5414902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5424902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5434902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5444902524cSMatthias Ringwald 5454902524cSMatthias Ringwald reset_query_state(); 5464902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5474902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5484902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5494902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5504902524cSMatthias Ringwald 5514902524cSMatthias Ringwald reset_query_state(); 5524902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 5534902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5544902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5554902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 5564902524cSMatthias Ringwald 5574902524cSMatthias Ringwald reset_query_state(); 5584902524cSMatthias Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 5594902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5604902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5614902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 562*8404d3b7SMilanka Ringwald 563*8404d3b7SMilanka Ringwald // invalid con handle 564*8404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]); 565*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 566*8404d3b7SMilanka Ringwald 567*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 568*8404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 569*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5704902524cSMatthias Ringwald } 5714902524cSMatthias Ringwald 5724902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){ 5734902524cSMatthias Ringwald test = READ_CHARACTERISTIC_VALUE; 5744902524cSMatthias Ringwald reset_query_state(); 5754902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5764902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5774902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5784902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5794902524cSMatthias Ringwald 5804902524cSMatthias Ringwald reset_query_state(); 5814902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5824902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5834902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5844902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5854902524cSMatthias Ringwald 5864902524cSMatthias Ringwald reset_query_state(); 5874902524cSMatthias Ringwald status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 5884902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5894902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5904902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 5914902524cSMatthias Ringwald } 5924902524cSMatthias Ringwald 5934902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){ 5944902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_VALUE; 5954902524cSMatthias Ringwald reset_query_state(); 5964902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5974902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5984902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5994902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6004902524cSMatthias Ringwald 6014902524cSMatthias Ringwald reset_query_state(); 6024902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 6034902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6044902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6054902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6064902524cSMatthias Ringwald 607*8404d3b7SMilanka Ringwald // invalid con handle 608*8404d3b7SMilanka 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); 609*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 610*8404d3b7SMilanka Ringwald 611*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 612*8404d3b7SMilanka 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); 613*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 614*8404d3b7SMilanka Ringwald 615*8404d3b7SMilanka Ringwald 6164902524cSMatthias Ringwald reset_query_state(); 6174902524cSMatthias 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); 6184902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6194902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6204902524cSMatthias Ringwald } 6214902524cSMatthias Ringwald 6224902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){ 6234902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_DESCRIPTOR; 6244902524cSMatthias Ringwald reset_query_state(); 6254902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 6264902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6274902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6284902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6294902524cSMatthias Ringwald 6304902524cSMatthias Ringwald reset_query_state(); 6314902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 6324902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6334902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6344902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6354902524cSMatthias Ringwald 6364902524cSMatthias Ringwald reset_query_state(); 6374902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 6384902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6394902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6404902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6414902524cSMatthias Ringwald 6424902524cSMatthias Ringwald reset_query_state(); 6434902524cSMatthias Ringwald status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication); 6444902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6454902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6464902524cSMatthias Ringwald } 6474902524cSMatthias Ringwald 6484902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){ 6494902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_VALUE; 6504902524cSMatthias Ringwald reset_query_state(); 6514902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 6524902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6534902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6544902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6554902524cSMatthias Ringwald 6564902524cSMatthias Ringwald reset_query_state(); 6574902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 6584902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6594902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6604902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6614902524cSMatthias Ringwald 6624902524cSMatthias Ringwald reset_query_state(); 6634902524cSMatthias Ringwald status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 6644902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6654902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 666*8404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 6674902524cSMatthias Ringwald } 6684902524cSMatthias Ringwald 6694902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){ 6704902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_DESCRIPTOR; 6714902524cSMatthias Ringwald reset_query_state(); 6724902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 6734902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6744902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6754902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6764902524cSMatthias Ringwald 6774902524cSMatthias Ringwald reset_query_state(); 6784902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 6794902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6804902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6814902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6824902524cSMatthias Ringwald 6834902524cSMatthias Ringwald reset_query_state(); 6844902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 6854902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6864902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6874902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6884902524cSMatthias Ringwald 6894902524cSMatthias Ringwald reset_query_state(); 6904902524cSMatthias Ringwald result_counter = 0; 6914902524cSMatthias Ringwald status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6924902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6934902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 694*8404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 6954902524cSMatthias Ringwald } 6964902524cSMatthias Ringwald 6974902524cSMatthias Ringwald 6984902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){ 6994902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR; 7004902524cSMatthias Ringwald reset_query_state(); 7014902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 7024902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7034902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7044902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7054902524cSMatthias Ringwald 7064902524cSMatthias Ringwald reset_query_state(); 7074902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 7084902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7094902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7104902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7114902524cSMatthias Ringwald 7124902524cSMatthias Ringwald reset_query_state(); 7134902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 7144902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7154902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7164902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 7174902524cSMatthias Ringwald 7184902524cSMatthias Ringwald result_counter = 0; 7194902524cSMatthias Ringwald status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value); 7204902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7214902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7224902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7234902524cSMatthias Ringwald } 7244902524cSMatthias Ringwald 7254902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){ 7264902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_VALUE; 7274902524cSMatthias Ringwald reset_query_state(); 7284902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 7294902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7304902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7314902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7324902524cSMatthias Ringwald 7334902524cSMatthias Ringwald reset_query_state(); 7344902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 7354902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7364902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7374902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7384902524cSMatthias Ringwald 7394902524cSMatthias Ringwald 7404902524cSMatthias Ringwald reset_query_state(); 7414902524cSMatthias 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); 7424902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7434902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7444902524cSMatthias Ringwald } 7454902524cSMatthias Ringwald 7464902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){ 7474902524cSMatthias Ringwald test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE; 7484902524cSMatthias Ringwald reset_query_state(); 7494902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 7504902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7514902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7524902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7534902524cSMatthias Ringwald 7544902524cSMatthias Ringwald reset_query_state(); 7554902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 7564902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7574902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7584902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 7594902524cSMatthias Ringwald 760*8404d3b7SMilanka Ringwald // invalid con handle 761*8404d3b7SMilanka 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); 762*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 763*8404d3b7SMilanka Ringwald 764*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 765*8404d3b7SMilanka 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); 766*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 767*8404d3b7SMilanka Ringwald 7684902524cSMatthias Ringwald reset_query_state(); 7694902524cSMatthias 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); 7704902524cSMatthias Ringwald CHECK_EQUAL(0, status); 7714902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 7724902524cSMatthias Ringwald } 7734902524cSMatthias Ringwald 774*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){ 775*8404d3b7SMilanka Ringwald reset_query_state(); 776*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 777*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 778*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 779*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 780*8404d3b7SMilanka Ringwald 781*8404d3b7SMilanka Ringwald reset_query_state(); 782*8404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 783*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 784*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 785*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 786*8404d3b7SMilanka Ringwald 787*8404d3b7SMilanka Ringwald reset_query_state(); 788*8404d3b7SMilanka 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); 789*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 790*8404d3b7SMilanka Ringwald 791*8404d3b7SMilanka Ringwald reset_query_state(); 792*8404d3b7SMilanka Ringwald // invalid con handle 793*8404d3b7SMilanka 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); 794*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 795*8404d3b7SMilanka Ringwald 796*8404d3b7SMilanka Ringwald reset_query_state(); 797*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 798*8404d3b7SMilanka 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); 799*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 800*8404d3b7SMilanka Ringwald } 801*8404d3b7SMilanka Ringwald 802*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){ 803*8404d3b7SMilanka Ringwald reset_query_state(); 804*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 805*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 806*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 807*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 808*8404d3b7SMilanka Ringwald 809*8404d3b7SMilanka Ringwald reset_query_state(); 810*8404d3b7SMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 811*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 812*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 813*8404d3b7SMilanka Ringwald CHECK(result_counter); 814*8404d3b7SMilanka Ringwald CHECK_EQUAL(3, result_index); 815*8404d3b7SMilanka Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 816*8404d3b7SMilanka Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 817*8404d3b7SMilanka Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 818*8404d3b7SMilanka Ringwald 819*8404d3b7SMilanka Ringwald reset_query_state(); 820*8404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 821*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 822*8404d3b7SMilanka Ringwald 823*8404d3b7SMilanka Ringwald reset_query_state(); 824*8404d3b7SMilanka Ringwald // invalid con handle 825*8404d3b7SMilanka 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); 826*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 827*8404d3b7SMilanka Ringwald 828*8404d3b7SMilanka Ringwald reset_query_state(); 829*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 830*8404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 831*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 832*8404d3b7SMilanka Ringwald } 833*8404d3b7SMilanka Ringwald 834*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){ 835*8404d3b7SMilanka Ringwald reset_query_state(); 836*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 837*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 838*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 839*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 840*8404d3b7SMilanka Ringwald 841*8404d3b7SMilanka Ringwald reset_query_state(); 842*8404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 843*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 844*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 845*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 846*8404d3b7SMilanka Ringwald 847*8404d3b7SMilanka Ringwald uint16_t value_handles[] = {characteristics[0].value_handle}; 848*8404d3b7SMilanka Ringwald 849*8404d3b7SMilanka Ringwald reset_query_state(); 850*8404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 851*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 852*8404d3b7SMilanka Ringwald 853*8404d3b7SMilanka Ringwald reset_query_state(); 854*8404d3b7SMilanka Ringwald // invalid con handle 855*8404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles); 856*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 857*8404d3b7SMilanka Ringwald 858*8404d3b7SMilanka Ringwald reset_query_state(); 859*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 860*8404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 861*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 862*8404d3b7SMilanka Ringwald } 863*8404d3b7SMilanka Ringwald 864*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){ 865*8404d3b7SMilanka Ringwald reset_query_state(); 866*8404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 867*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 868*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 869*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 870*8404d3b7SMilanka Ringwald 871*8404d3b7SMilanka Ringwald reset_query_state(); 872*8404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 873*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 874*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 875*8404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 876*8404d3b7SMilanka Ringwald 877*8404d3b7SMilanka Ringwald uint16_t value_handles[] = {characteristics[0].value_handle}; 878*8404d3b7SMilanka Ringwald 879*8404d3b7SMilanka Ringwald reset_query_state(); 880*8404d3b7SMilanka Ringwald // invalid con handle 881*8404d3b7SMilanka 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); 882*8404d3b7SMilanka Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status); 883*8404d3b7SMilanka Ringwald 884*8404d3b7SMilanka Ringwald reset_query_state(); 885*8404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 886*8404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 887*8404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status); 888*8404d3b7SMilanka Ringwald 889*8404d3b7SMilanka Ringwald reset_query_state(); 890*8404d3b7SMilanka Ringwald 891*8404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value); 892*8404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 893*8404d3b7SMilanka Ringwald 894*8404d3b7SMilanka Ringwald } 8954902524cSMatthias Ringwald 8964902524cSMatthias Ringwald int main (int argc, const char * argv[]){ 8974902524cSMatthias Ringwald att_set_db(profile_data); 8984902524cSMatthias Ringwald att_set_write_callback(&att_write_callback); 8994902524cSMatthias Ringwald att_set_read_callback(&att_read_callback); 9004902524cSMatthias Ringwald 9014902524cSMatthias Ringwald gatt_client_init(); 9024902524cSMatthias Ringwald 9034902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 9044902524cSMatthias Ringwald } 905