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" 20ef09b0beSMatthias Ringwald #include "btstack_event.h" 214902524cSMatthias Ringwald #include "hci.h" 224902524cSMatthias Ringwald #include "hci_dump.h" 234902524cSMatthias Ringwald #include "ble/gatt_client.h" 244902524cSMatthias Ringwald #include "ble/att_db.h" 254902524cSMatthias Ringwald #include "profile.h" 264902524cSMatthias Ringwald #include "expected_results.h" 274902524cSMatthias Ringwald 288404d3b7SMilanka Ringwald extern "C" void hci_setup_le_connection(uint16_t con_handle); 298404d3b7SMilanka Ringwald 304902524cSMatthias Ringwald static uint16_t gatt_client_handle = 0x40; 314902524cSMatthias Ringwald static int gatt_query_complete = 0; 324902524cSMatthias Ringwald 334902524cSMatthias Ringwald typedef enum { 344902524cSMatthias Ringwald IDLE, 354902524cSMatthias Ringwald DISCOVER_PRIMARY_SERVICES, 364902524cSMatthias Ringwald DISCOVER_PRIMARY_SERVICE_WITH_UUID16, 374902524cSMatthias Ringwald DISCOVER_PRIMARY_SERVICE_WITH_UUID128, 384902524cSMatthias Ringwald 394902524cSMatthias Ringwald DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16, 404902524cSMatthias Ringwald DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128, 414902524cSMatthias Ringwald 424902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16, 434902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128, 444902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_BY_UUID16, 454902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_BY_UUID128, 464902524cSMatthias Ringwald DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID, 474902524cSMatthias Ringwald 484902524cSMatthias Ringwald READ_CHARACTERISTIC_VALUE, 494902524cSMatthias Ringwald READ_LONG_CHARACTERISTIC_VALUE, 504902524cSMatthias Ringwald WRITE_CHARACTERISTIC_VALUE, 514902524cSMatthias Ringwald WRITE_LONG_CHARACTERISTIC_VALUE, 524902524cSMatthias Ringwald 534902524cSMatthias Ringwald DISCOVER_CHARACTERISTIC_DESCRIPTORS, 544902524cSMatthias Ringwald READ_CHARACTERISTIC_DESCRIPTOR, 554902524cSMatthias Ringwald WRITE_CHARACTERISTIC_DESCRIPTOR, 564902524cSMatthias Ringwald WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION, 57369697acSMilanka Ringwald WRITE_NONEXISTING_CLIENT_CHARACTERISTIC_CONFIGURATION, 584902524cSMatthias Ringwald READ_LONG_CHARACTERISTIC_DESCRIPTOR, 594902524cSMatthias Ringwald WRITE_LONG_CHARACTERISTIC_DESCRIPTOR, 604902524cSMatthias Ringwald WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE, 614902524cSMatthias Ringwald WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE 624902524cSMatthias Ringwald } current_test_t; 634902524cSMatthias Ringwald 644902524cSMatthias Ringwald current_test_t test = IDLE; 654902524cSMatthias Ringwald 664902524cSMatthias Ringwald uint8_t characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb}; 674902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000; 684902524cSMatthias Ringwald 694902524cSMatthias Ringwald static int result_index; 704902524cSMatthias Ringwald static uint8_t result_counter; 714902524cSMatthias Ringwald 724902524cSMatthias Ringwald static gatt_client_service_t services[50]; 734902524cSMatthias Ringwald static gatt_client_service_t included_services[50]; 744902524cSMatthias Ringwald 754902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50]; 764902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50]; 774902524cSMatthias Ringwald 784902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void); 794902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void); 804902524cSMatthias Ringwald 814902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ 824902524cSMatthias Ringwald for (int i=0; i<size; i++){ 834902524cSMatthias Ringwald BYTES_EQUAL(expected[i], actual[i]); 844902524cSMatthias Ringwald } 854902524cSMatthias Ringwald } 864902524cSMatthias Ringwald 874902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) { 884902524cSMatthias Ringwald printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", 894902524cSMatthias Ringwald uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7], 904902524cSMatthias Ringwald uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]); 914902524cSMatthias Ringwald } 924902524cSMatthias Ringwald 934902524cSMatthias Ringwald //static int counter = 0; 944902524cSMatthias 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){ 954902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16); 964902524cSMatthias Ringwald if (!exp_handles) return; 974902524cSMatthias Ringwald CHECK_EQUAL(exp_handles[0], start_handle); 984902524cSMatthias Ringwald CHECK_EQUAL(exp_handles[1], end_handle); 994902524cSMatthias Ringwald } 1004902524cSMatthias Ringwald 1014902524cSMatthias Ringwald // ----------------------------------------------------- 1024902524cSMatthias Ringwald 1034902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){ 1044902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1054902524cSMatthias 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); 1064902524cSMatthias Ringwald } 1074902524cSMatthias Ringwald 1084902524cSMatthias Ringwald 1094902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){ 1104902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1114902524cSMatthias 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); 1124902524cSMatthias Ringwald } 1134902524cSMatthias Ringwald 1144902524cSMatthias Ringwald static void verify_primary_services(void){ 1154902524cSMatthias Ringwald CHECK_EQUAL(6, result_index); 1164902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1174902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle); 1184902524cSMatthias Ringwald } 1194902524cSMatthias Ringwald } 1204902524cSMatthias Ringwald 1214902524cSMatthias Ringwald static void verify_included_services_uuid16(void){ 1224902524cSMatthias Ringwald CHECK_EQUAL(1, result_index); 1234902524cSMatthias 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); 1244902524cSMatthias Ringwald } 1254902524cSMatthias Ringwald 1264902524cSMatthias Ringwald static void verify_included_services_uuid128(void){ 1274902524cSMatthias Ringwald CHECK_EQUAL(2, result_index); 1284902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1294902524cSMatthias 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); 1304902524cSMatthias Ringwald } 1314902524cSMatthias Ringwald } 1324902524cSMatthias Ringwald 1334902524cSMatthias Ringwald static void verify_charasteristics(void){ 1344902524cSMatthias Ringwald CHECK_EQUAL(15, result_index); 1354902524cSMatthias Ringwald for (int i=0; i<result_index; i++){ 1364902524cSMatthias Ringwald CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle); 1374902524cSMatthias Ringwald } 1384902524cSMatthias Ringwald } 1394902524cSMatthias Ringwald 1404902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){ 1414902524cSMatthias Ringwald uint8_t * expected_value = (uint8_t*)&long_value[value_offset]; 1424902524cSMatthias Ringwald CHECK(value_length); 1434902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(expected_value, value, value_length); 1444902524cSMatthias Ringwald if (value_offset + value_length != sizeof(long_value)) return; 1454902524cSMatthias Ringwald result_counter++; 1464902524cSMatthias Ringwald } 1474902524cSMatthias Ringwald 1484902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 1494902524cSMatthias Ringwald if (packet_type != HCI_EVENT_PACKET) return; 1504902524cSMatthias Ringwald uint8_t status; 1514902524cSMatthias Ringwald gatt_client_service_t service; 1524902524cSMatthias Ringwald gatt_client_characteristic_t characteristic; 1534902524cSMatthias Ringwald gatt_client_characteristic_descriptor_t descriptor; 1544902524cSMatthias Ringwald switch (packet[0]){ 1554902524cSMatthias Ringwald case GATT_EVENT_QUERY_COMPLETE: 156ef09b0beSMatthias Ringwald status = gatt_event_query_complete_get_att_status(packet); 1574902524cSMatthias Ringwald gatt_query_complete = 1; 1584902524cSMatthias Ringwald if (status){ 1594902524cSMatthias Ringwald gatt_query_complete = 0; 1604902524cSMatthias Ringwald printf("GATT_EVENT_QUERY_COMPLETE failed with status 0x%02X\n", status); 1614902524cSMatthias Ringwald } 1624902524cSMatthias Ringwald break; 1634902524cSMatthias Ringwald case GATT_EVENT_SERVICE_QUERY_RESULT: 164ef09b0beSMatthias Ringwald gatt_event_service_query_result_get_service(packet, &service); 1654902524cSMatthias Ringwald services[result_index++] = service; 1664902524cSMatthias Ringwald result_counter++; 1674902524cSMatthias Ringwald break; 1684902524cSMatthias Ringwald case GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT: 169ef09b0beSMatthias Ringwald gatt_event_included_service_query_result_get_service(packet, &service); 1704902524cSMatthias Ringwald included_services[result_index++] = service; 1714902524cSMatthias Ringwald result_counter++; 1724902524cSMatthias Ringwald break; 1734902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT: 174ef09b0beSMatthias Ringwald gatt_event_characteristic_query_result_get_characteristic(packet, &characteristic); 1754902524cSMatthias Ringwald characteristics[result_index++] = characteristic; 1764902524cSMatthias Ringwald result_counter++; 1774902524cSMatthias Ringwald break; 1784902524cSMatthias Ringwald case GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT: 179ef09b0beSMatthias Ringwald gatt_event_all_characteristic_descriptors_query_result_get_characteristic_descriptor(packet, &descriptor); 1804902524cSMatthias Ringwald descriptors[result_index++] = descriptor; 1814902524cSMatthias Ringwald result_counter++; 1824902524cSMatthias Ringwald break; 1834902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT: 1844902524cSMatthias Ringwald case GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT: 185ef09b0beSMatthias Ringwald CHECK_EQUAL(short_value_length, gatt_event_characteristic_value_query_result_get_value_length(packet)); 186ef09b0beSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t*)short_value, (uint8_t *)gatt_event_characteristic_value_query_result_get_value(packet), short_value_length); 1874902524cSMatthias Ringwald result_counter++; 1884902524cSMatthias Ringwald break; 1894902524cSMatthias Ringwald case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT: 1904902524cSMatthias Ringwald case GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT: 191ef09b0beSMatthias Ringwald verify_blob(gatt_event_long_characteristic_value_query_result_get_value_length(packet), 192ef09b0beSMatthias Ringwald gatt_event_long_characteristic_value_query_result_get_value_offset(packet), 193ef09b0beSMatthias Ringwald (uint8_t *) gatt_event_long_characteristic_value_query_result_get_value(packet)); 1944902524cSMatthias Ringwald result_counter++; 1954902524cSMatthias Ringwald break; 1964902524cSMatthias Ringwald } 1974902524cSMatthias Ringwald } 1984902524cSMatthias Ringwald 1994902524cSMatthias 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){ 2004902524cSMatthias Ringwald switch(test){ 2014902524cSMatthias Ringwald case WRITE_CHARACTERISTIC_DESCRIPTOR: 2024902524cSMatthias Ringwald case WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION: 2034902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode); 2044902524cSMatthias Ringwald CHECK_EQUAL(0, offset); 2054902524cSMatthias Ringwald CHECK_EQUAL_ARRAY(indication, buffer, 2); 2064902524cSMatthias Ringwald result_counter++; 2074902524cSMatthias Ringwald break; 2084902524cSMatthias Ringwald case WRITE_CHARACTERISTIC_VALUE: 2094902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode); 2104902524cSMatthias Ringwald CHECK_EQUAL(0, offset); 2114902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t *)short_value, buffer, short_value_length); 2124902524cSMatthias Ringwald result_counter++; 2134902524cSMatthias Ringwald break; 2144902524cSMatthias Ringwald case WRITE_LONG_CHARACTERISTIC_DESCRIPTOR: 2154902524cSMatthias Ringwald case WRITE_LONG_CHARACTERISTIC_VALUE: 2164902524cSMatthias Ringwald case WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE: 2174902524cSMatthias Ringwald if (transaction_mode == ATT_TRANSACTION_MODE_VALIDATE) break; 2184902524cSMatthias Ringwald if (transaction_mode == ATT_TRANSACTION_MODE_EXECUTE) break; 2194902524cSMatthias Ringwald CHECK_EQUAL(ATT_TRANSACTION_MODE_ACTIVE, transaction_mode); 2204902524cSMatthias Ringwald CHECK_EQUAL_ARRAY((uint8_t *)&long_value[offset], buffer, buffer_size); 2214902524cSMatthias Ringwald if (offset + buffer_size != sizeof(long_value)) break; 2224902524cSMatthias Ringwald result_counter++; 2234902524cSMatthias Ringwald break; 2244902524cSMatthias Ringwald default: 2254902524cSMatthias Ringwald break; 2264902524cSMatthias Ringwald } 2274902524cSMatthias Ringwald return 0; 2284902524cSMatthias Ringwald } 2294902524cSMatthias Ringwald 2304902524cSMatthias Ringwald int copy_bytes(uint8_t * value, uint16_t value_length, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ 2314902524cSMatthias Ringwald int blob_length = value_length - offset; 2324902524cSMatthias Ringwald if (blob_length >= buffer_size) blob_length = buffer_size; 2334902524cSMatthias Ringwald 2344902524cSMatthias Ringwald memcpy(buffer, &value[offset], blob_length); 2354902524cSMatthias Ringwald return blob_length; 2364902524cSMatthias Ringwald } 2374902524cSMatthias Ringwald 2384902524cSMatthias 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){ 2394902524cSMatthias 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); 2404902524cSMatthias Ringwald switch(test){ 2414902524cSMatthias Ringwald case READ_CHARACTERISTIC_DESCRIPTOR: 2424902524cSMatthias Ringwald case READ_CHARACTERISTIC_VALUE: 2434902524cSMatthias Ringwald result_counter++; 2444902524cSMatthias Ringwald if (buffer){ 2454902524cSMatthias Ringwald return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size); 2464902524cSMatthias Ringwald } 2474902524cSMatthias Ringwald return short_value_length; 2484902524cSMatthias Ringwald case READ_LONG_CHARACTERISTIC_DESCRIPTOR: 2494902524cSMatthias Ringwald case READ_LONG_CHARACTERISTIC_VALUE: 2504902524cSMatthias Ringwald result_counter++; 2514902524cSMatthias Ringwald if (buffer) { 2524902524cSMatthias Ringwald return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size); 2534902524cSMatthias Ringwald } 2544902524cSMatthias Ringwald return long_value_length; 2554902524cSMatthias Ringwald default: 2564902524cSMatthias Ringwald break; 2574902524cSMatthias Ringwald } 2584902524cSMatthias Ringwald return 0; 2594902524cSMatthias Ringwald } 2604902524cSMatthias Ringwald 2614902524cSMatthias Ringwald // static const char * decode_status(uint8_t status){ 2624902524cSMatthias Ringwald // switch (status){ 2634902524cSMatthias Ringwald // case 0: return "0"; 2644902524cSMatthias Ringwald // case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE"; 2654902524cSMatthias Ringwald // case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS"; 2664902524cSMatthias Ringwald // case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED"; 2674902524cSMatthias Ringwald // case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG"; 2684902524cSMatthias Ringwald // case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY"; 2694902524cSMatthias Ringwald // case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED"; 2704902524cSMatthias Ringwald // case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED"; 2714902524cSMatthias Ringwald // } 2724902524cSMatthias Ringwald // } 2734902524cSMatthias Ringwald 2744902524cSMatthias Ringwald TEST_GROUP(GATTClient){ 2754902524cSMatthias Ringwald int acl_buffer_size; 2764902524cSMatthias Ringwald uint8_t acl_buffer[27]; 2774902524cSMatthias Ringwald uint8_t status; 2784902524cSMatthias Ringwald 2794902524cSMatthias Ringwald void setup(void){ 2804902524cSMatthias Ringwald result_counter = 0; 2814902524cSMatthias Ringwald result_index = 0; 2824902524cSMatthias Ringwald test = IDLE; 2838404d3b7SMilanka Ringwald hci_setup_le_connection(gatt_client_handle); 284*61027ef7SMatthias Ringwald memset(characteristics, 0, sizeof(characteristics)); 285*61027ef7SMatthias Ringwald memset(descriptors, 0, sizeof(descriptors)); 2864902524cSMatthias Ringwald } 2874902524cSMatthias Ringwald 28840faeb84SMilanka Ringwald gatt_client_t * get_gatt_client(hci_con_handle_t con_handle){ 28940faeb84SMilanka Ringwald gatt_client_t * gatt_client; 29040faeb84SMilanka Ringwald (void) gatt_client_get_client(gatt_client_handle, &gatt_client); 29140faeb84SMilanka Ringwald return gatt_client; 29240faeb84SMilanka Ringwald } 29340faeb84SMilanka Ringwald 2944902524cSMatthias Ringwald void reset_query_state(void){ 29540faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 296ad3bb416SMatthias Ringwald gatt_client->state = P_READY; 29740faeb84SMilanka Ringwald 298a382a4adSMilanka Ringwald gatt_client_set_required_security_level(LEVEL_0); 299a382a4adSMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(1); 3008404d3b7SMilanka Ringwald 3014902524cSMatthias Ringwald gatt_query_complete = 0; 3024902524cSMatthias Ringwald result_counter = 0; 3034902524cSMatthias Ringwald result_index = 0; 3044902524cSMatthias Ringwald } 3058404d3b7SMilanka Ringwald 3068404d3b7SMilanka Ringwald void set_wrong_gatt_client_state(void){ 30740faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 3088404d3b7SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 309ad3bb416SMatthias Ringwald gatt_client->state = P_W2_SEND_SERVICE_QUERY; 3108404d3b7SMilanka Ringwald } 3114902524cSMatthias Ringwald }; 3124902524cSMatthias Ringwald 313a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_setters){ 314a382a4adSMilanka Ringwald gatt_client_set_required_security_level(LEVEL_4); 315a382a4adSMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(0); 316a382a4adSMilanka Ringwald } 3174902524cSMatthias Ringwald 318617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_is_ready_mtu_exchange_disabled){ 319617a2595SMilanka Ringwald gatt_client_mtu_enable_auto_negotiation(0); 320617a2595SMilanka Ringwald int status = gatt_client_is_ready(gatt_client_handle); 321617a2595SMilanka Ringwald CHECK_EQUAL(1, status); 322617a2595SMilanka Ringwald } 323617a2595SMilanka Ringwald 3244902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){ 3254902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICES; 3268404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 32740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 3288404d3b7SMilanka Ringwald 3298404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 3308404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3318404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 3328404d3b7SMilanka Ringwald 3334902524cSMatthias Ringwald reset_query_state(); 3344902524cSMatthias Ringwald status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); 3354902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3364902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3374902524cSMatthias Ringwald verify_primary_services(); 3384902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3394902524cSMatthias Ringwald } 3404902524cSMatthias Ringwald 3414902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){ 3424902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16; 3434902524cSMatthias Ringwald reset_query_state(); 3444902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3454902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3464902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3474902524cSMatthias Ringwald verify_primary_services_with_uuid16(); 3484902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3494902524cSMatthias Ringwald } 3504902524cSMatthias Ringwald 3514902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){ 3524902524cSMatthias Ringwald test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128; 3534902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3544902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3554902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 3564902524cSMatthias Ringwald verify_primary_services_with_uuid128(); 3574902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 358a382a4adSMilanka Ringwald 359a382a4adSMilanka Ringwald // invalid con handle 360a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, primary_service_uuid128); 36140faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 362a382a4adSMilanka Ringwald 363a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 364a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 365a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 3664902524cSMatthias Ringwald } 3674902524cSMatthias Ringwald 3684902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){ 3694902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16; 3704902524cSMatthias Ringwald reset_query_state(); 3714902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 3724902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3734902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3744902524cSMatthias Ringwald 3754902524cSMatthias Ringwald reset_query_state(); 3764902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 3774902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3784902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3794902524cSMatthias Ringwald verify_included_services_uuid16(); 3804902524cSMatthias Ringwald } 3814902524cSMatthias Ringwald 3824902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){ 3834902524cSMatthias Ringwald test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128; 3844902524cSMatthias Ringwald reset_query_state(); 3854902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 3864902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3874902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3884902524cSMatthias Ringwald 3894902524cSMatthias Ringwald reset_query_state(); 3904902524cSMatthias Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 3914902524cSMatthias Ringwald CHECK_EQUAL(0, status); 3924902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 3934902524cSMatthias Ringwald verify_included_services_uuid128(); 394a382a4adSMilanka Ringwald 395a382a4adSMilanka Ringwald // invalid con handle 396a382a4adSMilanka Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); 39740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 398a382a4adSMilanka Ringwald 399a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 400a382a4adSMilanka Ringwald status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 401a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4024902524cSMatthias Ringwald } 4034902524cSMatthias Ringwald 4044902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){ 4054902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16; 4064902524cSMatthias Ringwald reset_query_state(); 4074902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4084902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4094902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4104902524cSMatthias Ringwald 4114902524cSMatthias Ringwald reset_query_state(); 4124902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 4134902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4144902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4154902524cSMatthias Ringwald verify_charasteristics(); 416a382a4adSMilanka Ringwald 417a382a4adSMilanka Ringwald // invalid con handle 418a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); 41940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 420a382a4adSMilanka Ringwald 421a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 422a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 423a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4244902524cSMatthias Ringwald } 4254902524cSMatthias Ringwald 4264902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){ 4274902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID16; 4284902524cSMatthias Ringwald reset_query_state(); 4294902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 4304902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4314902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4324902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 433a382a4adSMilanka Ringwald 434a382a4adSMilanka Ringwald // invalid con handle 435a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 0x30, 0x32, 0xF102); 43640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 437a382a4adSMilanka Ringwald 438a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 439a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); 440a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4414902524cSMatthias Ringwald } 4424902524cSMatthias Ringwald 4434902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){ 4444902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_BY_UUID128; 4454902524cSMatthias Ringwald reset_query_state(); 4464902524cSMatthias 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]); 4474902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4484902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4494902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 450a382a4adSMilanka Ringwald 451a382a4adSMilanka Ringwald // invalid con handle 452a382a4adSMilanka 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]); 45340faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 454a382a4adSMilanka Ringwald 455a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 456a382a4adSMilanka 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]); 457a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 4584902524cSMatthias Ringwald } 4594902524cSMatthias Ringwald 4604902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){ 4614902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4624902524cSMatthias Ringwald reset_query_state(); 4634902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 4644902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4654902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4664902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4674902524cSMatthias Ringwald 4684902524cSMatthias Ringwald reset_query_state(); 4694902524cSMatthias Ringwald uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 4704902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 4714902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4724902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4734902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4744902524cSMatthias Ringwald 4754902524cSMatthias Ringwald reset_query_state(); 4764902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 4774902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4784902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4794902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4804902524cSMatthias Ringwald } 4814902524cSMatthias Ringwald 4824902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){ 4834902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; 4844902524cSMatthias Ringwald reset_query_state(); 4854902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 4864902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4874902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4884902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4894902524cSMatthias Ringwald 4904902524cSMatthias Ringwald reset_query_state(); 4914902524cSMatthias Ringwald uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; 4924902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); 4934902524cSMatthias Ringwald CHECK_EQUAL(0, status); 4944902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 4954902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 4964902524cSMatthias Ringwald 4974902524cSMatthias Ringwald reset_query_state(); 4984902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 4994902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5004902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5014902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5024902524cSMatthias Ringwald } 5034902524cSMatthias Ringwald 5044902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){ 5054902524cSMatthias Ringwald test = DISCOVER_CHARACTERISTIC_DESCRIPTORS; 5068404d3b7SMilanka Ringwald 5078404d3b7SMilanka Ringwald reset_query_state(); 5088404d3b7SMilanka Ringwald // invalid con handle 5098404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16); 51040faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 5118404d3b7SMilanka Ringwald 5128404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 5138404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 5148404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5158404d3b7SMilanka Ringwald 5164902524cSMatthias Ringwald reset_query_state(); 5174902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 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 reset_query_state(); 5234902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5244902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5254902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5264902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5274902524cSMatthias Ringwald 5284902524cSMatthias Ringwald reset_query_state(); 5294902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 5304902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5314902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5324902524cSMatthias Ringwald CHECK(result_counter); 5334902524cSMatthias Ringwald CHECK_EQUAL(3, result_index); 5344902524cSMatthias Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 5354902524cSMatthias Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 5364902524cSMatthias Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 5374902524cSMatthias Ringwald } 5384902524cSMatthias Ringwald 5394902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){ 5404902524cSMatthias Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 5414902524cSMatthias Ringwald reset_query_state(); 5424902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 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_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 5494902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5504902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5514902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5524902524cSMatthias Ringwald 5538404d3b7SMilanka Ringwald // invalid con handle 5548404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 55540faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 5568404d3b7SMilanka Ringwald 5578404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 5588404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5598404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 5608404d3b7SMilanka Ringwald 5614902524cSMatthias Ringwald reset_query_state(); 5624902524cSMatthias Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5634902524cSMatthias Ringwald CHECK_EQUAL(0, status); 5644902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 5654902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 5668404d3b7SMilanka Ringwald 5678404d3b7SMilanka Ringwald reset_query_state(); 5688404d3b7SMilanka Ringwald characteristics->properties = 0; 5698404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); 5708404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status); 5718404d3b7SMilanka Ringwald 5728404d3b7SMilanka Ringwald reset_query_state(); 5738404d3b7SMilanka Ringwald characteristics->properties = 0; 5748404d3b7SMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); 5758404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status); 576369697acSMilanka Ringwald 577369697acSMilanka Ringwald reset_query_state(); 578369697acSMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], 10); 579369697acSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE, status); 580369697acSMilanka Ringwald } 581369697acSMilanka Ringwald 582369697acSMilanka Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfigurationNone){ 583369697acSMilanka Ringwald reset_query_state(); 584369697acSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 585369697acSMilanka Ringwald CHECK_EQUAL(0, status); 586369697acSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 587369697acSMilanka Ringwald CHECK_EQUAL(1, result_counter); 588369697acSMilanka Ringwald 589369697acSMilanka Ringwald reset_query_state(); 590369697acSMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE); 591369697acSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 592369697acSMilanka Ringwald } 593369697acSMilanka Ringwald 594369697acSMilanka Ringwald TEST(GATTClient, TestWriteNonexistingClientCharacteristicConfiguration){ 595369697acSMilanka Ringwald test = WRITE_NONEXISTING_CLIENT_CHARACTERISTIC_CONFIGURATION; 596369697acSMilanka Ringwald reset_query_state(); 597369697acSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 598369697acSMilanka Ringwald CHECK_EQUAL(0, status); 599369697acSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 600369697acSMilanka Ringwald CHECK_EQUAL(1, result_counter); 601369697acSMilanka Ringwald 602369697acSMilanka Ringwald reset_query_state(); 603369697acSMilanka Ringwald characteristics->properties = ATT_PROPERTY_INDICATE; 604369697acSMilanka Ringwald status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); 605369697acSMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 6064902524cSMatthias Ringwald } 6074902524cSMatthias Ringwald 6084902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){ 6094902524cSMatthias Ringwald test = READ_CHARACTERISTIC_DESCRIPTOR; 6104902524cSMatthias Ringwald reset_query_state(); 6114902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 6124902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6134902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6144902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6154902524cSMatthias Ringwald 6164902524cSMatthias Ringwald reset_query_state(); 6174902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 6184902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6194902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6204902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 6214902524cSMatthias Ringwald 6224902524cSMatthias Ringwald reset_query_state(); 6234902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 6244902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6254902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6264902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6274902524cSMatthias Ringwald 628a382a4adSMilanka Ringwald // invalid con handle 629a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0]); 63040faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 631a382a4adSMilanka Ringwald 632a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 633a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 634a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 635a382a4adSMilanka Ringwald 636a382a4adSMilanka Ringwald reset_query_state(); 637a382a4adSMilanka Ringwald uint16_t end_handle = characteristics[0].end_handle; 638a382a4adSMilanka Ringwald characteristics[0].end_handle = characteristics[0].value_handle; 639a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 640a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 641a382a4adSMilanka Ringwald characteristics[0].end_handle = end_handle; 642a382a4adSMilanka Ringwald 6434902524cSMatthias Ringwald reset_query_state(); 6444902524cSMatthias Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6454902524cSMatthias Ringwald CHECK_EQUAL(0, status); 6464902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 6474902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 6488404d3b7SMilanka Ringwald 6498404d3b7SMilanka Ringwald // invalid con handle 6508404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]); 65140faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 6528404d3b7SMilanka Ringwald 6538404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 6548404d3b7SMilanka Ringwald status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 6558404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 6564902524cSMatthias Ringwald } 6574902524cSMatthias Ringwald 658a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristic_using_value_handle){ 659a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 660a382a4adSMilanka Ringwald reset_query_state(); 661a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 662a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 663a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 664a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 665a382a4adSMilanka Ringwald 666a382a4adSMilanka Ringwald reset_query_state(); 667a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 668a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 669a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 670a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 671a382a4adSMilanka Ringwald 672a382a4adSMilanka Ringwald // invalid con handle 673a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle); 67440faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 675a382a4adSMilanka Ringwald 676a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 677a382a4adSMilanka Ringwald status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle); 678a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 679a382a4adSMilanka Ringwald reset_query_state(); 680a382a4adSMilanka Ringwald } 681a382a4adSMilanka Ringwald 682a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset){ 683a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 684a382a4adSMilanka Ringwald reset_query_state(); 685a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 686a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 687a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 688a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 689a382a4adSMilanka Ringwald 690a382a4adSMilanka Ringwald reset_query_state(); 691a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 692a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 693a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 694a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 695a382a4adSMilanka Ringwald 696a382a4adSMilanka Ringwald // invalid con handle 697a382a4adSMilanka 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); 69840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 699a382a4adSMilanka Ringwald 700a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 701a382a4adSMilanka 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); 702a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 703a382a4adSMilanka Ringwald reset_query_state(); 704a382a4adSMilanka Ringwald } 705a382a4adSMilanka Ringwald 706a382a4adSMilanka Ringwald 707a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid16){ 708a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 709a382a4adSMilanka Ringwald reset_query_state(); 710a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 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 reset_query_state(); 716a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 717a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 718a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 719a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 720a382a4adSMilanka Ringwald 721a382a4adSMilanka Ringwald reset_query_state(); 722a382a4adSMilanka 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); 723a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 724a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 725a382a4adSMilanka Ringwald 726a382a4adSMilanka Ringwald // invalid con handle 727a382a4adSMilanka 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); 72840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 729a382a4adSMilanka Ringwald 730a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 731a382a4adSMilanka 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); 732a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 733a382a4adSMilanka Ringwald reset_query_state(); 734a382a4adSMilanka Ringwald } 735a382a4adSMilanka Ringwald 736a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid128){ 737a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 738a382a4adSMilanka Ringwald reset_query_state(); 739a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 740a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 741a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 742a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 743a382a4adSMilanka Ringwald 744a382a4adSMilanka Ringwald reset_query_state(); 745a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 746a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 747a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 748a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 749a382a4adSMilanka Ringwald 750a382a4adSMilanka Ringwald reset_query_state(); 751a382a4adSMilanka 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); 752a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 753a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 754a382a4adSMilanka Ringwald 755a382a4adSMilanka Ringwald // invalid con handle 756a382a4adSMilanka 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); 75740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 758a382a4adSMilanka Ringwald 759a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 760a382a4adSMilanka 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); 761a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 762a382a4adSMilanka Ringwald reset_query_state(); 763a382a4adSMilanka Ringwald } 764a382a4adSMilanka Ringwald 765a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_write_characteristic_descriptor_using_descriptor_handle){ 766a382a4adSMilanka Ringwald test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; 767a382a4adSMilanka Ringwald reset_query_state(); 768a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 769a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 770a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 771a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 772a382a4adSMilanka Ringwald 773a382a4adSMilanka Ringwald reset_query_state(); 774a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 775a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 776a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 777a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 778a382a4adSMilanka Ringwald 779a382a4adSMilanka Ringwald 780a382a4adSMilanka Ringwald reset_query_state(); 781a382a4adSMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 782a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 783a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 784a382a4adSMilanka Ringwald CHECK_EQUAL(3, result_counter); 785a382a4adSMilanka Ringwald 786a382a4adSMilanka Ringwald reset_query_state(); 787a382a4adSMilanka 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); 788a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 789a382a4adSMilanka Ringwald 790a382a4adSMilanka Ringwald // invalid con handle 791a382a4adSMilanka 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); 79240faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 793a382a4adSMilanka Ringwald 794a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 795a382a4adSMilanka 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); 796a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 797a382a4adSMilanka Ringwald reset_query_state(); 798a382a4adSMilanka Ringwald } 799a382a4adSMilanka Ringwald 800a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_prepare_write){ 801a382a4adSMilanka Ringwald reset_query_state(); 802a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 803a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 804a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 805a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 806a382a4adSMilanka Ringwald 807a382a4adSMilanka Ringwald reset_query_state(); 808a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 809a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 810a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 811a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 812a382a4adSMilanka Ringwald 813a382a4adSMilanka Ringwald reset_query_state(); 814a382a4adSMilanka 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); 815a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 816a382a4adSMilanka Ringwald 817a382a4adSMilanka Ringwald // invalid con handle 818a382a4adSMilanka 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); 81940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 820a382a4adSMilanka Ringwald 821a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 822a382a4adSMilanka 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); 823a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 824a382a4adSMilanka Ringwald reset_query_state(); 825a382a4adSMilanka Ringwald } 826a382a4adSMilanka Ringwald 827a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_execute_write){ 828a382a4adSMilanka Ringwald reset_query_state(); 829a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); 830a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 831a382a4adSMilanka Ringwald 832a382a4adSMilanka Ringwald // invalid con handle 833a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 83440faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 835a382a4adSMilanka Ringwald 836a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 837a382a4adSMilanka Ringwald status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); 838a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 839a382a4adSMilanka Ringwald reset_query_state(); 840a382a4adSMilanka Ringwald } 841a382a4adSMilanka Ringwald 842a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_cancel_write){ 843a382a4adSMilanka Ringwald reset_query_state(); 844a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); 845a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 846a382a4adSMilanka Ringwald 847a382a4adSMilanka Ringwald // invalid con handle 848a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 84940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 850a382a4adSMilanka Ringwald 851a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 852a382a4adSMilanka Ringwald status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); 853a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 854a382a4adSMilanka Ringwald reset_query_state(); 855a382a4adSMilanka Ringwald } 856a382a4adSMilanka Ringwald 8574902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){ 8584902524cSMatthias Ringwald test = READ_CHARACTERISTIC_VALUE; 8594902524cSMatthias Ringwald reset_query_state(); 8604902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 8614902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8624902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8634902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8644902524cSMatthias Ringwald 8654902524cSMatthias Ringwald reset_query_state(); 8664902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 8674902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8684902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8694902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8704902524cSMatthias Ringwald 8714902524cSMatthias Ringwald reset_query_state(); 8724902524cSMatthias Ringwald status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 8734902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8744902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8754902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 8764902524cSMatthias Ringwald } 8774902524cSMatthias Ringwald 8784902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){ 8794902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_VALUE; 8804902524cSMatthias Ringwald reset_query_state(); 8814902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 8824902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8834902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8844902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8854902524cSMatthias Ringwald 8864902524cSMatthias Ringwald reset_query_state(); 8874902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 8884902524cSMatthias Ringwald CHECK_EQUAL(0, status); 8894902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 8904902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 8914902524cSMatthias Ringwald 8928404d3b7SMilanka Ringwald // invalid con handle 8938404d3b7SMilanka 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); 89440faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 8958404d3b7SMilanka Ringwald 8968404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 8978404d3b7SMilanka 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); 8988404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 8998404d3b7SMilanka Ringwald 9008404d3b7SMilanka Ringwald 9014902524cSMatthias Ringwald reset_query_state(); 9024902524cSMatthias 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); 9034902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9044902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9054902524cSMatthias Ringwald } 9064902524cSMatthias Ringwald 9074902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){ 9084902524cSMatthias Ringwald test = WRITE_CHARACTERISTIC_DESCRIPTOR; 9094902524cSMatthias Ringwald reset_query_state(); 9104902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9114902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9124902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9134902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9144902524cSMatthias Ringwald 9154902524cSMatthias Ringwald reset_query_state(); 9164902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 9174902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9184902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9194902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9204902524cSMatthias Ringwald 9214902524cSMatthias Ringwald reset_query_state(); 9224902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9234902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9244902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9254902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9264902524cSMatthias Ringwald 9274902524cSMatthias Ringwald reset_query_state(); 9284902524cSMatthias Ringwald status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication); 9294902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9304902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9314902524cSMatthias Ringwald } 9324902524cSMatthias Ringwald 9334902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){ 9344902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_VALUE; 9354902524cSMatthias Ringwald reset_query_state(); 9364902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 9374902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9384902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9394902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9404902524cSMatthias Ringwald 9414902524cSMatthias Ringwald reset_query_state(); 9424902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 9434902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9444902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9454902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9464902524cSMatthias Ringwald 9474902524cSMatthias Ringwald reset_query_state(); 9484902524cSMatthias Ringwald status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9494902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9504902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9518404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 9524902524cSMatthias Ringwald } 9534902524cSMatthias Ringwald 9544902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){ 9554902524cSMatthias Ringwald test = READ_LONG_CHARACTERISTIC_DESCRIPTOR; 9564902524cSMatthias Ringwald reset_query_state(); 9574902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 9584902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9594902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9604902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9614902524cSMatthias Ringwald 9624902524cSMatthias Ringwald reset_query_state(); 9634902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 9644902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9654902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9664902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9674902524cSMatthias Ringwald 9684902524cSMatthias Ringwald reset_query_state(); 9694902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9704902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9714902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9724902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 9734902524cSMatthias Ringwald 9744902524cSMatthias Ringwald reset_query_state(); 9754902524cSMatthias Ringwald result_counter = 0; 9764902524cSMatthias Ringwald status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); 9774902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9784902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9798404d3b7SMilanka Ringwald CHECK_EQUAL(4, result_counter); 9804902524cSMatthias Ringwald } 9814902524cSMatthias Ringwald 9824902524cSMatthias Ringwald 9834902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){ 9844902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR; 9854902524cSMatthias Ringwald reset_query_state(); 9864902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); 9874902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9884902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9894902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9904902524cSMatthias Ringwald 9914902524cSMatthias Ringwald reset_query_state(); 9924902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); 9934902524cSMatthias Ringwald CHECK_EQUAL(0, status); 9944902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 9954902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 9964902524cSMatthias Ringwald 9974902524cSMatthias Ringwald reset_query_state(); 9984902524cSMatthias Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 9994902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10004902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10014902524cSMatthias Ringwald CHECK_EQUAL(3, result_counter); 10024902524cSMatthias Ringwald 10034902524cSMatthias Ringwald result_counter = 0; 10044902524cSMatthias Ringwald status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value); 10054902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10064902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10074902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10084902524cSMatthias Ringwald } 10094902524cSMatthias Ringwald 10104902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){ 10114902524cSMatthias Ringwald test = WRITE_LONG_CHARACTERISTIC_VALUE; 10124902524cSMatthias Ringwald reset_query_state(); 10134902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10144902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10154902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10164902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10174902524cSMatthias Ringwald 10184902524cSMatthias Ringwald reset_query_state(); 10194902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10204902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10214902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10224902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10234902524cSMatthias Ringwald 10244902524cSMatthias Ringwald 10254902524cSMatthias Ringwald reset_query_state(); 10264902524cSMatthias 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); 10274902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10284902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10294902524cSMatthias Ringwald } 10304902524cSMatthias Ringwald 10314902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){ 10324902524cSMatthias Ringwald test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE; 10334902524cSMatthias Ringwald reset_query_state(); 10344902524cSMatthias Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10354902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10364902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10374902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10384902524cSMatthias Ringwald 10394902524cSMatthias Ringwald reset_query_state(); 10404902524cSMatthias Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10414902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10424902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10434902524cSMatthias Ringwald CHECK_EQUAL(1, result_counter); 10444902524cSMatthias Ringwald 10458404d3b7SMilanka Ringwald // invalid con handle 10468404d3b7SMilanka 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); 104740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 10488404d3b7SMilanka Ringwald 10498404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 10508404d3b7SMilanka 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); 10518404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 10528404d3b7SMilanka Ringwald 10534902524cSMatthias Ringwald reset_query_state(); 10544902524cSMatthias 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); 10554902524cSMatthias Ringwald CHECK_EQUAL(0, status); 10564902524cSMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 10574902524cSMatthias Ringwald } 10584902524cSMatthias Ringwald 10598404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){ 10608404d3b7SMilanka Ringwald reset_query_state(); 10618404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10628404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10638404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10648404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10658404d3b7SMilanka Ringwald 10668404d3b7SMilanka Ringwald reset_query_state(); 10678404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 10688404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10698404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10708404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10718404d3b7SMilanka Ringwald 10728404d3b7SMilanka Ringwald reset_query_state(); 10738404d3b7SMilanka 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); 10748404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10758404d3b7SMilanka Ringwald 10768404d3b7SMilanka Ringwald reset_query_state(); 10778404d3b7SMilanka Ringwald // invalid con handle 10788404d3b7SMilanka 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); 107940faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 10808404d3b7SMilanka Ringwald 10818404d3b7SMilanka Ringwald reset_query_state(); 10828404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 10838404d3b7SMilanka 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); 10848404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 10858404d3b7SMilanka Ringwald } 10868404d3b7SMilanka Ringwald 10878404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){ 10888404d3b7SMilanka Ringwald reset_query_state(); 10898404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 10908404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 10918404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 10928404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 10938404d3b7SMilanka Ringwald 1094472021f2SMatthias Ringwald reset_query_state(); 1095472021f2SMatthias Ringwald status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); 1096472021f2SMatthias Ringwald CHECK_EQUAL(0, status); 1097472021f2SMatthias Ringwald CHECK_EQUAL(1, gatt_query_complete); 1098472021f2SMatthias Ringwald verify_charasteristics(); 1099472021f2SMatthias Ringwald 11008404d3b7SMilanka Ringwald reset_query_state(); 11018404d3b7SMilanka Ringwald status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); 11028404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11038404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1104*61027ef7SMatthias Ringwald CHECK(result_counter != 0); 11058404d3b7SMilanka Ringwald CHECK_EQUAL(3, result_index); 11068404d3b7SMilanka Ringwald CHECK_EQUAL(0x2902, descriptors[0].uuid16); 11078404d3b7SMilanka Ringwald CHECK_EQUAL(0x2900, descriptors[1].uuid16); 11088404d3b7SMilanka Ringwald CHECK_EQUAL(0x2901, descriptors[2].uuid16); 11098404d3b7SMilanka Ringwald 11108404d3b7SMilanka Ringwald reset_query_state(); 11118404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 11128404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11138404d3b7SMilanka Ringwald 11148404d3b7SMilanka Ringwald reset_query_state(); 11158404d3b7SMilanka Ringwald // invalid con handle 11168404d3b7SMilanka 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); 111740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 11188404d3b7SMilanka Ringwald 11198404d3b7SMilanka Ringwald reset_query_state(); 11208404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11218404d3b7SMilanka Ringwald status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); 11228404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 11238404d3b7SMilanka Ringwald } 11248404d3b7SMilanka Ringwald 11258404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){ 11268404d3b7SMilanka Ringwald reset_query_state(); 11278404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 11288404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11298404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11308404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11318404d3b7SMilanka Ringwald 11328404d3b7SMilanka Ringwald reset_query_state(); 11338404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 11348404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11358404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11368404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11378404d3b7SMilanka Ringwald 11388404d3b7SMilanka Ringwald uint16_t value_handles[] = {characteristics[0].value_handle}; 11398404d3b7SMilanka Ringwald 11408404d3b7SMilanka Ringwald reset_query_state(); 11418404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 11428404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11438404d3b7SMilanka Ringwald 11448404d3b7SMilanka Ringwald reset_query_state(); 11458404d3b7SMilanka Ringwald // invalid con handle 11468404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles); 114740faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 11488404d3b7SMilanka Ringwald 11498404d3b7SMilanka Ringwald reset_query_state(); 11508404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11518404d3b7SMilanka Ringwald status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); 11528404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 11538404d3b7SMilanka Ringwald } 11548404d3b7SMilanka Ringwald 11558404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){ 11568404d3b7SMilanka Ringwald reset_query_state(); 11578404d3b7SMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 11588404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11598404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11608404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11618404d3b7SMilanka Ringwald 11628404d3b7SMilanka Ringwald reset_query_state(); 11638404d3b7SMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 11648404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11658404d3b7SMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 11668404d3b7SMilanka Ringwald CHECK_EQUAL(1, result_counter); 11678404d3b7SMilanka Ringwald 11688404d3b7SMilanka Ringwald reset_query_state(); 11698404d3b7SMilanka Ringwald // invalid con handle 11708404d3b7SMilanka 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); 117140faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 11728404d3b7SMilanka Ringwald 11738404d3b7SMilanka Ringwald reset_query_state(); 11748404d3b7SMilanka Ringwald set_wrong_gatt_client_state(); 11758404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); 11768404d3b7SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status); 11778404d3b7SMilanka Ringwald 11788404d3b7SMilanka Ringwald reset_query_state(); 11798404d3b7SMilanka Ringwald 11808404d3b7SMilanka Ringwald status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value); 11818404d3b7SMilanka Ringwald CHECK_EQUAL(0, status); 11828404d3b7SMilanka Ringwald } 11834902524cSMatthias Ringwald 1184a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_is_ready){ 1185a382a4adSMilanka Ringwald int status = gatt_client_is_ready(HCI_CON_HANDLE_INVALID); 1186a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1187a382a4adSMilanka Ringwald 1188a382a4adSMilanka Ringwald status = gatt_client_is_ready(gatt_client_handle); 1189a382a4adSMilanka Ringwald CHECK_EQUAL(1, status); 1190a382a4adSMilanka Ringwald } 1191a382a4adSMilanka Ringwald 1192a382a4adSMilanka Ringwald 1193a382a4adSMilanka Ringwald TEST(GATTClient, register_for_notification){ 1194a382a4adSMilanka Ringwald reset_query_state(); 1195a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 1196a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1197a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1198a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1199a382a4adSMilanka Ringwald 1200a382a4adSMilanka Ringwald reset_query_state(); 1201a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 1202a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1203a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1204a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1205a382a4adSMilanka Ringwald 1206a382a4adSMilanka Ringwald gatt_client_notification_t notification; 1207a382a4adSMilanka Ringwald 1208a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, &characteristics[0]); 1209a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1210a382a4adSMilanka Ringwald 1211a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, NULL); 1212a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1213a382a4adSMilanka Ringwald } 1214a382a4adSMilanka Ringwald 1215a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_signed_write_without_response){ 1216a382a4adSMilanka Ringwald reset_query_state(); 1217a382a4adSMilanka Ringwald status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); 1218a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1219a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1220a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1221a382a4adSMilanka Ringwald 1222a382a4adSMilanka Ringwald reset_query_state(); 1223a382a4adSMilanka Ringwald status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); 1224a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1225a382a4adSMilanka Ringwald CHECK_EQUAL(1, gatt_query_complete); 1226a382a4adSMilanka Ringwald CHECK_EQUAL(1, result_counter); 1227a382a4adSMilanka Ringwald 1228a382a4adSMilanka Ringwald reset_query_state(); 1229a382a4adSMilanka Ringwald // invalid con handle 1230a382a4adSMilanka 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); 123140faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1232a382a4adSMilanka Ringwald 1233a382a4adSMilanka Ringwald reset_query_state(); 1234a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 1235a382a4adSMilanka 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); 1236a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1237a382a4adSMilanka Ringwald 1238a382a4adSMilanka Ringwald reset_query_state(); 1239a382a4adSMilanka Ringwald 1240a382a4adSMilanka 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); 1241a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1242a382a4adSMilanka Ringwald } 1243a382a4adSMilanka Ringwald 1244a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_discover_secondary_services){ 1245a382a4adSMilanka Ringwald reset_query_state(); 1246a382a4adSMilanka Ringwald // invalid con handle 1247a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 124840faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1249a382a4adSMilanka Ringwald 1250a382a4adSMilanka Ringwald reset_query_state(); 1251a382a4adSMilanka Ringwald set_wrong_gatt_client_state(); 1252a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); 1253a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1254a382a4adSMilanka Ringwald 1255a382a4adSMilanka Ringwald reset_query_state(); 1256a382a4adSMilanka Ringwald 1257a382a4adSMilanka Ringwald status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); 1258a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1259a382a4adSMilanka Ringwald } 1260a382a4adSMilanka Ringwald 1261617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_request_can_write_without_response_event){ 12627e4c9b5dSMatthias Ringwald uint8_t status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 126340faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1264a382a4adSMilanka Ringwald 126540faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 1266617a2595SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 12677e4c9b5dSMatthias Ringwald gatt_client->write_without_response_callback = handle_ble_client_event; 1268617a2595SMilanka Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 1269617a2595SMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1270617a2595SMilanka Ringwald 1271617a2595SMilanka Ringwald gatt_client->write_without_response_callback = NULL; 1272617a2595SMilanka Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 1273617a2595SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 1274617a2595SMilanka Ringwald } 1275617a2595SMilanka Ringwald 12767e4c9b5dSMatthias Ringwald TEST(GATTClient, gatt_client_request_to_write_without_response){ 12777e4c9b5dSMatthias Ringwald btstack_context_callback_registration_t callback_registration = { 0 }; 12787e4c9b5dSMatthias Ringwald uint8_t status = gatt_client_request_to_write_without_response(&callback_registration, HCI_CON_HANDLE_INVALID); 12797e4c9b5dSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 12807e4c9b5dSMatthias Ringwald 12817e4c9b5dSMatthias Ringwald status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); 12827e4c9b5dSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 12837e4c9b5dSMatthias Ringwald } 12847e4c9b5dSMatthias Ringwald 12855fe445cbSMatthias Ringwald static void dummy_callback(void * context){ 12865fe445cbSMatthias Ringwald (void) context; 12875fe445cbSMatthias Ringwald } 12885fe445cbSMatthias Ringwald TEST(GATTClient, gatt_client_request_to_send_gatt_query){ 12895fe445cbSMatthias Ringwald btstack_context_callback_registration_t callback_registration = { 0 }; 12905fe445cbSMatthias Ringwald callback_registration.callback = &dummy_callback; 12915fe445cbSMatthias Ringwald 12925fe445cbSMatthias Ringwald uint8_t status = gatt_client_request_to_send_gatt_query(&callback_registration, HCI_CON_HANDLE_INVALID); 12935fe445cbSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 12945fe445cbSMatthias Ringwald 12955fe445cbSMatthias Ringwald status = gatt_client_request_to_send_gatt_query(&callback_registration, gatt_client_handle); 12965fe445cbSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status); 12975fe445cbSMatthias Ringwald } 12985fe445cbSMatthias Ringwald 1299617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_send_mtu_negotiation){ 1300617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, HCI_CON_HANDLE_INVALID); 1301617a2595SMilanka Ringwald 1302617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); 1303617a2595SMilanka Ringwald 130440faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 1305617a2595SMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1306617a2595SMilanka Ringwald gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 1307617a2595SMilanka Ringwald gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); 1308617a2595SMilanka Ringwald 1309617a2595SMilanka Ringwald gatt_client->mtu_state = SEND_MTU_EXCHANGE; 1310617a2595SMilanka Ringwald } 1311a382a4adSMilanka Ringwald 1312a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_get_mtu){ 1313a382a4adSMilanka Ringwald reset_query_state(); 1314a382a4adSMilanka Ringwald uint16_t mtu; 1315a382a4adSMilanka Ringwald int status = gatt_client_get_mtu(HCI_CON_HANDLE_INVALID, &mtu); 131640faeb84SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); 1317a382a4adSMilanka Ringwald 1318a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1319a382a4adSMilanka Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); 1320a382a4adSMilanka Ringwald CHECK_EQUAL(ATT_DEFAULT_MTU, mtu); 1321a382a4adSMilanka Ringwald 132240faeb84SMilanka Ringwald gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); 1323a382a4adSMilanka Ringwald CHECK_TRUE(gatt_client != NULL); 1324a382a4adSMilanka Ringwald gatt_client->mtu = 30; 1325a382a4adSMilanka Ringwald 1326a382a4adSMilanka Ringwald gatt_client->mtu_state = MTU_EXCHANGED; 1327a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1328a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1329a382a4adSMilanka Ringwald CHECK_EQUAL(gatt_client->mtu, mtu); 1330a382a4adSMilanka Ringwald 1331a382a4adSMilanka Ringwald gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; 1332a382a4adSMilanka Ringwald status = gatt_client_get_mtu(gatt_client_handle, &mtu); 1333a382a4adSMilanka Ringwald CHECK_EQUAL(0, status); 1334a382a4adSMilanka Ringwald CHECK_EQUAL(gatt_client->mtu, mtu); 1335a382a4adSMilanka Ringwald 1336a382a4adSMilanka Ringwald gatt_client->mtu_state = SEND_MTU_EXCHANGE; 1337a382a4adSMilanka Ringwald } 1338a382a4adSMilanka Ringwald 1339369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_characteristic_descriptor){ 1340369697acSMilanka Ringwald gatt_client_characteristic_descriptor_t descriptor; 1341369697acSMilanka Ringwald 1342369697acSMilanka Ringwald uint8_t packet[18]; 1343369697acSMilanka Ringwald uint16_t expected_handle = 0x1234; 1344369697acSMilanka Ringwald uint16_t expected_uuid16 = 0xABCD; 1345369697acSMilanka Ringwald 1346369697acSMilanka Ringwald uint8_t uuid128[16]; 1347369697acSMilanka Ringwald uuid_add_bluetooth_prefix(uuid128, expected_uuid16); 1348369697acSMilanka Ringwald 1349369697acSMilanka Ringwald little_endian_store_16(packet, 0, expected_handle); 1350369697acSMilanka Ringwald reverse_128(uuid128, &packet[2]); 1351369697acSMilanka Ringwald 1352369697acSMilanka Ringwald // uuid16 with Bluetooth prefix 1353369697acSMilanka Ringwald gatt_client_deserialize_characteristic_descriptor(packet, 0, &descriptor); 1354369697acSMilanka Ringwald CHECK_EQUAL(descriptor.handle, expected_handle); 1355369697acSMilanka Ringwald CHECK_EQUAL(descriptor.uuid16, expected_uuid16); 1356369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, descriptor.uuid128, sizeof(uuid128)); 1357369697acSMilanka Ringwald 1358369697acSMilanka Ringwald // uuid128 1359369697acSMilanka Ringwald memset(&uuid128[4], 0xaa, 12); 1360369697acSMilanka Ringwald reverse_128(uuid128, &packet[2]); 1361369697acSMilanka Ringwald 1362369697acSMilanka Ringwald gatt_client_deserialize_characteristic_descriptor(packet, 0, &descriptor); 1363369697acSMilanka Ringwald CHECK_EQUAL(descriptor.handle, expected_handle); 1364369697acSMilanka Ringwald CHECK_EQUAL(descriptor.uuid16, 0); 1365369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, descriptor.uuid128, sizeof(uuid128)); 1366369697acSMilanka Ringwald } 1367369697acSMilanka Ringwald 1368369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_service){ 1369369697acSMilanka Ringwald gatt_client_service_t service; 1370369697acSMilanka Ringwald 1371369697acSMilanka Ringwald uint8_t packet[20]; 1372369697acSMilanka Ringwald uint16_t expected_start_group_handle = 0x1234; 1373369697acSMilanka Ringwald uint16_t expected_end_group_handle = 0x5678; 1374369697acSMilanka Ringwald uint16_t expected_uuid16 = 0xABCD; 1375369697acSMilanka Ringwald 1376369697acSMilanka Ringwald uint8_t uuid128[16]; 1377369697acSMilanka Ringwald uuid_add_bluetooth_prefix(uuid128, expected_uuid16); 1378369697acSMilanka Ringwald 1379369697acSMilanka Ringwald little_endian_store_16(packet, 0, expected_start_group_handle); 1380369697acSMilanka Ringwald little_endian_store_16(packet, 2, expected_end_group_handle); 1381369697acSMilanka Ringwald reverse_128(uuid128, &packet[4]); 1382369697acSMilanka Ringwald 1383369697acSMilanka Ringwald // uuid16 with Bluetooth prefix 1384369697acSMilanka Ringwald gatt_client_deserialize_service(packet, 0, &service); 1385369697acSMilanka Ringwald CHECK_EQUAL(service.start_group_handle, expected_start_group_handle); 1386369697acSMilanka Ringwald CHECK_EQUAL(service.end_group_handle , expected_end_group_handle); 1387369697acSMilanka Ringwald CHECK_EQUAL(service.uuid16, expected_uuid16); 1388369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, service.uuid128, sizeof(uuid128)); 1389369697acSMilanka Ringwald 1390369697acSMilanka Ringwald // uuid128 1391369697acSMilanka Ringwald memset(&uuid128[4], 0xaa, 12); 1392369697acSMilanka Ringwald reverse_128(uuid128, &packet[4]); 1393369697acSMilanka Ringwald 1394369697acSMilanka Ringwald gatt_client_deserialize_service(packet, 0, &service); 1395369697acSMilanka Ringwald CHECK_EQUAL(service.start_group_handle, expected_start_group_handle); 1396369697acSMilanka Ringwald CHECK_EQUAL(service.end_group_handle , expected_end_group_handle); 1397369697acSMilanka Ringwald CHECK_EQUAL(service.uuid16, 0); 1398369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, service.uuid128, sizeof(uuid128)); 1399369697acSMilanka Ringwald } 1400369697acSMilanka Ringwald 1401369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_characteristic){ 1402369697acSMilanka Ringwald gatt_client_characteristic_t characteristic; 1403369697acSMilanka Ringwald 1404369697acSMilanka Ringwald uint8_t packet[24]; 1405369697acSMilanka Ringwald uint16_t expected_start_handle = 0x1234; 1406369697acSMilanka Ringwald uint16_t expected_value_handle = 0x3455; 1407369697acSMilanka Ringwald uint16_t expected_end_handle = 0x5678; 1408369697acSMilanka Ringwald uint16_t expected_properties = 0x6789; 1409369697acSMilanka Ringwald 1410369697acSMilanka Ringwald uint16_t expected_uuid16 = 0xABCD; 1411369697acSMilanka Ringwald 1412369697acSMilanka Ringwald uint8_t uuid128[16]; 1413369697acSMilanka Ringwald uuid_add_bluetooth_prefix(uuid128, expected_uuid16); 1414369697acSMilanka Ringwald 1415369697acSMilanka Ringwald little_endian_store_16(packet, 0, expected_start_handle); 1416369697acSMilanka Ringwald little_endian_store_16(packet, 2, expected_value_handle); 1417369697acSMilanka Ringwald little_endian_store_16(packet, 4, expected_end_handle); 1418369697acSMilanka Ringwald little_endian_store_16(packet, 6, expected_properties); 1419369697acSMilanka Ringwald reverse_128(uuid128, &packet[8]); 1420369697acSMilanka Ringwald 1421369697acSMilanka Ringwald // uuid16 with Bluetooth prefix 1422369697acSMilanka Ringwald gatt_client_deserialize_characteristic(packet, 0, &characteristic); 1423369697acSMilanka Ringwald CHECK_EQUAL(characteristic.start_handle, expected_start_handle); 1424369697acSMilanka Ringwald CHECK_EQUAL(characteristic.value_handle, expected_value_handle); 1425369697acSMilanka Ringwald CHECK_EQUAL(characteristic.end_handle , expected_end_handle); 1426369697acSMilanka Ringwald CHECK_EQUAL(characteristic.properties , expected_properties); 1427369697acSMilanka Ringwald CHECK_EQUAL(characteristic.uuid16, expected_uuid16); 1428369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, characteristic.uuid128, sizeof(uuid128)); 1429369697acSMilanka Ringwald 1430369697acSMilanka Ringwald // uuid128 1431369697acSMilanka Ringwald memset(&uuid128[4], 0xaa, 12); 1432369697acSMilanka Ringwald reverse_128(uuid128, &packet[8]); 1433369697acSMilanka Ringwald 1434369697acSMilanka Ringwald gatt_client_deserialize_characteristic(packet, 0, &characteristic); 1435369697acSMilanka Ringwald CHECK_EQUAL(characteristic.start_handle, expected_start_handle); 1436369697acSMilanka Ringwald CHECK_EQUAL(characteristic.value_handle, expected_value_handle); 1437369697acSMilanka Ringwald CHECK_EQUAL(characteristic.end_handle , expected_end_handle); 1438369697acSMilanka Ringwald CHECK_EQUAL(characteristic.properties , expected_properties); 1439369697acSMilanka Ringwald CHECK_EQUAL(characteristic.uuid16, 0); 1440369697acSMilanka Ringwald MEMCMP_EQUAL(uuid128, characteristic.uuid128, sizeof(uuid128)); 1441369697acSMilanka Ringwald } 1442a382a4adSMilanka Ringwald 14434902524cSMatthias Ringwald int main (int argc, const char * argv[]){ 14444902524cSMatthias Ringwald att_set_db(profile_data); 14454902524cSMatthias Ringwald att_set_write_callback(&att_write_callback); 14464902524cSMatthias Ringwald att_set_read_callback(&att_read_callback); 14474902524cSMatthias Ringwald 14484902524cSMatthias Ringwald gatt_client_init(); 14494902524cSMatthias Ringwald 14504902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 14514902524cSMatthias Ringwald } 1452