xref: /btstack/test/gatt_client/gatt_client_test.cpp (revision 8404d3b7cec30a950ebf79c4b84829db914832b7)
14902524cSMatthias Ringwald 
24902524cSMatthias Ringwald // *****************************************************************************
34902524cSMatthias Ringwald //
44902524cSMatthias Ringwald // test rfcomm query tests
54902524cSMatthias Ringwald //
64902524cSMatthias Ringwald // *****************************************************************************
74902524cSMatthias Ringwald 
84902524cSMatthias Ringwald 
94902524cSMatthias Ringwald #include <stdint.h>
104902524cSMatthias Ringwald #include <stdio.h>
114902524cSMatthias Ringwald #include <stdlib.h>
124902524cSMatthias Ringwald #include <string.h>
134902524cSMatthias Ringwald 
144902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
154902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
164902524cSMatthias Ringwald 
174902524cSMatthias Ringwald #include "hci_cmd.h"
184902524cSMatthias Ringwald 
194902524cSMatthias Ringwald #include "btstack_memory.h"
204902524cSMatthias Ringwald #include "hci.h"
214902524cSMatthias Ringwald #include "hci_dump.h"
224902524cSMatthias Ringwald #include "ble/gatt_client.h"
234902524cSMatthias Ringwald #include "ble/att_db.h"
244902524cSMatthias Ringwald #include "profile.h"
254902524cSMatthias Ringwald #include "expected_results.h"
264902524cSMatthias Ringwald 
27*8404d3b7SMilanka Ringwald extern "C" void hci_setup_le_connection(uint16_t con_handle);
28*8404d3b7SMilanka Ringwald 
294902524cSMatthias Ringwald static uint16_t gatt_client_handle = 0x40;
304902524cSMatthias Ringwald static int gatt_query_complete = 0;
314902524cSMatthias Ringwald 
324902524cSMatthias Ringwald typedef enum {
334902524cSMatthias Ringwald 	IDLE,
344902524cSMatthias Ringwald 	DISCOVER_PRIMARY_SERVICES,
354902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID16,
364902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID128,
374902524cSMatthias Ringwald 
384902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16,
394902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128,
404902524cSMatthias Ringwald 
414902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16,
424902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128,
434902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID16,
444902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID128,
454902524cSMatthias Ringwald 	DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID,
464902524cSMatthias Ringwald 
474902524cSMatthias Ringwald 	READ_CHARACTERISTIC_VALUE,
484902524cSMatthias Ringwald 	READ_LONG_CHARACTERISTIC_VALUE,
494902524cSMatthias Ringwald 	WRITE_CHARACTERISTIC_VALUE,
504902524cSMatthias Ringwald 	WRITE_LONG_CHARACTERISTIC_VALUE,
514902524cSMatthias Ringwald 
524902524cSMatthias Ringwald     DISCOVER_CHARACTERISTIC_DESCRIPTORS,
534902524cSMatthias Ringwald     READ_CHARACTERISTIC_DESCRIPTOR,
544902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_DESCRIPTOR,
554902524cSMatthias Ringwald     WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION,
564902524cSMatthias Ringwald     READ_LONG_CHARACTERISTIC_DESCRIPTOR,
574902524cSMatthias Ringwald     WRITE_LONG_CHARACTERISTIC_DESCRIPTOR,
584902524cSMatthias Ringwald     WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE,
594902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE
604902524cSMatthias Ringwald } current_test_t;
614902524cSMatthias Ringwald 
624902524cSMatthias Ringwald current_test_t test = IDLE;
634902524cSMatthias Ringwald 
644902524cSMatthias Ringwald uint8_t  characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb};
654902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000;
664902524cSMatthias Ringwald 
674902524cSMatthias Ringwald static int result_index;
684902524cSMatthias Ringwald static uint8_t result_counter;
694902524cSMatthias Ringwald 
704902524cSMatthias Ringwald static gatt_client_service_t services[50];
714902524cSMatthias Ringwald static gatt_client_service_t included_services[50];
724902524cSMatthias Ringwald 
734902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50];
744902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50];
754902524cSMatthias Ringwald 
764902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void);
774902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void);
784902524cSMatthias Ringwald 
794902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
804902524cSMatthias Ringwald 	for (int i=0; i<size; i++){
814902524cSMatthias Ringwald 		BYTES_EQUAL(expected[i], actual[i]);
824902524cSMatthias Ringwald 	}
834902524cSMatthias Ringwald }
844902524cSMatthias Ringwald 
854902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) {
864902524cSMatthias Ringwald     printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
874902524cSMatthias Ringwald            uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
884902524cSMatthias Ringwald            uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
894902524cSMatthias Ringwald }
904902524cSMatthias Ringwald 
914902524cSMatthias Ringwald //static int counter = 0;
924902524cSMatthias Ringwald void CHECK_EQUAL_GATT_ATTRIBUTE(const uint8_t * exp_uuid, const uint8_t * exp_handles, uint8_t * uuid, uint16_t start_handle, uint16_t end_handle){
934902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16);
944902524cSMatthias Ringwald 	if (!exp_handles) return;
954902524cSMatthias Ringwald 	CHECK_EQUAL(exp_handles[0], start_handle);
964902524cSMatthias Ringwald  	CHECK_EQUAL(exp_handles[1], end_handle);
974902524cSMatthias Ringwald }
984902524cSMatthias Ringwald 
994902524cSMatthias Ringwald // -----------------------------------------------------
1004902524cSMatthias Ringwald 
1014902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){
1024902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
1034902524cSMatthias Ringwald 	CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuid16,  primary_service_uuid16_handles, services[0].uuid128, services[0].start_group_handle, services[0].end_group_handle);
1044902524cSMatthias Ringwald }
1054902524cSMatthias Ringwald 
1064902524cSMatthias Ringwald 
1074902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){
1084902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
1094902524cSMatthias Ringwald 	CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuid128, primary_service_uuid128_handles, services[0].uuid128, services[0].start_group_handle, services[0].end_group_handle);
1104902524cSMatthias Ringwald }
1114902524cSMatthias Ringwald 
1124902524cSMatthias Ringwald static void verify_primary_services(void){
1134902524cSMatthias Ringwald 	CHECK_EQUAL(6, result_index);
1144902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
1154902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle);
1164902524cSMatthias Ringwald 	}
1174902524cSMatthias Ringwald }
1184902524cSMatthias Ringwald 
1194902524cSMatthias Ringwald static void verify_included_services_uuid16(void){
1204902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
1214902524cSMatthias Ringwald 	CHECK_EQUAL_GATT_ATTRIBUTE(included_services_uuid16, included_services_uuid16_handles, included_services[0].uuid128, included_services[0].start_group_handle, included_services[0].end_group_handle);
1224902524cSMatthias Ringwald }
1234902524cSMatthias Ringwald 
1244902524cSMatthias Ringwald static void verify_included_services_uuid128(void){
1254902524cSMatthias Ringwald 	CHECK_EQUAL(2, result_index);
1264902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
1274902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(included_services_uuid128[i], included_services_uuid128_handles[i], included_services[i].uuid128, included_services[i].start_group_handle, included_services[i].end_group_handle);
1284902524cSMatthias Ringwald 	}
1294902524cSMatthias Ringwald }
1304902524cSMatthias Ringwald 
1314902524cSMatthias Ringwald static void verify_charasteristics(void){
1324902524cSMatthias Ringwald 	CHECK_EQUAL(15, result_index);
1334902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
1344902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle);
1354902524cSMatthias Ringwald     }
1364902524cSMatthias Ringwald }
1374902524cSMatthias Ringwald 
1384902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){
1394902524cSMatthias Ringwald 	uint8_t * expected_value = (uint8_t*)&long_value[value_offset];
1404902524cSMatthias Ringwald     CHECK(value_length);
1414902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(expected_value, value, value_length);
1424902524cSMatthias Ringwald     if (value_offset + value_length != sizeof(long_value)) return;
1434902524cSMatthias Ringwald     result_counter++;
1444902524cSMatthias Ringwald }
1454902524cSMatthias Ringwald 
1464902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
1474902524cSMatthias Ringwald 	if (packet_type != HCI_EVENT_PACKET) return;
1484902524cSMatthias Ringwald 	uint8_t status;
1494902524cSMatthias Ringwald 	gatt_client_service_t service;
1504902524cSMatthias Ringwald 	gatt_client_characteristic_t characteristic;
1514902524cSMatthias Ringwald 	gatt_client_characteristic_descriptor_t descriptor;
1524902524cSMatthias Ringwald 	switch (packet[0]){
1534902524cSMatthias Ringwald 		case GATT_EVENT_QUERY_COMPLETE:
1544902524cSMatthias Ringwald 			status = packet[4];
1554902524cSMatthias Ringwald             gatt_query_complete = 1;
1564902524cSMatthias Ringwald             if (status){
1574902524cSMatthias Ringwald                 gatt_query_complete = 0;
1584902524cSMatthias Ringwald                 printf("GATT_EVENT_QUERY_COMPLETE failed with status 0x%02X\n", status);
1594902524cSMatthias Ringwald             }
1604902524cSMatthias Ringwald             break;
1614902524cSMatthias Ringwald 		case GATT_EVENT_SERVICE_QUERY_RESULT:
1624902524cSMatthias Ringwald 			service.start_group_handle = little_endian_read_16(packet, 4);
1634902524cSMatthias Ringwald 			service.end_group_handle   = little_endian_read_16(packet, 6);
1644902524cSMatthias Ringwald 			service.uuid16 = 0;
1654902524cSMatthias Ringwald 			reverse_128(&packet[8], service.uuid128);
1664902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(service.uuid128)){
1674902524cSMatthias Ringwald 				service.uuid16 = big_endian_read_32(service.uuid128, 0);
1684902524cSMatthias Ringwald 			}
1694902524cSMatthias Ringwald 			services[result_index++] = service;
1704902524cSMatthias Ringwald 			result_counter++;
1714902524cSMatthias Ringwald             break;
1724902524cSMatthias Ringwald         case GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT:
1734902524cSMatthias Ringwald 			service.start_group_handle = little_endian_read_16(packet, 6);
1744902524cSMatthias Ringwald 			service.end_group_handle   = little_endian_read_16(packet, 8);
1754902524cSMatthias Ringwald 			service.uuid16 = 0;
1764902524cSMatthias Ringwald 			reverse_128(&packet[10], service.uuid128);
1774902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(service.uuid128)){
1784902524cSMatthias Ringwald 				service.uuid16 = big_endian_read_32(service.uuid128, 0);
1794902524cSMatthias Ringwald 			}
1804902524cSMatthias Ringwald             included_services[result_index++] = service;
1814902524cSMatthias Ringwald             result_counter++;
1824902524cSMatthias Ringwald             break;
1834902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT:
1844902524cSMatthias Ringwald         	characteristic.start_handle = little_endian_read_16(packet, 4);
1854902524cSMatthias Ringwald         	characteristic.value_handle = little_endian_read_16(packet, 6);
1864902524cSMatthias Ringwald         	characteristic.end_handle =   little_endian_read_16(packet, 8);
1874902524cSMatthias Ringwald         	characteristic.properties =   little_endian_read_16(packet, 10);
1884902524cSMatthias Ringwald 			characteristic.uuid16 = 0;
1894902524cSMatthias Ringwald 			reverse_128(&packet[12], characteristic.uuid128);
1904902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(characteristic.uuid128)){
1914902524cSMatthias Ringwald 				characteristic.uuid16 = big_endian_read_32(characteristic.uuid128, 0);
1924902524cSMatthias Ringwald 			}
1934902524cSMatthias Ringwald         	characteristics[result_index++] = characteristic;
1944902524cSMatthias Ringwald         	result_counter++;
1954902524cSMatthias Ringwald             break;
1964902524cSMatthias Ringwald         case GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT:
1974902524cSMatthias Ringwald         	descriptor.handle = little_endian_read_16(packet, 4);
1984902524cSMatthias Ringwald 			reverse_128(&packet[6], descriptor.uuid128);
1994902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(descriptor.uuid128)){
2004902524cSMatthias Ringwald 				descriptor.uuid16 = big_endian_read_32(descriptor.uuid128, 0);
2014902524cSMatthias Ringwald 			}
2024902524cSMatthias Ringwald         	descriptors[result_index++] = descriptor;
2034902524cSMatthias Ringwald         	result_counter++;
2044902524cSMatthias Ringwald         	break;
2054902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT:
2064902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT:
2074902524cSMatthias Ringwald         	CHECK_EQUAL(short_value_length, little_endian_read_16(packet, 6));
2084902524cSMatthias Ringwald         	CHECK_EQUAL_ARRAY((uint8_t*)short_value, &packet[8], short_value_length);
2094902524cSMatthias Ringwald         	result_counter++;
2104902524cSMatthias Ringwald         	break;
2114902524cSMatthias Ringwald         case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT:
2124902524cSMatthias Ringwald         case GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT:
2134902524cSMatthias Ringwald         	verify_blob(little_endian_read_16(packet, 8), little_endian_read_16(packet, 6), &packet[10]);
2144902524cSMatthias Ringwald         	result_counter++;
2154902524cSMatthias Ringwald         	break;
2164902524cSMatthias Ringwald 	}
2174902524cSMatthias Ringwald }
2184902524cSMatthias Ringwald 
2194902524cSMatthias Ringwald extern "C" int att_write_callback(hci_con_handle_t con_handle, uint16_t attribute_handle, uint16_t transaction_mode, uint16_t offset, uint8_t *buffer, uint16_t buffer_size){
2204902524cSMatthias Ringwald 	switch(test){
2214902524cSMatthias Ringwald 		case WRITE_CHARACTERISTIC_DESCRIPTOR:
2224902524cSMatthias Ringwald 		case WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION:
2234902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode);
2244902524cSMatthias Ringwald 			CHECK_EQUAL(0, offset);
2254902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY(indication, buffer, 2);
2264902524cSMatthias Ringwald 			result_counter++;
2274902524cSMatthias Ringwald 			break;
2284902524cSMatthias Ringwald 		case WRITE_CHARACTERISTIC_VALUE:
2294902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode);
2304902524cSMatthias Ringwald 			CHECK_EQUAL(0, offset);
2314902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY((uint8_t *)short_value, buffer, short_value_length);
2324902524cSMatthias Ringwald     		result_counter++;
2334902524cSMatthias Ringwald 			break;
2344902524cSMatthias Ringwald 		case WRITE_LONG_CHARACTERISTIC_DESCRIPTOR:
2354902524cSMatthias Ringwald 		case WRITE_LONG_CHARACTERISTIC_VALUE:
2364902524cSMatthias Ringwald 		case WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE:
2374902524cSMatthias Ringwald 			if (transaction_mode == ATT_TRANSACTION_MODE_VALIDATE) break;
2384902524cSMatthias Ringwald 			if (transaction_mode == ATT_TRANSACTION_MODE_EXECUTE) break;
2394902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_ACTIVE, transaction_mode);
2404902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY((uint8_t *)&long_value[offset], buffer, buffer_size);
2414902524cSMatthias Ringwald 			if (offset + buffer_size != sizeof(long_value)) break;
2424902524cSMatthias Ringwald 			result_counter++;
2434902524cSMatthias Ringwald 			break;
2444902524cSMatthias Ringwald 		default:
2454902524cSMatthias Ringwald 			break;
2464902524cSMatthias Ringwald 	}
2474902524cSMatthias Ringwald 	return 0;
2484902524cSMatthias Ringwald }
2494902524cSMatthias Ringwald 
2504902524cSMatthias Ringwald int copy_bytes(uint8_t * value, uint16_t value_length, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
2514902524cSMatthias Ringwald 	int blob_length = value_length - offset;
2524902524cSMatthias Ringwald 	if (blob_length >= buffer_size) blob_length = buffer_size;
2534902524cSMatthias Ringwald 
2544902524cSMatthias Ringwald 	memcpy(buffer, &value[offset], blob_length);
2554902524cSMatthias Ringwald 	return blob_length;
2564902524cSMatthias Ringwald }
2574902524cSMatthias Ringwald 
2584902524cSMatthias Ringwald extern "C" uint16_t att_read_callback(uint16_t handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
2594902524cSMatthias Ringwald 	//printf("gatt client test, att_read_callback_t handle 0x%04x, offset %u, buffer %p, buffer_size %u\n", handle, offset, buffer, buffer_size);
2604902524cSMatthias Ringwald 	switch(test){
2614902524cSMatthias Ringwald 		case READ_CHARACTERISTIC_DESCRIPTOR:
2624902524cSMatthias Ringwald 		case READ_CHARACTERISTIC_VALUE:
2634902524cSMatthias Ringwald 			result_counter++;
2644902524cSMatthias Ringwald 			if (buffer){
2654902524cSMatthias Ringwald 				return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size);
2664902524cSMatthias Ringwald 			}
2674902524cSMatthias Ringwald 			return short_value_length;
2684902524cSMatthias Ringwald 		case READ_LONG_CHARACTERISTIC_DESCRIPTOR:
2694902524cSMatthias Ringwald 		case READ_LONG_CHARACTERISTIC_VALUE:
2704902524cSMatthias Ringwald 			result_counter++;
2714902524cSMatthias Ringwald 			if (buffer) {
2724902524cSMatthias Ringwald 				return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size);
2734902524cSMatthias Ringwald 			}
2744902524cSMatthias Ringwald 			return long_value_length;
2754902524cSMatthias Ringwald 		default:
2764902524cSMatthias Ringwald 			break;
2774902524cSMatthias Ringwald 	}
2784902524cSMatthias Ringwald 	return 0;
2794902524cSMatthias Ringwald }
2804902524cSMatthias Ringwald 
2814902524cSMatthias Ringwald // static const char * decode_status(uint8_t status){
2824902524cSMatthias Ringwald // 	switch (status){
2834902524cSMatthias Ringwald // 		case 0: return "0";
2844902524cSMatthias Ringwald //     	case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE";
2854902524cSMatthias Ringwald //     	case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS";
2864902524cSMatthias Ringwald //     	case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED";
2874902524cSMatthias Ringwald //     	case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG";
2884902524cSMatthias Ringwald // 	    case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY";
2894902524cSMatthias Ringwald // 	    case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED";
2904902524cSMatthias Ringwald // 	    case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED";
2914902524cSMatthias Ringwald // 	}
2924902524cSMatthias Ringwald // }
2934902524cSMatthias Ringwald 
2944902524cSMatthias Ringwald TEST_GROUP(GATTClient){
2954902524cSMatthias Ringwald 	int acl_buffer_size;
2964902524cSMatthias Ringwald     uint8_t acl_buffer[27];
2974902524cSMatthias Ringwald     uint8_t status;
2984902524cSMatthias Ringwald 
2994902524cSMatthias Ringwald 	void setup(void){
3004902524cSMatthias Ringwald 		result_counter = 0;
3014902524cSMatthias Ringwald 		result_index = 0;
3024902524cSMatthias Ringwald 		test = IDLE;
303*8404d3b7SMilanka Ringwald 		hci_setup_le_connection(gatt_client_handle);
3044902524cSMatthias Ringwald 	}
3054902524cSMatthias Ringwald 
3064902524cSMatthias Ringwald 	void reset_query_state(void){
307*8404d3b7SMilanka Ringwald 		gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle);
308*8404d3b7SMilanka Ringwald 		gatt_client->gatt_client_state = P_READY;
309*8404d3b7SMilanka Ringwald 
3104902524cSMatthias Ringwald 		gatt_query_complete = 0;
3114902524cSMatthias Ringwald 		result_counter = 0;
3124902524cSMatthias Ringwald 		result_index = 0;
3134902524cSMatthias Ringwald 	}
314*8404d3b7SMilanka Ringwald 
315*8404d3b7SMilanka Ringwald 	void set_wrong_gatt_client_state(void){
316*8404d3b7SMilanka Ringwald 		gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle);
317*8404d3b7SMilanka Ringwald 	    CHECK_TRUE(gatt_client != NULL);
318*8404d3b7SMilanka Ringwald 	    gatt_client->gatt_client_state = P_W2_SEND_SERVICE_QUERY;
319*8404d3b7SMilanka Ringwald 	}
3204902524cSMatthias Ringwald };
3214902524cSMatthias Ringwald 
3224902524cSMatthias Ringwald 
3234902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){
3244902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICES;
325*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
326*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
327*8404d3b7SMilanka Ringwald 
328*8404d3b7SMilanka Ringwald 	set_wrong_gatt_client_state();
329*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
330*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
331*8404d3b7SMilanka Ringwald 
3324902524cSMatthias Ringwald 	reset_query_state();
3334902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
3344902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3354902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3364902524cSMatthias Ringwald 	verify_primary_services();
3374902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3384902524cSMatthias Ringwald }
3394902524cSMatthias Ringwald 
3404902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){
3414902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16;
3424902524cSMatthias Ringwald 	reset_query_state();
3434902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
3444902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3454902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
3464902524cSMatthias Ringwald 	verify_primary_services_with_uuid16();
3474902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3484902524cSMatthias Ringwald }
3494902524cSMatthias Ringwald 
3504902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){
3514902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128;
3524902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
3534902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3544902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
3554902524cSMatthias Ringwald 	verify_primary_services_with_uuid128();
3564902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3574902524cSMatthias Ringwald }
3584902524cSMatthias Ringwald 
3594902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){
3604902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16;
3614902524cSMatthias Ringwald 	reset_query_state();
3624902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
3634902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3644902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3654902524cSMatthias Ringwald 
3664902524cSMatthias Ringwald 	reset_query_state();
3674902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
3684902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3694902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3704902524cSMatthias Ringwald 	verify_included_services_uuid16();
3714902524cSMatthias Ringwald }
3724902524cSMatthias Ringwald 
3734902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){
3744902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128;
3754902524cSMatthias Ringwald 	reset_query_state();
3764902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
3774902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3784902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3794902524cSMatthias Ringwald 
3804902524cSMatthias Ringwald 	reset_query_state();
3814902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
3824902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3834902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3844902524cSMatthias Ringwald 	verify_included_services_uuid128();
3854902524cSMatthias Ringwald }
3864902524cSMatthias Ringwald 
3874902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){
3884902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16;
3894902524cSMatthias Ringwald 	reset_query_state();
3904902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
3914902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3924902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3934902524cSMatthias Ringwald 
3944902524cSMatthias Ringwald 	reset_query_state();
3954902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
3964902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3974902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3984902524cSMatthias Ringwald 	verify_charasteristics();
3994902524cSMatthias Ringwald }
4004902524cSMatthias Ringwald 
4014902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){
4024902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID16;
4034902524cSMatthias Ringwald 	reset_query_state();
4044902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102);
4054902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4064902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4074902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4084902524cSMatthias Ringwald }
4094902524cSMatthias Ringwald 
4104902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){
4114902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID128;
4124902524cSMatthias Ringwald 	reset_query_state();
4134902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_handle_range_by_uuid128(handle_ble_client_event, gatt_client_handle, characteristic_handles[1][0], characteristic_handles[1][1], characteristic_uuids[1]);
4144902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4154902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4164902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4174902524cSMatthias Ringwald }
4184902524cSMatthias Ringwald 
4194902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){
4204902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
4214902524cSMatthias Ringwald 	reset_query_state();
4224902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
4234902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4244902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4254902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4264902524cSMatthias Ringwald 
4274902524cSMatthias Ringwald 	reset_query_state();
4284902524cSMatthias Ringwald 	uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
4294902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
4304902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4314902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4324902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4334902524cSMatthias Ringwald 
4344902524cSMatthias Ringwald 	reset_query_state();
4354902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
4364902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4374902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4384902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4394902524cSMatthias Ringwald }
4404902524cSMatthias Ringwald 
4414902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){
4424902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
4434902524cSMatthias Ringwald 	reset_query_state();
4444902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
4454902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4464902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4474902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4484902524cSMatthias Ringwald 
4494902524cSMatthias Ringwald 	reset_query_state();
4504902524cSMatthias Ringwald 	uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
4514902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
4524902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4534902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4544902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4554902524cSMatthias Ringwald 
4564902524cSMatthias Ringwald 	reset_query_state();
4574902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
4584902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4594902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4604902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4614902524cSMatthias Ringwald }
4624902524cSMatthias Ringwald 
4634902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){
4644902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTIC_DESCRIPTORS;
465*8404d3b7SMilanka Ringwald 
466*8404d3b7SMilanka Ringwald 	reset_query_state();
467*8404d3b7SMilanka Ringwald 	// invalid con handle
468*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16);
469*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
470*8404d3b7SMilanka Ringwald 
471*8404d3b7SMilanka Ringwald 	set_wrong_gatt_client_state();
472*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
473*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
474*8404d3b7SMilanka Ringwald 
4754902524cSMatthias Ringwald 	reset_query_state();
4764902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
4774902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4784902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4794902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4804902524cSMatthias Ringwald 
4814902524cSMatthias Ringwald 	reset_query_state();
4824902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
4834902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4844902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4854902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4864902524cSMatthias Ringwald 
4874902524cSMatthias Ringwald 	reset_query_state();
4884902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
4894902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4904902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4914902524cSMatthias Ringwald 	CHECK(result_counter);
4924902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_index);
4934902524cSMatthias Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
4944902524cSMatthias Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
4954902524cSMatthias Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
4964902524cSMatthias Ringwald }
4974902524cSMatthias Ringwald 
4984902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){
4994902524cSMatthias Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
5004902524cSMatthias Ringwald 	reset_query_state();
5014902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5024902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5034902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5044902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5054902524cSMatthias Ringwald 
5064902524cSMatthias Ringwald 	reset_query_state();
5074902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
5084902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5094902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5104902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5114902524cSMatthias Ringwald 
512*8404d3b7SMilanka Ringwald 	// invalid con handle
513*8404d3b7SMilanka Ringwald     status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
514*8404d3b7SMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
515*8404d3b7SMilanka Ringwald 
516*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
517*8404d3b7SMilanka Ringwald     status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
518*8404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
519*8404d3b7SMilanka Ringwald 
5204902524cSMatthias Ringwald 	reset_query_state();
5214902524cSMatthias Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
5224902524cSMatthias Ringwald  	CHECK_EQUAL(0, status);
5234902524cSMatthias Ringwald  	CHECK_EQUAL(1, gatt_query_complete);
5244902524cSMatthias Ringwald  	CHECK_EQUAL(1, result_counter);
525*8404d3b7SMilanka Ringwald 
526*8404d3b7SMilanka Ringwald  	reset_query_state();
527*8404d3b7SMilanka Ringwald 	characteristics->properties = 0;
528*8404d3b7SMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
529*8404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status);
530*8404d3b7SMilanka Ringwald 
531*8404d3b7SMilanka Ringwald  	reset_query_state();
532*8404d3b7SMilanka Ringwald 	characteristics->properties = 0;
533*8404d3b7SMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION);
534*8404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status);
5354902524cSMatthias Ringwald  }
5364902524cSMatthias Ringwald 
5374902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){
5384902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_DESCRIPTOR;
5394902524cSMatthias Ringwald 	reset_query_state();
5404902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5414902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5424902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5434902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5444902524cSMatthias Ringwald 
5454902524cSMatthias Ringwald 	reset_query_state();
5464902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
5474902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5484902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5494902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5504902524cSMatthias Ringwald 
5514902524cSMatthias Ringwald 	reset_query_state();
5524902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
5534902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5544902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5554902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
5564902524cSMatthias Ringwald 
5574902524cSMatthias Ringwald 	reset_query_state();
5584902524cSMatthias Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
5594902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5604902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5614902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
562*8404d3b7SMilanka Ringwald 
563*8404d3b7SMilanka Ringwald 	// invalid con handle
564*8404d3b7SMilanka Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]);
565*8404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
566*8404d3b7SMilanka Ringwald 
567*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
568*8404d3b7SMilanka Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
569*8404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5704902524cSMatthias Ringwald }
5714902524cSMatthias Ringwald 
5724902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){
5734902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_VALUE;
5744902524cSMatthias Ringwald 	reset_query_state();
5754902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5764902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5774902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5784902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5794902524cSMatthias Ringwald 
5804902524cSMatthias Ringwald 	reset_query_state();
5814902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
5824902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5834902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5844902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5854902524cSMatthias Ringwald 
5864902524cSMatthias Ringwald 	reset_query_state();
5874902524cSMatthias Ringwald 	status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
5884902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5894902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5904902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
5914902524cSMatthias Ringwald }
5924902524cSMatthias Ringwald 
5934902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){
5944902524cSMatthias Ringwald     test = WRITE_CHARACTERISTIC_VALUE;
5954902524cSMatthias Ringwald 	reset_query_state();
5964902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5974902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5984902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5994902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6004902524cSMatthias Ringwald 
6014902524cSMatthias Ringwald 	reset_query_state();
6024902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6034902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6044902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6054902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6064902524cSMatthias Ringwald 
607*8404d3b7SMilanka Ringwald // invalid con handle
608*8404d3b7SMilanka Ringwald     status = gatt_client_write_value_of_characteristic(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, short_value_length, (uint8_t*)short_value);
609*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
610*8404d3b7SMilanka Ringwald 
611*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
612*8404d3b7SMilanka Ringwald     status = gatt_client_write_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, short_value_length, (uint8_t*)short_value);
613*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
614*8404d3b7SMilanka Ringwald 
615*8404d3b7SMilanka Ringwald 
6164902524cSMatthias Ringwald 	reset_query_state();
6174902524cSMatthias Ringwald 	status = gatt_client_write_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, short_value_length, (uint8_t*)short_value);
6184902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6194902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6204902524cSMatthias Ringwald }
6214902524cSMatthias Ringwald 
6224902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){
6234902524cSMatthias Ringwald 	test = WRITE_CHARACTERISTIC_DESCRIPTOR;
6244902524cSMatthias Ringwald 	reset_query_state();
6254902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6264902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6274902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6284902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6294902524cSMatthias Ringwald 
6304902524cSMatthias Ringwald 	reset_query_state();
6314902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6324902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6334902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6344902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6354902524cSMatthias Ringwald 
6364902524cSMatthias Ringwald 	reset_query_state();
6374902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
6384902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6394902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6404902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
6414902524cSMatthias Ringwald 
6424902524cSMatthias Ringwald 	reset_query_state();
6434902524cSMatthias Ringwald 	status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication);
6444902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6454902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6464902524cSMatthias Ringwald }
6474902524cSMatthias Ringwald 
6484902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){
6494902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_VALUE;
6504902524cSMatthias Ringwald 	reset_query_state();
6514902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6524902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6534902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6544902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6554902524cSMatthias Ringwald 
6564902524cSMatthias Ringwald 	reset_query_state();
6574902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6584902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6594902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6604902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6614902524cSMatthias Ringwald 
6624902524cSMatthias Ringwald 	reset_query_state();
6634902524cSMatthias Ringwald 	status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
6644902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6654902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
666*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(4, result_counter);
6674902524cSMatthias Ringwald }
6684902524cSMatthias Ringwald 
6694902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){
6704902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_DESCRIPTOR;
6714902524cSMatthias Ringwald 	reset_query_state();
6724902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
6734902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6744902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6754902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6764902524cSMatthias Ringwald 
6774902524cSMatthias Ringwald 	reset_query_state();
6784902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
6794902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6804902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6814902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6824902524cSMatthias Ringwald 
6834902524cSMatthias Ringwald 	reset_query_state();
6844902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
6854902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6864902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6874902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
6884902524cSMatthias Ringwald 
6894902524cSMatthias Ringwald 	reset_query_state();
6904902524cSMatthias Ringwald 	result_counter = 0;
6914902524cSMatthias Ringwald 	status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
6924902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6934902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
694*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(4, result_counter);
6954902524cSMatthias Ringwald }
6964902524cSMatthias Ringwald 
6974902524cSMatthias Ringwald 
6984902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){
6994902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR;
7004902524cSMatthias Ringwald 	reset_query_state();
7014902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
7024902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7034902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7044902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7054902524cSMatthias Ringwald 
7064902524cSMatthias Ringwald 	reset_query_state();
7074902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
7084902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7094902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7104902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7114902524cSMatthias Ringwald 
7124902524cSMatthias Ringwald 	reset_query_state();
7134902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
7144902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7154902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7164902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
7174902524cSMatthias Ringwald 
7184902524cSMatthias Ringwald 	result_counter = 0;
7194902524cSMatthias Ringwald 	status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value);
7204902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7214902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7224902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7234902524cSMatthias Ringwald }
7244902524cSMatthias Ringwald 
7254902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){
7264902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_VALUE;
7274902524cSMatthias Ringwald 	reset_query_state();
7284902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
7294902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7304902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7314902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7324902524cSMatthias Ringwald 
7334902524cSMatthias Ringwald 	reset_query_state();
7344902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
7354902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7364902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7374902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7384902524cSMatthias Ringwald 
7394902524cSMatthias Ringwald 
7404902524cSMatthias Ringwald 	reset_query_state();
7414902524cSMatthias Ringwald 	status = gatt_client_write_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
7424902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7434902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7444902524cSMatthias Ringwald }
7454902524cSMatthias Ringwald 
7464902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){
7474902524cSMatthias Ringwald 	test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE;
7484902524cSMatthias Ringwald 	reset_query_state();
7494902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
7504902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7514902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7524902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7534902524cSMatthias Ringwald 
7544902524cSMatthias Ringwald 	reset_query_state();
7554902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
7564902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7574902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7584902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7594902524cSMatthias Ringwald 
760*8404d3b7SMilanka Ringwald 	// invalid con handle
761*8404d3b7SMilanka Ringwald 	status = gatt_client_reliable_write_long_value_of_characteristic(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
762*8404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
763*8404d3b7SMilanka Ringwald 
764*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
765*8404d3b7SMilanka Ringwald 	status = gatt_client_reliable_write_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
766*8404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
767*8404d3b7SMilanka Ringwald 
7684902524cSMatthias Ringwald 	reset_query_state();
7694902524cSMatthias Ringwald 	status = gatt_client_reliable_write_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
7704902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7714902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7724902524cSMatthias Ringwald }
7734902524cSMatthias Ringwald 
774*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){
775*8404d3b7SMilanka Ringwald 	reset_query_state();
776*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
777*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
778*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
779*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
780*8404d3b7SMilanka Ringwald 
781*8404d3b7SMilanka Ringwald 	reset_query_state();
782*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
783*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
784*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
785*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
786*8404d3b7SMilanka Ringwald 
787*8404d3b7SMilanka Ringwald 	reset_query_state();
788*8404d3b7SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_offset(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, long_value_length, (uint8_t*)long_value);
789*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
790*8404d3b7SMilanka Ringwald 
791*8404d3b7SMilanka Ringwald 	reset_query_state();
792*8404d3b7SMilanka Ringwald 	// invalid con handle
793*8404d3b7SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, 0, long_value_length, (uint8_t*)long_value);
794*8404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
795*8404d3b7SMilanka Ringwald 
796*8404d3b7SMilanka Ringwald     reset_query_state();
797*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
798*8404d3b7SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_offset(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, long_value_length, (uint8_t*)long_value);
799*8404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
800*8404d3b7SMilanka Ringwald }
801*8404d3b7SMilanka Ringwald 
802*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){
803*8404d3b7SMilanka Ringwald 	reset_query_state();
804*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
805*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
806*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
807*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
808*8404d3b7SMilanka Ringwald 
809*8404d3b7SMilanka Ringwald 	reset_query_state();
810*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
811*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
812*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
813*8404d3b7SMilanka Ringwald 	CHECK(result_counter);
814*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(3, result_index);
815*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
816*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
817*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
818*8404d3b7SMilanka Ringwald 
819*8404d3b7SMilanka Ringwald 	reset_query_state();
820*8404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0);
821*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
822*8404d3b7SMilanka Ringwald 
823*8404d3b7SMilanka Ringwald 	reset_query_state();
824*8404d3b7SMilanka Ringwald 	// invalid con handle
825*8404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, descriptors[0].handle, 0);
826*8404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
827*8404d3b7SMilanka Ringwald 
828*8404d3b7SMilanka Ringwald     reset_query_state();
829*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
830*8404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0);
831*8404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
832*8404d3b7SMilanka Ringwald }
833*8404d3b7SMilanka Ringwald 
834*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){
835*8404d3b7SMilanka Ringwald 	reset_query_state();
836*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
837*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
838*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
839*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
840*8404d3b7SMilanka Ringwald 
841*8404d3b7SMilanka Ringwald 	reset_query_state();
842*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
843*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
844*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
845*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
846*8404d3b7SMilanka Ringwald 
847*8404d3b7SMilanka Ringwald 	uint16_t value_handles[] = {characteristics[0].value_handle};
848*8404d3b7SMilanka Ringwald 
849*8404d3b7SMilanka Ringwald 	reset_query_state();
850*8404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles);
851*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
852*8404d3b7SMilanka Ringwald 
853*8404d3b7SMilanka Ringwald 	reset_query_state();
854*8404d3b7SMilanka Ringwald 	// invalid con handle
855*8404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles);
856*8404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
857*8404d3b7SMilanka Ringwald 
858*8404d3b7SMilanka Ringwald 	reset_query_state();
859*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
860*8404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles);
861*8404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
862*8404d3b7SMilanka Ringwald }
863*8404d3b7SMilanka Ringwald 
864*8404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){
865*8404d3b7SMilanka Ringwald 	reset_query_state();
866*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
867*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
868*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
869*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
870*8404d3b7SMilanka Ringwald 
871*8404d3b7SMilanka Ringwald 	reset_query_state();
872*8404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
873*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
874*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
875*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
876*8404d3b7SMilanka Ringwald 
877*8404d3b7SMilanka Ringwald 	uint16_t value_handles[] = {characteristics[0].value_handle};
878*8404d3b7SMilanka Ringwald 
879*8404d3b7SMilanka Ringwald 	reset_query_state();
880*8404d3b7SMilanka Ringwald 	// invalid con handle
881*8404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
882*8404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
883*8404d3b7SMilanka Ringwald 
884*8404d3b7SMilanka Ringwald 	reset_query_state();
885*8404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
886*8404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
887*8404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status);
888*8404d3b7SMilanka Ringwald 
889*8404d3b7SMilanka Ringwald 	reset_query_state();
890*8404d3b7SMilanka Ringwald 
891*8404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value);
892*8404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
893*8404d3b7SMilanka Ringwald 
894*8404d3b7SMilanka Ringwald }
8954902524cSMatthias Ringwald 
8964902524cSMatthias Ringwald int main (int argc, const char * argv[]){
8974902524cSMatthias Ringwald 	att_set_db(profile_data);
8984902524cSMatthias Ringwald 	att_set_write_callback(&att_write_callback);
8994902524cSMatthias Ringwald 	att_set_read_callback(&att_read_callback);
9004902524cSMatthias Ringwald 
9014902524cSMatthias Ringwald 	gatt_client_init();
9024902524cSMatthias Ringwald 
9034902524cSMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
9044902524cSMatthias Ringwald }
905