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, 56*369697acSMilanka Ringwald WRITE_NONEXISTING_CLIENT_CHARACTERISTIC_CONFIGURATION, 574902524cSMatthias Ringwald READ_LONG_CHARACTERISTIC_DESCRIPTOR, 584902524cSMatthias Ringwald WRITE_LONG_CHARACTERISTIC_DESCRIPTOR, 594902524cSMatthias Ringwald WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE, 604902524cSMatthias Ringwald WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE 614902524cSMatthias Ringwald } current_test_t; 624902524cSMatthias Ringwald 634902524cSMatthias Ringwald current_test_t test = IDLE; 644902524cSMatthias Ringwald 654902524cSMatthias Ringwald uint8_t characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb}; 664902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000; 674902524cSMatthias Ringwald 684902524cSMatthias Ringwald static int result_index; 694902524cSMatthias Ringwald static uint8_t result_counter; 704902524cSMatthias Ringwald 714902524cSMatthias Ringwald static gatt_client_service_t services[50]; 724902524cSMatthias Ringwald static gatt_client_service_t included_services[50]; 734902524cSMatthias Ringwald 744902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50]; 754902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50]; 764902524cSMatthias Ringwald 774902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void); 784902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void); 794902524cSMatthias Ringwald 804902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ 814902524cSMatthias Ringwald for (int i=0; i<size; i++){ 824902524cSMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]); 834902524cSMatthias Ringwald } 844902524cSMatthias Ringwald } 854902524cSMatthias Ringwald 864902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) { 874902524cSMatthias Ringwald printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 884902524cSMatthias Ringwald uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], 894902524cSMatthias Ringwald uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); 904902524cSMatthias Ringwald } 914902524cSMatthias Ringwald 924902524cSMatthias Ringwald //static int counter = 0; 934902524cSMatthias 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){ 944902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16); 954902524cSMatthias Ringwald if (!exp_handles) return; 964902524cSMatthias Ringwald CHECK_EQUAL(exp_handles[0], start_handle); 974902524cSMatthias Ringwald CHECK_EQUAL(exp_handles[1], end_handle); 984902524cSMatthias Ringwald } 994902524cSMatthias Ringwald 1004902524cSMatthias Ringwald // ----------------------------------------------------- 1014902524cSMatthias Ringwald 1024902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){ 1034902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1044902524cSMatthias 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); 1054902524cSMatthias Ringwald } 1064902524cSMatthias Ringwald 1074902524cSMatthias Ringwald 1084902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){ 1094902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1104902524cSMatthias 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); 1114902524cSMatthias Ringwald } 1124902524cSMatthias Ringwald 1134902524cSMatthias Ringwald static void verify_primary_services(void){ 1144902524cSMatthias Ringwald CHECK_EQUAL(6, result_index); 1154902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1164902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle); 1174902524cSMatthias Ringwald } 1184902524cSMatthias Ringwald } 1194902524cSMatthias Ringwald 1204902524cSMatthias Ringwald static void verify_included_services_uuid16(void){ 1214902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1224902524cSMatthias 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); 1234902524cSMatthias Ringwald } 1244902524cSMatthias Ringwald 1254902524cSMatthias Ringwald static void verify_included_services_uuid128(void){ 1264902524cSMatthias Ringwald CHECK_EQUAL(2, result_index); 1274902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1284902524cSMatthias 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); 1294902524cSMatthias Ringwald } 1304902524cSMatthias Ringwald } 1314902524cSMatthias Ringwald 1324902524cSMatthias Ringwald static void verify_charasteristics(void){ 1334902524cSMatthias Ringwald CHECK_EQUAL(15, result_index); 1344902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1354902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle); 1364902524cSMatthias Ringwald } 1374902524cSMatthias Ringwald } 1384902524cSMatthias Ringwald 1394902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){ 1404902524cSMatthias Ringwald uint8_t * expected_value = (uint8_t*)&long_value[value_offset]; 1414902524cSMatthias Ringwald CHECK(value_length); 1424902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(expected_value, value, value_length); 1434902524cSMatthias Ringwald if (value_offset + value_length != sizeof(long_value)) return; 1444902524cSMatthias Ringwald result_counter++; 1454902524cSMatthias Ringwald } 1464902524cSMatthias Ringwald 1474902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 1484902524cSMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return; 1494902524cSMatthias Ringwald uint8_t status; 1504902524cSMatthias Ringwald gatt_client_service_t service; 1514902524cSMatthias Ringwald gatt_client_characteristic_t characteristic; 1524902524cSMatthias Ringwald gatt_client_characteristic_descriptor_t descriptor; 1534902524cSMatthias Ringwald switch (packet[0]){ 1544902524cSMatthias Ringwald case GATT_EVENT_QUERY_COMPLETE: 1554902524cSMatthias Ringwald status = packet[4]; 1564902524cSMatthias Ringwald gatt_query_complete = 1; 1574902524cSMatthias Ringwald if (status){ 1584902524cSMatthias Ringwald gatt_query_complete = 0; 1594902524cSMatthias Ringwald printf("GATT_EVENT_QUERY_COMPLETE failed with status 0x%02X\n", status); 1604902524cSMatthias Ringwald } 1614902524cSMatthias Ringwald break; 1624902524cSMatthias Ringwald case GATT_EVENT_SERVICE_QUERY_RESULT: 1634902524cSMatthias Ringwald service.start_group_handle = little_endian_read_16(packet, 4); 1644902524cSMatthias Ringwald service.end_group_handle = little_endian_read_16(packet, 6); 1654902524cSMatthias Ringwald service.uuid16 = 0; 1664902524cSMatthias Ringwald reverse_128(&packet[8], service.uuid128); 1674902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(service.uuid128)){ 1684902524cSMatthias Ringwald service.uuid16 = big_endian_read_32(service.uuid128, 0); 1694902524cSMatthias Ringwald } 1704902524cSMatthias Ringwald services[result_index++] = service; 1714902524cSMatthias Ringwald result_counter++; 1724902524cSMatthias Ringwald break; 1734902524cSMatthias Ringwald case GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT: 1744902524cSMatthias Ringwald service.start_group_handle = little_endian_read_16(packet, 6); 1754902524cSMatthias Ringwald service.end_group_handle = little_endian_read_16(packet, 8); 1764902524cSMatthias Ringwald service.uuid16 = 0; 1774902524cSMatthias Ringwald reverse_128(&packet[10], service.uuid128); 1784902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(service.uuid128)){ 1794902524cSMatthias Ringwald service.uuid16 = big_endian_read_32(service.uuid128, 0); 1804902524cSMatthias Ringwald } 1814902524cSMatthias Ringwald included_services[result_index++] = service; 1824902524cSMatthias Ringwald result_counter++; 1834902524cSMatthias Ringwald break; 1844902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT: 1854902524cSMatthias Ringwald characteristic.start_handle = little_endian_read_16(packet, 4); 1864902524cSMatthias Ringwald characteristic.value_handle = little_endian_read_16(packet, 6); 1874902524cSMatthias Ringwald characteristic.end_handle = little_endian_read_16(packet, 8); 1884902524cSMatthias Ringwald characteristic.properties = little_endian_read_16(packet, 10); 1894902524cSMatthias Ringwald characteristic.uuid16 = 0; 1904902524cSMatthias Ringwald reverse_128(&packet[12], characteristic.uuid128); 1914902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(characteristic.uuid128)){ 1924902524cSMatthias Ringwald characteristic.uuid16 = big_endian_read_32(characteristic.uuid128, 0); 1934902524cSMatthias Ringwald } 1944902524cSMatthias Ringwald characteristics[result_index++] = characteristic; 1954902524cSMatthias Ringwald result_counter++; 1964902524cSMatthias Ringwald break; 1974902524cSMatthias Ringwald case GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT: 1984902524cSMatthias Ringwald descriptor.handle = little_endian_read_16(packet, 4); 1994902524cSMatthias Ringwald reverse_128(&packet[6], descriptor.uuid128); 2004902524cSMatthias Ringwald if (uuid_has_bluetooth_prefix(descriptor.uuid128)){ 2014902524cSMatthias Ringwald descriptor.uuid16 = big_endian_read_32(descriptor.uuid128, 0); 2024902524cSMatthias Ringwald } 2034902524cSMatthias Ringwald descriptors[result_index++] = descriptor; 2044902524cSMatthias Ringwald result_counter++; 2054902524cSMatthias Ringwald break; 2064902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT: 2074902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT: 2084902524cSMatthias Ringwald CHECK_EQUAL(short_value_length, little_endian_read_16(packet, 6)); 2094902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t*)short_value, &packet[8], short_value_length); 2104902524cSMatthias Ringwald result_counter++; 2114902524cSMatthias Ringwald break; 2124902524cSMatthias Ringwald case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT: 2134902524cSMatthias Ringwald case GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT: 2144902524cSMatthias Ringwald verify_blob(little_endian_read_16(packet, 8), little_endian_read_16(packet, 6), &packet[10]); 2154902524cSMatthias Ringwald result_counter++; 2164902524cSMatthias Ringwald break; 2174902524cSMatthias Ringwald } 2184902524cSMatthias Ringwald } 2194902524cSMatthias Ringwald 2204902524cSMatthias 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){ 2214902524cSMatthias Ringwald switch(test){ 2224902524cSMatthias Ringwald case WRITE_CHARACTERISTIC_DESCRIPTOR: 2234902524cSMatthias Ringwald case WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION: 2244902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode); 2254902524cSMatthias Ringwald CHECK_EQUAL(0, offset); 2264902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(indication, buffer, 2); 2274902524cSMatthias Ringwald result_counter++; 2284902524cSMatthias Ringwald break; 2294902524cSMatthias Ringwald case WRITE_CHARACTERISTIC_VALUE: 2304902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode); 2314902524cSMatthias Ringwald CHECK_EQUAL(0, offset); 2324902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t *)short_value, buffer, short_value_length); 2334902524cSMatthias Ringwald result_counter++; 2344902524cSMatthias Ringwald break; 2354902524cSMatthias Ringwald case WRITE_LONG_CHARACTERISTIC_DESCRIPTOR: 2364902524cSMatthias Ringwald case WRITE_LONG_CHARACTERISTIC_VALUE: 2374902524cSMatthias Ringwald case WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE: 2384902524cSMatthias Ringwald if (transaction_mode == ATT_TRANSACTION_MODE_VALIDATE) break; 2394902524cSMatthias Ringwald if (transaction_mode == ATT_TRANSACTION_MODE_EXECUTE) break; 2404902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_ACTIVE, transaction_mode); 2414902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t *)&long_value[offset], buffer, buffer_size); 2424902524cSMatthias Ringwald if (offset + buffer_size != sizeof(long_value)) break; 2434902524cSMatthias Ringwald result_counter++; 2444902524cSMatthias Ringwald break; 2454902524cSMatthias Ringwald default: 2464902524cSMatthias Ringwald break; 2474902524cSMatthias Ringwald } 2484902524cSMatthias Ringwald return 0; 2494902524cSMatthias Ringwald } 2504902524cSMatthias Ringwald 2514902524cSMatthias Ringwald int copy_bytes(uint8_t * value, uint16_t value_length, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ 2524902524cSMatthias Ringwald int blob_length = value_length - offset; 2534902524cSMatthias Ringwald if (blob_length >= buffer_size) blob_length = buffer_size; 2544902524cSMatthias Ringwald 2554902524cSMatthias Ringwald memcpy(buffer, &value[offset], blob_length); 2564902524cSMatthias Ringwald return blob_length; 2574902524cSMatthias Ringwald } 2584902524cSMatthias Ringwald 2594902524cSMatthias 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){ 2604902524cSMatthias 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); 2614902524cSMatthias Ringwald switch(test){ 2624902524cSMatthias Ringwald case READ_CHARACTERISTIC_DESCRIPTOR: 2634902524cSMatthias Ringwald case READ_CHARACTERISTIC_VALUE: 2644902524cSMatthias Ringwald result_counter++; 2654902524cSMatthias Ringwald if (buffer){ 2664902524cSMatthias Ringwald return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size); 2674902524cSMatthias Ringwald } 2684902524cSMatthias Ringwald return short_value_length; 2694902524cSMatthias Ringwald case READ_LONG_CHARACTERISTIC_DESCRIPTOR: 2704902524cSMatthias Ringwald case READ_LONG_CHARACTERISTIC_VALUE: 2714902524cSMatthias Ringwald result_counter++; 2724902524cSMatthias Ringwald if (buffer) { 2734902524cSMatthias Ringwald return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size); 2744902524cSMatthias Ringwald } 2754902524cSMatthias Ringwald return long_value_length; 2764902524cSMatthias Ringwald default: 2774902524cSMatthias Ringwald break; 2784902524cSMatthias Ringwald } 2794902524cSMatthias Ringwald return 0; 2804902524cSMatthias Ringwald } 2814902524cSMatthias Ringwald 2824902524cSMatthias Ringwald // static const char * decode_status(uint8_t status){ 2834902524cSMatthias Ringwald // switch (status){ 2844902524cSMatthias Ringwald // case 0: return "0"; 2854902524cSMatthias Ringwald // case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE"; 2864902524cSMatthias Ringwald // case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS"; 2874902524cSMatthias Ringwald // case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED"; 2884902524cSMatthias Ringwald // case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG"; 2894902524cSMatthias Ringwald // case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY"; 2904902524cSMatthias Ringwald // case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED"; 2914902524cSMatthias Ringwald // case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED"; 2924902524cSMatthias Ringwald // } 2934902524cSMatthias Ringwald // } 2944902524cSMatthias Ringwald 2954902524cSMatthias Ringwald TEST_GROUP(GATTClient){ 2964902524cSMatthias Ringwald int acl_buffer_size; 2974902524cSMatthias Ringwald uint8_t acl_buffer[27]; 2984902524cSMatthias Ringwald uint8_t status; 2994902524cSMatthias Ringwald 3004902524cSMatthias Ringwald void setup(void){ 3014902524cSMatthias Ringwald result_counter = 0; 3024902524cSMatthias Ringwald result_index = 0; 3034902524cSMatthias Ringwald test = IDLE; 3048404d3b7SMilanka Ringwald hci_setup_le_connection(gatt_client_handle); 3054902524cSMatthias Ringwald } 3064902524cSMatthias Ringwald 30740faeb84SMilanka Ringwald gatt_client_t * get_gatt_client(hci_con_handle_t con_handle){ 30840faeb84SMilanka Ringwald gatt_client_t * gatt_client; 30940faeb84SMilanka Ringwald (void) gatt_client_get_client(gatt_client_handle, &gatt_client); 31040faeb84SMilanka Ringwald return gatt_client; 31140faeb84SMilanka Ringwald } 31240faeb84SMilanka Ringwald 3134902524cSMatthias Ringwald void reset_query_state(void){ 31440faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 315ad3bb416SMatthias Ringwald gatt_client->state = P_READY; 31640faeb84SMilanka Ringwald 317a382a4adSMilanka Ringwald gatt_client_set_required_security_level(LEVEL_0); 318a382a4adSMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(1); 3198404d3b7SMilanka Ringwald 3204902524cSMatthias Ringwald gatt_query_complete = 0; 3214902524cSMatthias Ringwald result_counter = 0; 3224902524cSMatthias Ringwald result_index = 0; 3234902524cSMatthias Ringwald } 3248404d3b7SMilanka Ringwald 3258404d3b7SMilanka Ringwald void set_wrong_gatt_client_state(void){ 32640faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 3278404d3b7SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 328ad3bb416SMatthias Ringwald gatt_client->state = P_W2_SEND_SERVICE_QUERY; 3298404d3b7SMilanka Ringwald } 3304902524cSMatthias Ringwald }; 3314902524cSMatthias Ringwald 332a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_setters){ 333a382a4adSMilanka Ringwald gatt_client_set_required_security_level(LEVEL_4); 334a382a4adSMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(0); 335a382a4adSMilanka Ringwald } 3364902524cSMatthias Ringwald 337617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_is_ready_mtu_exchange_disabled){ 338617a2595SMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(0); 339617a2595SMilanka Ringwald int status = gatt_client_is_ready(gatt_client_handle); 340617a2595SMilanka Ringwald CHECK_EQUAL(1, status); 341617a2595SMilanka Ringwald } 342617a2595SMilanka Ringwald 3434902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){ 3444902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICES; 3458404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 34640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 3478404d3b7SMilanka Ringwald 3488404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 3498404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3508404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 3518404d3b7SMilanka Ringwald 3524902524cSMatthias Ringwald reset_query_state(); 3534902524cSMatthias Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3544902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3554902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3564902524cSMatthias Ringwald verify_primary_services(); 3574902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3584902524cSMatthias Ringwald } 3594902524cSMatthias Ringwald 3604902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){ 3614902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16; 3624902524cSMatthias Ringwald reset_query_state(); 3634902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3644902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3654902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3664902524cSMatthias Ringwald verify_primary_services_with_uuid16(); 3674902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3684902524cSMatthias Ringwald } 3694902524cSMatthias Ringwald 3704902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){ 3714902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128; 3724902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3734902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3744902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3754902524cSMatthias Ringwald verify_primary_services_with_uuid128(); 3764902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 377a382a4adSMilanka Ringwald 378a382a4adSMilanka Ringwald // invalid con handle 379a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, primary_service_uuid128); 38040faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 381a382a4adSMilanka Ringwald 382a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 383a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 384a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 3854902524cSMatthias Ringwald } 3864902524cSMatthias Ringwald 3874902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){ 3884902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_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_find_included_services_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_included_services_uuid16(); 3994902524cSMatthias Ringwald } 4004902524cSMatthias Ringwald 4014902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){ 4024902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128; 4034902524cSMatthias Ringwald reset_query_state(); 4044902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 4054902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4064902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4074902524cSMatthias Ringwald 4084902524cSMatthias Ringwald reset_query_state(); 4094902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 4104902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4114902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4124902524cSMatthias Ringwald verify_included_services_uuid128(); 413a382a4adSMilanka Ringwald 414a382a4adSMilanka Ringwald // invalid con handle 415a382a4adSMilanka Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); 41640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 417a382a4adSMilanka Ringwald 418a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 419a382a4adSMilanka Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 420a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4214902524cSMatthias Ringwald } 4224902524cSMatthias Ringwald 4234902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){ 4244902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16; 4254902524cSMatthias Ringwald reset_query_state(); 4264902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4274902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4284902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4294902524cSMatthias Ringwald 4304902524cSMatthias Ringwald reset_query_state(); 4314902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 4324902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4334902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4344902524cSMatthias Ringwald verify_charasteristics(); 435a382a4adSMilanka Ringwald 436a382a4adSMilanka Ringwald // invalid con handle 437a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); 43840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 439a382a4adSMilanka Ringwald 440a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 441a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 442a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4434902524cSMatthias Ringwald } 4444902524cSMatthias Ringwald 4454902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){ 4464902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID16; 4474902524cSMatthias Ringwald reset_query_state(); 4484902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 4494902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4504902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4514902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 452a382a4adSMilanka Ringwald 453a382a4adSMilanka Ringwald // invalid con handle 454a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 0x30, 0x32, 0xF102); 45540faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 456a382a4adSMilanka Ringwald 457a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 458a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 459a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4604902524cSMatthias Ringwald } 4614902524cSMatthias Ringwald 4624902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){ 4634902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID128; 4644902524cSMatthias Ringwald reset_query_state(); 4654902524cSMatthias 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]); 4664902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4674902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4684902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 469a382a4adSMilanka Ringwald 470a382a4adSMilanka Ringwald // invalid con handle 471a382a4adSMilanka 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]); 47240faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 473a382a4adSMilanka Ringwald 474a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 475a382a4adSMilanka 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]); 476a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4774902524cSMatthias Ringwald } 4784902524cSMatthias Ringwald 4794902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){ 4804902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4814902524cSMatthias Ringwald reset_query_state(); 4824902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 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 uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 4894902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 4904902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4914902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4924902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4934902524cSMatthias Ringwald 4944902524cSMatthias Ringwald reset_query_state(); 4954902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 4964902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4974902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4984902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4994902524cSMatthias Ringwald } 5004902524cSMatthias Ringwald 5014902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){ 5024902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 5034902524cSMatthias Ringwald reset_query_state(); 5044902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5054902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5064902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5074902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5084902524cSMatthias Ringwald 5094902524cSMatthias Ringwald reset_query_state(); 5104902524cSMatthias Ringwald uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 5114902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 5124902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5134902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5144902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5154902524cSMatthias Ringwald 5164902524cSMatthias Ringwald reset_query_state(); 5174902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5184902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5194902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5204902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5214902524cSMatthias Ringwald } 5224902524cSMatthias Ringwald 5234902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){ 5244902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTIC_DESCRIPTORS; 5258404d3b7SMilanka Ringwald 5268404d3b7SMilanka Ringwald reset_query_state(); 5278404d3b7SMilanka Ringwald // invalid con handle 5288404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16); 52940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 5308404d3b7SMilanka Ringwald 5318404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 5328404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5338404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5348404d3b7SMilanka Ringwald 5354902524cSMatthias Ringwald reset_query_state(); 5364902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5374902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5384902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5394902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5404902524cSMatthias Ringwald 5414902524cSMatthias Ringwald reset_query_state(); 5424902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5434902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5444902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5454902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5464902524cSMatthias Ringwald 5474902524cSMatthias Ringwald reset_query_state(); 5484902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 5494902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5504902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5514902524cSMatthias Ringwald CHECK(result_counter); 5524902524cSMatthias Ringwald CHECK_EQUAL(3, result_index); 5534902524cSMatthias Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 5544902524cSMatthias Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 5554902524cSMatthias Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 5564902524cSMatthias Ringwald } 5574902524cSMatthias Ringwald 5584902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){ 5594902524cSMatthias Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 5604902524cSMatthias Ringwald reset_query_state(); 5614902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5624902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5634902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5644902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5654902524cSMatthias Ringwald 5664902524cSMatthias Ringwald reset_query_state(); 5674902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5684902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5694902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5704902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5714902524cSMatthias Ringwald 5728404d3b7SMilanka Ringwald // invalid con handle 5738404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 57440faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 5758404d3b7SMilanka Ringwald 5768404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 5778404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5788404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5798404d3b7SMilanka Ringwald 5804902524cSMatthias Ringwald reset_query_state(); 5814902524cSMatthias Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5824902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5834902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5844902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5858404d3b7SMilanka Ringwald 5868404d3b7SMilanka Ringwald reset_query_state(); 5878404d3b7SMilanka Ringwald characteristics->properties = 0; 5888404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5898404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status); 5908404d3b7SMilanka Ringwald 5918404d3b7SMilanka Ringwald reset_query_state(); 5928404d3b7SMilanka Ringwald characteristics->properties = 0; 5938404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); 5948404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status); 595*369697acSMilanka Ringwald 596*369697acSMilanka Ringwald reset_query_state(); 597*369697acSMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], 10); 598*369697acSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE, status); 599*369697acSMilanka Ringwald } 600*369697acSMilanka Ringwald 601*369697acSMilanka Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfigurationNone){ 602*369697acSMilanka Ringwald reset_query_state(); 603*369697acSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 604*369697acSMilanka Ringwald CHECK_EQUAL(0, status); 605*369697acSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 606*369697acSMilanka Ringwald CHECK_EQUAL(1, result_counter); 607*369697acSMilanka Ringwald 608*369697acSMilanka Ringwald reset_query_state(); 609*369697acSMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE); 610*369697acSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 611*369697acSMilanka Ringwald } 612*369697acSMilanka Ringwald 613*369697acSMilanka Ringwald TEST(GATTClient, TestWriteNonexistingClientCharacteristicConfiguration){ 614*369697acSMilanka Ringwald test = WRITE_NONEXISTING_CLIENT_CHARACTERISTIC_CONFIGURATION; 615*369697acSMilanka Ringwald reset_query_state(); 616*369697acSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 617*369697acSMilanka Ringwald CHECK_EQUAL(0, status); 618*369697acSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 619*369697acSMilanka Ringwald CHECK_EQUAL(1, result_counter); 620*369697acSMilanka Ringwald 621*369697acSMilanka Ringwald reset_query_state(); 622*369697acSMilanka Ringwald characteristics->properties = ATT_PROPERTY_INDICATE; 623*369697acSMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); 624*369697acSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 6254902524cSMatthias Ringwald } 6264902524cSMatthias Ringwald 6274902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){ 6284902524cSMatthias Ringwald test = READ_CHARACTERISTIC_DESCRIPTOR; 6294902524cSMatthias Ringwald reset_query_state(); 6304902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 6314902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6324902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6334902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6344902524cSMatthias Ringwald 6354902524cSMatthias Ringwald reset_query_state(); 6364902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 6374902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6384902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6394902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6404902524cSMatthias Ringwald 6414902524cSMatthias Ringwald reset_query_state(); 6424902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 6434902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6444902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6454902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6464902524cSMatthias Ringwald 647a382a4adSMilanka Ringwald // invalid con handle 648a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0]); 64940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 650a382a4adSMilanka Ringwald 651a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 652a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 653a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 654a382a4adSMilanka Ringwald 655a382a4adSMilanka Ringwald reset_query_state(); 656a382a4adSMilanka Ringwald uint16_t end_handle = characteristics[0].end_handle; 657a382a4adSMilanka Ringwald characteristics[0].end_handle = characteristics[0].value_handle; 658a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 659a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 660a382a4adSMilanka Ringwald characteristics[0].end_handle = end_handle; 661a382a4adSMilanka Ringwald 6624902524cSMatthias Ringwald reset_query_state(); 6634902524cSMatthias Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6644902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6654902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6664902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6678404d3b7SMilanka Ringwald 6688404d3b7SMilanka Ringwald // invalid con handle 6698404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]); 67040faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 6718404d3b7SMilanka Ringwald 6728404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 6738404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6748404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 6754902524cSMatthias Ringwald } 6764902524cSMatthias Ringwald 677a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristic_using_value_handle){ 678a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 679a382a4adSMilanka Ringwald reset_query_state(); 680a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 681a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 682a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 683a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 684a382a4adSMilanka Ringwald 685a382a4adSMilanka Ringwald reset_query_state(); 686a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 687a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 688a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 689a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 690a382a4adSMilanka Ringwald 691a382a4adSMilanka Ringwald // invalid con handle 692a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle); 69340faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 694a382a4adSMilanka Ringwald 695a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 696a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle); 697a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 698a382a4adSMilanka Ringwald reset_query_state(); 699a382a4adSMilanka Ringwald } 700a382a4adSMilanka Ringwald 701a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset){ 702a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 703a382a4adSMilanka Ringwald reset_query_state(); 704a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 705a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 706a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 707a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 708a382a4adSMilanka Ringwald 709a382a4adSMilanka Ringwald reset_query_state(); 710a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 711a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 712a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 713a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 714a382a4adSMilanka Ringwald 715a382a4adSMilanka Ringwald // invalid con handle 716a382a4adSMilanka 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); 71740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 718a382a4adSMilanka Ringwald 719a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 720a382a4adSMilanka 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); 721a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 722a382a4adSMilanka Ringwald reset_query_state(); 723a382a4adSMilanka Ringwald } 724a382a4adSMilanka Ringwald 725a382a4adSMilanka Ringwald 726a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid16){ 727a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 728a382a4adSMilanka Ringwald reset_query_state(); 729a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 730a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 731a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 732a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 733a382a4adSMilanka Ringwald 734a382a4adSMilanka Ringwald reset_query_state(); 735a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 736a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 737a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 738a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 739a382a4adSMilanka Ringwald 740a382a4adSMilanka Ringwald reset_query_state(); 741a382a4adSMilanka 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); 742a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 743a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 744a382a4adSMilanka Ringwald 745a382a4adSMilanka Ringwald // invalid con handle 746a382a4adSMilanka 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); 74740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 748a382a4adSMilanka Ringwald 749a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 750a382a4adSMilanka 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); 751a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 752a382a4adSMilanka Ringwald reset_query_state(); 753a382a4adSMilanka Ringwald } 754a382a4adSMilanka Ringwald 755a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid128){ 756a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 757a382a4adSMilanka Ringwald reset_query_state(); 758a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 759a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 760a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 761a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 762a382a4adSMilanka Ringwald 763a382a4adSMilanka Ringwald reset_query_state(); 764a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 765a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 766a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 767a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 768a382a4adSMilanka Ringwald 769a382a4adSMilanka Ringwald reset_query_state(); 770a382a4adSMilanka 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); 771a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 772a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 773a382a4adSMilanka Ringwald 774a382a4adSMilanka Ringwald // invalid con handle 775a382a4adSMilanka 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); 77640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 777a382a4adSMilanka Ringwald 778a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 779a382a4adSMilanka 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); 780a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 781a382a4adSMilanka Ringwald reset_query_state(); 782a382a4adSMilanka Ringwald } 783a382a4adSMilanka Ringwald 784a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_write_characteristic_descriptor_using_descriptor_handle){ 785a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 786a382a4adSMilanka Ringwald reset_query_state(); 787a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 788a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 789a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 790a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 791a382a4adSMilanka Ringwald 792a382a4adSMilanka Ringwald reset_query_state(); 793a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 794a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 795a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 796a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 797a382a4adSMilanka Ringwald 798a382a4adSMilanka Ringwald 799a382a4adSMilanka Ringwald reset_query_state(); 800a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 801a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 802a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 803a382a4adSMilanka Ringwald CHECK_EQUAL(3, result_counter); 804a382a4adSMilanka Ringwald 805a382a4adSMilanka Ringwald reset_query_state(); 806a382a4adSMilanka 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); 807a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 808a382a4adSMilanka Ringwald 809a382a4adSMilanka Ringwald // invalid con handle 810a382a4adSMilanka 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); 81140faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 812a382a4adSMilanka Ringwald 813a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 814a382a4adSMilanka 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); 815a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 816a382a4adSMilanka Ringwald reset_query_state(); 817a382a4adSMilanka Ringwald } 818a382a4adSMilanka Ringwald 819a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_prepare_write){ 820a382a4adSMilanka Ringwald reset_query_state(); 821a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 822a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 823a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 824a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 825a382a4adSMilanka Ringwald 826a382a4adSMilanka Ringwald reset_query_state(); 827a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 828a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 829a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 830a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 831a382a4adSMilanka Ringwald 832a382a4adSMilanka Ringwald reset_query_state(); 833a382a4adSMilanka 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); 834a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 835a382a4adSMilanka Ringwald 836a382a4adSMilanka Ringwald // invalid con handle 837a382a4adSMilanka 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); 83840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 839a382a4adSMilanka Ringwald 840a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 841a382a4adSMilanka 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); 842a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 843a382a4adSMilanka Ringwald reset_query_state(); 844a382a4adSMilanka Ringwald } 845a382a4adSMilanka Ringwald 846a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_execute_write){ 847a382a4adSMilanka Ringwald reset_query_state(); 848a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); 849a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 850a382a4adSMilanka Ringwald 851a382a4adSMilanka Ringwald // invalid con handle 852a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 85340faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 854a382a4adSMilanka Ringwald 855a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 856a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); 857a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 858a382a4adSMilanka Ringwald reset_query_state(); 859a382a4adSMilanka Ringwald } 860a382a4adSMilanka Ringwald 861a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_cancel_write){ 862a382a4adSMilanka Ringwald reset_query_state(); 863a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); 864a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 865a382a4adSMilanka Ringwald 866a382a4adSMilanka Ringwald // invalid con handle 867a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 86840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 869a382a4adSMilanka Ringwald 870a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 871a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); 872a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 873a382a4adSMilanka Ringwald reset_query_state(); 874a382a4adSMilanka Ringwald } 875a382a4adSMilanka Ringwald 8764902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){ 8774902524cSMatthias Ringwald test = READ_CHARACTERISTIC_VALUE; 8784902524cSMatthias Ringwald reset_query_state(); 8794902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 8804902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8814902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8824902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8834902524cSMatthias Ringwald 8844902524cSMatthias Ringwald reset_query_state(); 8854902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 8864902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8874902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8884902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8894902524cSMatthias Ringwald 8904902524cSMatthias Ringwald reset_query_state(); 8914902524cSMatthias Ringwald status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 8924902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8934902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8944902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 8954902524cSMatthias Ringwald } 8964902524cSMatthias Ringwald 8974902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){ 8984902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_VALUE; 8994902524cSMatthias Ringwald reset_query_state(); 9004902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9014902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9024902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9034902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9044902524cSMatthias Ringwald 9054902524cSMatthias Ringwald reset_query_state(); 9064902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 9074902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9084902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9094902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9104902524cSMatthias Ringwald 9118404d3b7SMilanka Ringwald // invalid con handle 9128404d3b7SMilanka 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); 91340faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 9148404d3b7SMilanka Ringwald 9158404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 9168404d3b7SMilanka 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); 9178404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 9188404d3b7SMilanka Ringwald 9198404d3b7SMilanka Ringwald 9204902524cSMatthias Ringwald reset_query_state(); 9214902524cSMatthias 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); 9224902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9234902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9244902524cSMatthias Ringwald } 9254902524cSMatthias Ringwald 9264902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){ 9274902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_DESCRIPTOR; 9284902524cSMatthias Ringwald reset_query_state(); 9294902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9304902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9314902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9324902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9334902524cSMatthias Ringwald 9344902524cSMatthias Ringwald reset_query_state(); 9354902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 9364902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9374902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9384902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9394902524cSMatthias Ringwald 9404902524cSMatthias Ringwald reset_query_state(); 9414902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9424902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9434902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9444902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9454902524cSMatthias Ringwald 9464902524cSMatthias Ringwald reset_query_state(); 9474902524cSMatthias Ringwald status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication); 9484902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9494902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9504902524cSMatthias Ringwald } 9514902524cSMatthias Ringwald 9524902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){ 9534902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_VALUE; 9544902524cSMatthias Ringwald reset_query_state(); 9554902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9564902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9574902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9584902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9594902524cSMatthias Ringwald 9604902524cSMatthias Ringwald reset_query_state(); 9614902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 9624902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9634902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9644902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9654902524cSMatthias Ringwald 9664902524cSMatthias Ringwald reset_query_state(); 9674902524cSMatthias Ringwald status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9684902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9694902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9708404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 9714902524cSMatthias Ringwald } 9724902524cSMatthias Ringwald 9734902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){ 9744902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_DESCRIPTOR; 9754902524cSMatthias Ringwald reset_query_state(); 9764902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 9774902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9784902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9794902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9804902524cSMatthias Ringwald 9814902524cSMatthias Ringwald reset_query_state(); 9824902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 9834902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9844902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9854902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9864902524cSMatthias Ringwald 9874902524cSMatthias Ringwald reset_query_state(); 9884902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9894902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9904902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9914902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9924902524cSMatthias Ringwald 9934902524cSMatthias Ringwald reset_query_state(); 9944902524cSMatthias Ringwald result_counter = 0; 9954902524cSMatthias Ringwald status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 9964902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9974902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9988404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 9994902524cSMatthias Ringwald } 10004902524cSMatthias Ringwald 10014902524cSMatthias Ringwald 10024902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){ 10034902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR; 10044902524cSMatthias Ringwald reset_query_state(); 10054902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 10064902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10074902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10084902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10094902524cSMatthias Ringwald 10104902524cSMatthias Ringwald reset_query_state(); 10114902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 10124902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10134902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10144902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10154902524cSMatthias Ringwald 10164902524cSMatthias Ringwald reset_query_state(); 10174902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 10184902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10194902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10204902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 10214902524cSMatthias Ringwald 10224902524cSMatthias Ringwald result_counter = 0; 10234902524cSMatthias Ringwald status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value); 10244902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10254902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10264902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10274902524cSMatthias Ringwald } 10284902524cSMatthias Ringwald 10294902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){ 10304902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_VALUE; 10314902524cSMatthias Ringwald reset_query_state(); 10324902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10334902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10344902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10354902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10364902524cSMatthias Ringwald 10374902524cSMatthias Ringwald reset_query_state(); 10384902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10394902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10404902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10414902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10424902524cSMatthias Ringwald 10434902524cSMatthias Ringwald 10444902524cSMatthias Ringwald reset_query_state(); 10454902524cSMatthias 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); 10464902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10474902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10484902524cSMatthias Ringwald } 10494902524cSMatthias Ringwald 10504902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){ 10514902524cSMatthias Ringwald test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE; 10524902524cSMatthias Ringwald reset_query_state(); 10534902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10544902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10554902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10564902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10574902524cSMatthias Ringwald 10584902524cSMatthias Ringwald reset_query_state(); 10594902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10604902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10614902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10624902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10634902524cSMatthias Ringwald 10648404d3b7SMilanka Ringwald // invalid con handle 10658404d3b7SMilanka 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); 106640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 10678404d3b7SMilanka Ringwald 10688404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 10698404d3b7SMilanka 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); 10708404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 10718404d3b7SMilanka Ringwald 10724902524cSMatthias Ringwald reset_query_state(); 10734902524cSMatthias 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); 10744902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10754902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10764902524cSMatthias Ringwald } 10774902524cSMatthias Ringwald 10788404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){ 10798404d3b7SMilanka Ringwald reset_query_state(); 10808404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10818404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10828404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10838404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10848404d3b7SMilanka Ringwald 10858404d3b7SMilanka Ringwald reset_query_state(); 10868404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10878404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10888404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10898404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10908404d3b7SMilanka Ringwald 10918404d3b7SMilanka Ringwald reset_query_state(); 10928404d3b7SMilanka 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); 10938404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10948404d3b7SMilanka Ringwald 10958404d3b7SMilanka Ringwald reset_query_state(); 10968404d3b7SMilanka Ringwald // invalid con handle 10978404d3b7SMilanka 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); 109840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 10998404d3b7SMilanka Ringwald 11008404d3b7SMilanka Ringwald reset_query_state(); 11018404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11028404d3b7SMilanka 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); 11038404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 11048404d3b7SMilanka Ringwald } 11058404d3b7SMilanka Ringwald 11068404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){ 11078404d3b7SMilanka Ringwald reset_query_state(); 11088404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 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 reset_query_state(); 11148404d3b7SMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 11158404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11168404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11178404d3b7SMilanka Ringwald CHECK(result_counter); 11188404d3b7SMilanka Ringwald CHECK_EQUAL(3, result_index); 11198404d3b7SMilanka Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 11208404d3b7SMilanka Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 11218404d3b7SMilanka Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 11228404d3b7SMilanka Ringwald 11238404d3b7SMilanka Ringwald reset_query_state(); 11248404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 11258404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11268404d3b7SMilanka Ringwald 11278404d3b7SMilanka Ringwald reset_query_state(); 11288404d3b7SMilanka Ringwald // invalid con handle 11298404d3b7SMilanka 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); 113040faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 11318404d3b7SMilanka Ringwald 11328404d3b7SMilanka Ringwald reset_query_state(); 11338404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11348404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 11358404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 11368404d3b7SMilanka Ringwald } 11378404d3b7SMilanka Ringwald 11388404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){ 11398404d3b7SMilanka Ringwald reset_query_state(); 11408404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 11418404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11428404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11438404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11448404d3b7SMilanka Ringwald 11458404d3b7SMilanka Ringwald reset_query_state(); 11468404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 11478404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11488404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11498404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11508404d3b7SMilanka Ringwald 11518404d3b7SMilanka Ringwald uint16_t value_handles[] = {characteristics[0].value_handle}; 11528404d3b7SMilanka Ringwald 11538404d3b7SMilanka Ringwald reset_query_state(); 11548404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 11558404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11568404d3b7SMilanka Ringwald 11578404d3b7SMilanka Ringwald reset_query_state(); 11588404d3b7SMilanka Ringwald // invalid con handle 11598404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles); 116040faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 11618404d3b7SMilanka Ringwald 11628404d3b7SMilanka Ringwald reset_query_state(); 11638404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11648404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 11658404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 11668404d3b7SMilanka Ringwald } 11678404d3b7SMilanka Ringwald 11688404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){ 11698404d3b7SMilanka Ringwald reset_query_state(); 11708404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 11718404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11728404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11738404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11748404d3b7SMilanka Ringwald 11758404d3b7SMilanka Ringwald reset_query_state(); 11768404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 11778404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11788404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11798404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11808404d3b7SMilanka Ringwald 11818404d3b7SMilanka Ringwald reset_query_state(); 11828404d3b7SMilanka Ringwald // invalid con handle 11838404d3b7SMilanka 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); 118440faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 11858404d3b7SMilanka Ringwald 11868404d3b7SMilanka Ringwald reset_query_state(); 11878404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11888404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 11898404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status); 11908404d3b7SMilanka Ringwald 11918404d3b7SMilanka Ringwald reset_query_state(); 11928404d3b7SMilanka Ringwald 11938404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value); 11948404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11958404d3b7SMilanka Ringwald } 11964902524cSMatthias Ringwald 1197a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_is_ready){ 1198a382a4adSMilanka Ringwald int status = gatt_client_is_ready(HCI_CON_HANDLE_INVALID); 1199a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1200a382a4adSMilanka Ringwald 1201a382a4adSMilanka Ringwald status = gatt_client_is_ready(gatt_client_handle); 1202a382a4adSMilanka Ringwald CHECK_EQUAL(1, status); 1203a382a4adSMilanka Ringwald } 1204a382a4adSMilanka Ringwald 1205a382a4adSMilanka Ringwald 1206a382a4adSMilanka Ringwald TEST(GATTClient, register_for_notification){ 1207a382a4adSMilanka Ringwald reset_query_state(); 1208a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 1209a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1210a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1211a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1212a382a4adSMilanka Ringwald 1213a382a4adSMilanka Ringwald reset_query_state(); 1214a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 1215a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1216a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1217a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1218a382a4adSMilanka Ringwald 1219a382a4adSMilanka Ringwald gatt_client_notification_t notification; 1220a382a4adSMilanka Ringwald 1221a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, &characteristics[0]); 1222a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1223a382a4adSMilanka Ringwald 1224a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, NULL); 1225a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1226a382a4adSMilanka Ringwald } 1227a382a4adSMilanka Ringwald 1228a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_signed_write_without_response){ 1229a382a4adSMilanka Ringwald reset_query_state(); 1230a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 1231a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1232a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1233a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1234a382a4adSMilanka Ringwald 1235a382a4adSMilanka Ringwald reset_query_state(); 1236a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 1237a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1238a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1239a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1240a382a4adSMilanka Ringwald 1241a382a4adSMilanka Ringwald reset_query_state(); 1242a382a4adSMilanka Ringwald // invalid con handle 1243a382a4adSMilanka 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); 124440faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1245a382a4adSMilanka Ringwald 1246a382a4adSMilanka Ringwald reset_query_state(); 1247a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 1248a382a4adSMilanka 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); 1249a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1250a382a4adSMilanka Ringwald 1251a382a4adSMilanka Ringwald reset_query_state(); 1252a382a4adSMilanka Ringwald 1253a382a4adSMilanka 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); 1254a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1255a382a4adSMilanka Ringwald } 1256a382a4adSMilanka Ringwald 1257a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_discover_secondary_services){ 1258a382a4adSMilanka Ringwald reset_query_state(); 1259a382a4adSMilanka Ringwald // invalid con handle 1260a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 126140faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1262a382a4adSMilanka Ringwald 1263a382a4adSMilanka Ringwald reset_query_state(); 1264a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 1265a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); 1266a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1267a382a4adSMilanka Ringwald 1268a382a4adSMilanka Ringwald reset_query_state(); 1269a382a4adSMilanka Ringwald 1270a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); 1271a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1272a382a4adSMilanka Ringwald } 1273a382a4adSMilanka Ringwald 1274617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_request_can_write_without_response_event){ 12757e4c9b5dSMatthias Ringwald uint8_t status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 127640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1277a382a4adSMilanka Ringwald 127840faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 1279617a2595SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 12807e4c9b5dSMatthias Ringwald gatt_client->write_without_response_callback = handle_ble_client_event; 1281617a2595SMilanka Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 1282617a2595SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1283617a2595SMilanka Ringwald 1284617a2595SMilanka Ringwald gatt_client->write_without_response_callback = NULL; 1285617a2595SMilanka Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 1286617a2595SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 1287617a2595SMilanka Ringwald } 1288617a2595SMilanka Ringwald 12897e4c9b5dSMatthias Ringwald TEST(GATTClient, gatt_client_request_to_write_without_response){ 12907e4c9b5dSMatthias Ringwald btstack_context_callback_registration_t callback_registration = { 0 }; 12917e4c9b5dSMatthias Ringwald uint8_t status = gatt_client_request_to_write_without_response(&callback_registration, HCI_CON_HANDLE_INVALID); 12927e4c9b5dSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 12937e4c9b5dSMatthias Ringwald 12947e4c9b5dSMatthias Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 12957e4c9b5dSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 12967e4c9b5dSMatthias Ringwald } 12977e4c9b5dSMatthias Ringwald 12985fe445cbSMatthias Ringwald static void dummy_callback(void * context){ 12995fe445cbSMatthias Ringwald (void) context; 13005fe445cbSMatthias Ringwald } 13015fe445cbSMatthias Ringwald TEST(GATTClient, gatt_client_request_to_send_gatt_query){ 13025fe445cbSMatthias Ringwald btstack_context_callback_registration_t callback_registration = { 0 }; 13035fe445cbSMatthias Ringwald callback_registration.callback = &dummy_callback; 13045fe445cbSMatthias Ringwald 13055fe445cbSMatthias Ringwald uint8_t status = gatt_client_request_to_send_gatt_query(&callback_registration, HCI_CON_HANDLE_INVALID); 13065fe445cbSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 13075fe445cbSMatthias Ringwald 13085fe445cbSMatthias Ringwald status = gatt_client_request_to_send_gatt_query(&callback_registration, gatt_client_handle); 13095fe445cbSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 13105fe445cbSMatthias Ringwald } 13115fe445cbSMatthias Ringwald 1312617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_send_mtu_negotiation){ 1313617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 1314617a2595SMilanka Ringwald 1315617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); 1316617a2595SMilanka Ringwald 131740faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 1318617a2595SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1319617a2595SMilanka Ringwald gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 1320617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); 1321617a2595SMilanka Ringwald 1322617a2595SMilanka Ringwald gatt_client->mtu_state = SEND_MTU_EXCHANGE; 1323617a2595SMilanka Ringwald } 1324a382a4adSMilanka Ringwald 1325a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_get_mtu){ 1326a382a4adSMilanka Ringwald reset_query_state(); 1327a382a4adSMilanka Ringwald uint16_t mtu; 1328a382a4adSMilanka Ringwald int status = gatt_client_get_mtu(HCI_CON_HANDLE_INVALID, &mtu); 132940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1330a382a4adSMilanka Ringwald 1331a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1332a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1333a382a4adSMilanka Ringwald CHECK_EQUAL(ATT_DEFAULT_MTU, mtu); 1334a382a4adSMilanka Ringwald 133540faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 1336a382a4adSMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1337a382a4adSMilanka Ringwald gatt_client->mtu = 30; 1338a382a4adSMilanka Ringwald 1339a382a4adSMilanka Ringwald gatt_client->mtu_state = MTU_EXCHANGED; 1340a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1341a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1342a382a4adSMilanka Ringwald CHECK_EQUAL(gatt_client->mtu, mtu); 1343a382a4adSMilanka Ringwald 1344a382a4adSMilanka Ringwald gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 1345a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1346a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1347a382a4adSMilanka Ringwald CHECK_EQUAL(gatt_client->mtu, mtu); 1348a382a4adSMilanka Ringwald 1349a382a4adSMilanka Ringwald gatt_client->mtu_state = SEND_MTU_EXCHANGE; 1350a382a4adSMilanka Ringwald } 1351a382a4adSMilanka Ringwald 1352*369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_characteristic_descriptor){ 1353*369697acSMilanka Ringwald gatt_client_characteristic_descriptor_t descriptor; 1354*369697acSMilanka Ringwald 1355*369697acSMilanka Ringwald uint8_t packet[18]; 1356*369697acSMilanka Ringwald uint16_t expected_handle = 0x1234; 1357*369697acSMilanka Ringwald uint16_t expected_uuid16 = 0xABCD; 1358*369697acSMilanka Ringwald 1359*369697acSMilanka Ringwald uint8_t uuid128[16]; 1360*369697acSMilanka Ringwald uuid_add_bluetooth_prefix(uuid128, expected_uuid16); 1361*369697acSMilanka Ringwald 1362*369697acSMilanka Ringwald little_endian_store_16(packet, 0, expected_handle); 1363*369697acSMilanka Ringwald reverse_128(uuid128, &packet[2]); 1364*369697acSMilanka Ringwald 1365*369697acSMilanka Ringwald // uuid16 with Bluetooth prefix 1366*369697acSMilanka Ringwald gatt_client_deserialize_characteristic_descriptor(packet, 0, &descriptor); 1367*369697acSMilanka Ringwald CHECK_EQUAL(descriptor.handle, expected_handle); 1368*369697acSMilanka Ringwald CHECK_EQUAL(descriptor.uuid16, expected_uuid16); 1369*369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, descriptor.uuid128, sizeof(uuid128)); 1370*369697acSMilanka Ringwald 1371*369697acSMilanka Ringwald // uuid128 1372*369697acSMilanka Ringwald memset(&uuid128[4], 0xaa, 12); 1373*369697acSMilanka Ringwald reverse_128(uuid128, &packet[2]); 1374*369697acSMilanka Ringwald 1375*369697acSMilanka Ringwald gatt_client_deserialize_characteristic_descriptor(packet, 0, &descriptor); 1376*369697acSMilanka Ringwald CHECK_EQUAL(descriptor.handle, expected_handle); 1377*369697acSMilanka Ringwald CHECK_EQUAL(descriptor.uuid16, 0); 1378*369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, descriptor.uuid128, sizeof(uuid128)); 1379*369697acSMilanka Ringwald } 1380*369697acSMilanka Ringwald 1381*369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_service){ 1382*369697acSMilanka Ringwald gatt_client_service_t service; 1383*369697acSMilanka Ringwald 1384*369697acSMilanka Ringwald uint8_t packet[20]; 1385*369697acSMilanka Ringwald uint16_t expected_start_group_handle = 0x1234; 1386*369697acSMilanka Ringwald uint16_t expected_end_group_handle = 0x5678; 1387*369697acSMilanka Ringwald uint16_t expected_uuid16 = 0xABCD; 1388*369697acSMilanka Ringwald 1389*369697acSMilanka Ringwald uint8_t uuid128[16]; 1390*369697acSMilanka Ringwald uuid_add_bluetooth_prefix(uuid128, expected_uuid16); 1391*369697acSMilanka Ringwald 1392*369697acSMilanka Ringwald little_endian_store_16(packet, 0, expected_start_group_handle); 1393*369697acSMilanka Ringwald little_endian_store_16(packet, 2, expected_end_group_handle); 1394*369697acSMilanka Ringwald reverse_128(uuid128, &packet[4]); 1395*369697acSMilanka Ringwald 1396*369697acSMilanka Ringwald // uuid16 with Bluetooth prefix 1397*369697acSMilanka Ringwald gatt_client_deserialize_service(packet, 0, &service); 1398*369697acSMilanka Ringwald CHECK_EQUAL(service.start_group_handle, expected_start_group_handle); 1399*369697acSMilanka Ringwald CHECK_EQUAL(service.end_group_handle , expected_end_group_handle); 1400*369697acSMilanka Ringwald CHECK_EQUAL(service.uuid16, expected_uuid16); 1401*369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, service.uuid128, sizeof(uuid128)); 1402*369697acSMilanka Ringwald 1403*369697acSMilanka Ringwald // uuid128 1404*369697acSMilanka Ringwald memset(&uuid128[4], 0xaa, 12); 1405*369697acSMilanka Ringwald reverse_128(uuid128, &packet[4]); 1406*369697acSMilanka Ringwald 1407*369697acSMilanka Ringwald gatt_client_deserialize_service(packet, 0, &service); 1408*369697acSMilanka Ringwald CHECK_EQUAL(service.start_group_handle, expected_start_group_handle); 1409*369697acSMilanka Ringwald CHECK_EQUAL(service.end_group_handle , expected_end_group_handle); 1410*369697acSMilanka Ringwald CHECK_EQUAL(service.uuid16, 0); 1411*369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, service.uuid128, sizeof(uuid128)); 1412*369697acSMilanka Ringwald } 1413*369697acSMilanka Ringwald 1414*369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_characteristic){ 1415*369697acSMilanka Ringwald gatt_client_characteristic_t characteristic; 1416*369697acSMilanka Ringwald 1417*369697acSMilanka Ringwald uint8_t packet[24]; 1418*369697acSMilanka Ringwald uint16_t expected_start_handle = 0x1234; 1419*369697acSMilanka Ringwald uint16_t expected_value_handle = 0x3455; 1420*369697acSMilanka Ringwald uint16_t expected_end_handle = 0x5678; 1421*369697acSMilanka Ringwald uint16_t expected_properties = 0x6789; 1422*369697acSMilanka Ringwald 1423*369697acSMilanka Ringwald uint16_t expected_uuid16 = 0xABCD; 1424*369697acSMilanka Ringwald 1425*369697acSMilanka Ringwald uint8_t uuid128[16]; 1426*369697acSMilanka Ringwald uuid_add_bluetooth_prefix(uuid128, expected_uuid16); 1427*369697acSMilanka Ringwald 1428*369697acSMilanka Ringwald little_endian_store_16(packet, 0, expected_start_handle); 1429*369697acSMilanka Ringwald little_endian_store_16(packet, 2, expected_value_handle); 1430*369697acSMilanka Ringwald little_endian_store_16(packet, 4, expected_end_handle); 1431*369697acSMilanka Ringwald little_endian_store_16(packet, 6, expected_properties); 1432*369697acSMilanka Ringwald reverse_128(uuid128, &packet[8]); 1433*369697acSMilanka Ringwald 1434*369697acSMilanka Ringwald // uuid16 with Bluetooth prefix 1435*369697acSMilanka Ringwald gatt_client_deserialize_characteristic(packet, 0, &characteristic); 1436*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.start_handle, expected_start_handle); 1437*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.value_handle, expected_value_handle); 1438*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.end_handle , expected_end_handle); 1439*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.properties , expected_properties); 1440*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.uuid16, expected_uuid16); 1441*369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, characteristic.uuid128, sizeof(uuid128)); 1442*369697acSMilanka Ringwald 1443*369697acSMilanka Ringwald // uuid128 1444*369697acSMilanka Ringwald memset(&uuid128[4], 0xaa, 12); 1445*369697acSMilanka Ringwald reverse_128(uuid128, &packet[8]); 1446*369697acSMilanka Ringwald 1447*369697acSMilanka Ringwald gatt_client_deserialize_characteristic(packet, 0, &characteristic); 1448*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.start_handle, expected_start_handle); 1449*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.value_handle, expected_value_handle); 1450*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.end_handle , expected_end_handle); 1451*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.properties , expected_properties); 1452*369697acSMilanka Ringwald CHECK_EQUAL(characteristic.uuid16, 0); 1453*369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, characteristic.uuid128, sizeof(uuid128)); 1454*369697acSMilanka Ringwald } 1455a382a4adSMilanka Ringwald 14564902524cSMatthias Ringwald int main (int argc, const char * argv[]){ 14574902524cSMatthias Ringwald att_set_db(profile_data); 14584902524cSMatthias Ringwald att_set_write_callback(&att_write_callback); 14594902524cSMatthias Ringwald att_set_read_callback(&att_read_callback); 14604902524cSMatthias Ringwald 14614902524cSMatthias Ringwald gatt_client_init(); 14624902524cSMatthias Ringwald 14634902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 14644902524cSMatthias Ringwald } 1465