xref: /btstack/test/gatt_client/gatt_client_test.cpp (revision 61027ef7659098a7f01f6fd96159d3057346326d)
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(&notification, handle_ble_client_event, gatt_client_handle, &characteristics[0]);
1209a382a4adSMilanka Ringwald 	gatt_client_stop_listening_for_characteristic_value_updates(&notification);
1210a382a4adSMilanka Ringwald 
1211a382a4adSMilanka Ringwald 	gatt_client_listen_for_characteristic_value_updates(&notification, handle_ble_client_event, gatt_client_handle, NULL);
1212a382a4adSMilanka Ringwald 	gatt_client_stop_listening_for_characteristic_value_updates(&notification);
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