xref: /btstack/test/gatt_client/gatt_client_test.cpp (revision 54459808988bc6087cb6ebc945f0ac678f54cbd3)
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);
29*54459808SMilanka Ringwald extern "C" void l2cap_set_can_send_fixed_channel_packet_now(bool value);
308404d3b7SMilanka Ringwald 
314902524cSMatthias Ringwald static uint16_t gatt_client_handle = 0x40;
324902524cSMatthias Ringwald static int gatt_query_complete = 0;
334902524cSMatthias Ringwald 
34*54459808SMilanka Ringwald 
354902524cSMatthias Ringwald typedef enum {
364902524cSMatthias Ringwald 	IDLE,
374902524cSMatthias Ringwald 	DISCOVER_PRIMARY_SERVICES,
384902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID16,
394902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID128,
404902524cSMatthias Ringwald 
414902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16,
424902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128,
434902524cSMatthias Ringwald 
444902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16,
454902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128,
464902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID16,
474902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID128,
484902524cSMatthias Ringwald 	DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID,
494902524cSMatthias Ringwald 
504902524cSMatthias Ringwald 	READ_CHARACTERISTIC_VALUE,
514902524cSMatthias Ringwald 	READ_LONG_CHARACTERISTIC_VALUE,
524902524cSMatthias Ringwald 	WRITE_CHARACTERISTIC_VALUE,
534902524cSMatthias Ringwald 	WRITE_LONG_CHARACTERISTIC_VALUE,
544902524cSMatthias Ringwald 
554902524cSMatthias Ringwald     DISCOVER_CHARACTERISTIC_DESCRIPTORS,
564902524cSMatthias Ringwald     READ_CHARACTERISTIC_DESCRIPTOR,
574902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_DESCRIPTOR,
584902524cSMatthias Ringwald     WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION,
59369697acSMilanka Ringwald     WRITE_NONEXISTING_CLIENT_CHARACTERISTIC_CONFIGURATION,
604902524cSMatthias Ringwald     READ_LONG_CHARACTERISTIC_DESCRIPTOR,
614902524cSMatthias Ringwald     WRITE_LONG_CHARACTERISTIC_DESCRIPTOR,
624902524cSMatthias Ringwald     WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE,
634902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE
644902524cSMatthias Ringwald } current_test_t;
654902524cSMatthias Ringwald 
664902524cSMatthias Ringwald current_test_t test = IDLE;
674902524cSMatthias Ringwald 
684902524cSMatthias Ringwald uint8_t  characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb};
694902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000;
704902524cSMatthias Ringwald 
714902524cSMatthias Ringwald static int result_index;
724902524cSMatthias Ringwald static uint8_t result_counter;
734902524cSMatthias Ringwald 
744902524cSMatthias Ringwald static gatt_client_service_t services[50];
754902524cSMatthias Ringwald static gatt_client_service_t included_services[50];
764902524cSMatthias Ringwald 
774902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50];
784902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50];
794902524cSMatthias Ringwald 
804902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void);
814902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void);
824902524cSMatthias Ringwald 
CHECK_EQUAL_ARRAY(const uint8_t * expected,uint8_t * actual,int size)834902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
844902524cSMatthias Ringwald 	for (int i=0; i<size; i++){
854902524cSMatthias Ringwald 		BYTES_EQUAL(expected[i], actual[i]);
864902524cSMatthias Ringwald 	}
874902524cSMatthias Ringwald }
884902524cSMatthias Ringwald 
pUUID128(const uint8_t * uuid)894902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) {
904902524cSMatthias Ringwald     printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
914902524cSMatthias Ringwald            uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
924902524cSMatthias Ringwald            uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
934902524cSMatthias Ringwald }
944902524cSMatthias Ringwald 
954902524cSMatthias Ringwald //static int counter = 0;
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)964902524cSMatthias 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){
974902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16);
984902524cSMatthias Ringwald 	if (!exp_handles) return;
994902524cSMatthias Ringwald 	CHECK_EQUAL(exp_handles[0], start_handle);
1004902524cSMatthias Ringwald  	CHECK_EQUAL(exp_handles[1], end_handle);
1014902524cSMatthias Ringwald }
1024902524cSMatthias Ringwald 
1034902524cSMatthias Ringwald // -----------------------------------------------------
1044902524cSMatthias Ringwald 
verify_primary_services_with_uuid16(void)1054902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){
1064902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
1074902524cSMatthias 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);
1084902524cSMatthias Ringwald }
1094902524cSMatthias Ringwald 
1104902524cSMatthias Ringwald 
verify_primary_services_with_uuid128(void)1114902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){
1124902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
1134902524cSMatthias 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);
1144902524cSMatthias Ringwald }
1154902524cSMatthias Ringwald 
verify_primary_services(void)1164902524cSMatthias Ringwald static void verify_primary_services(void){
1174902524cSMatthias Ringwald 	CHECK_EQUAL(6, result_index);
1184902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
1194902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle);
1204902524cSMatthias Ringwald 	}
1214902524cSMatthias Ringwald }
1224902524cSMatthias Ringwald 
verify_included_services_uuid16(void)1234902524cSMatthias Ringwald static void verify_included_services_uuid16(void){
1244902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
1254902524cSMatthias 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);
1264902524cSMatthias Ringwald }
1274902524cSMatthias Ringwald 
verify_included_services_uuid128(void)1284902524cSMatthias Ringwald static void verify_included_services_uuid128(void){
1294902524cSMatthias Ringwald 	CHECK_EQUAL(2, result_index);
1304902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
1314902524cSMatthias 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);
1324902524cSMatthias Ringwald 	}
1334902524cSMatthias Ringwald }
1344902524cSMatthias Ringwald 
verify_charasteristics(void)1354902524cSMatthias Ringwald static void verify_charasteristics(void){
1364902524cSMatthias Ringwald 	CHECK_EQUAL(15, result_index);
1374902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
1384902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle);
1394902524cSMatthias Ringwald     }
1404902524cSMatthias Ringwald }
1414902524cSMatthias Ringwald 
verify_blob(uint16_t value_length,uint16_t value_offset,uint8_t * value)1424902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){
1434902524cSMatthias Ringwald 	uint8_t * expected_value = (uint8_t*)&long_value[value_offset];
1444902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(expected_value, value, value_length);
1454902524cSMatthias Ringwald     if (value_offset + value_length != sizeof(long_value)) return;
1464902524cSMatthias Ringwald     result_counter++;
1474902524cSMatthias Ringwald }
1484902524cSMatthias Ringwald 
handle_ble_client_event(uint8_t packet_type,uint16_t channel,uint8_t * packet,uint16_t size)1494902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
1504902524cSMatthias Ringwald 	if (packet_type != HCI_EVENT_PACKET) return;
1514902524cSMatthias Ringwald 	uint8_t status;
1524902524cSMatthias Ringwald 	gatt_client_service_t service;
1534902524cSMatthias Ringwald 	gatt_client_characteristic_t characteristic;
1544902524cSMatthias Ringwald 	gatt_client_characteristic_descriptor_t descriptor;
1554902524cSMatthias Ringwald 	switch (packet[0]){
1564902524cSMatthias Ringwald 		case GATT_EVENT_QUERY_COMPLETE:
157ef09b0beSMatthias Ringwald 			status = gatt_event_query_complete_get_att_status(packet);
1584902524cSMatthias Ringwald             gatt_query_complete = 1;
1594902524cSMatthias Ringwald             if (status){
1604902524cSMatthias Ringwald                 gatt_query_complete = 0;
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 
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)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 
copy_bytes(uint8_t * value,uint16_t value_length,uint16_t offset,uint8_t * buffer,uint16_t buffer_size)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 
att_read_callback(uint16_t handle,uint16_t attribute_handle,uint16_t offset,uint8_t * buffer,uint16_t buffer_size)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 
TEST_GROUP(GATTClient)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);
28461027ef7SMatthias Ringwald         memset(characteristics, 0, sizeof(characteristics));
28561027ef7SMatthias Ringwald         memset(descriptors, 0, sizeof(descriptors));
286*54459808SMilanka Ringwald         l2cap_set_can_send_fixed_channel_packet_now(true);
2874902524cSMatthias Ringwald 	}
2884902524cSMatthias Ringwald 
28940faeb84SMilanka Ringwald 	gatt_client_t * get_gatt_client(hci_con_handle_t con_handle){
29040faeb84SMilanka Ringwald         gatt_client_t * gatt_client;
29140faeb84SMilanka Ringwald 		(void) gatt_client_get_client(gatt_client_handle, &gatt_client);
29240faeb84SMilanka Ringwald 		return gatt_client;
29340faeb84SMilanka Ringwald 	}
29440faeb84SMilanka Ringwald 
2954902524cSMatthias Ringwald 	void reset_query_state(void){
29640faeb84SMilanka Ringwald         gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle);
297ad3bb416SMatthias Ringwald 		gatt_client->state = P_READY;
29840faeb84SMilanka Ringwald 
299a382a4adSMilanka Ringwald 		gatt_client_set_required_security_level(LEVEL_0);
300a382a4adSMilanka Ringwald 		gatt_client_mtu_enable_auto_negotiation(1);
3018404d3b7SMilanka Ringwald 
3024902524cSMatthias Ringwald 		gatt_query_complete = 0;
3034902524cSMatthias Ringwald 		result_counter = 0;
3044902524cSMatthias Ringwald 		result_index = 0;
305*54459808SMilanka Ringwald         l2cap_set_can_send_fixed_channel_packet_now(true);
3064902524cSMatthias Ringwald 	}
3078404d3b7SMilanka Ringwald 
3088404d3b7SMilanka Ringwald 	void set_wrong_gatt_client_state(void){
30940faeb84SMilanka Ringwald 		gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle);
3108404d3b7SMilanka Ringwald 	    CHECK_TRUE(gatt_client != NULL);
311ad3bb416SMatthias Ringwald 	    gatt_client->state = P_W2_SEND_SERVICE_QUERY;
3128404d3b7SMilanka Ringwald 	}
3134902524cSMatthias Ringwald };
3144902524cSMatthias Ringwald 
TEST(GATTClient,gatt_client_setters)315a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_setters){
316a382a4adSMilanka Ringwald 	gatt_client_set_required_security_level(LEVEL_4);
317a382a4adSMilanka Ringwald 	gatt_client_mtu_enable_auto_negotiation(0);
318a382a4adSMilanka Ringwald }
3194902524cSMatthias Ringwald 
TEST(GATTClient,gatt_client_is_ready_mtu_exchange_disabled)320617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_is_ready_mtu_exchange_disabled){
321617a2595SMilanka Ringwald 	gatt_client_mtu_enable_auto_negotiation(0);
322617a2595SMilanka Ringwald 	int status = gatt_client_is_ready(gatt_client_handle);
323617a2595SMilanka Ringwald 	CHECK_EQUAL(1, status);
324617a2595SMilanka Ringwald }
325617a2595SMilanka Ringwald 
TEST(GATTClient,TestDiscoverPrimaryServices)3264902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){
3274902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICES;
3288404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
32940faeb84SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
3308404d3b7SMilanka Ringwald 
3318404d3b7SMilanka Ringwald 	set_wrong_gatt_client_state();
3328404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
3338404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
3348404d3b7SMilanka Ringwald 
3354902524cSMatthias Ringwald 	reset_query_state();
3364902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
3374902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3384902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3394902524cSMatthias Ringwald 	verify_primary_services();
3404902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3414902524cSMatthias Ringwald }
3424902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverPrimaryServicesByUUID16)3434902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){
3444902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16;
3454902524cSMatthias Ringwald 	reset_query_state();
3464902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
3474902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3484902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
3494902524cSMatthias Ringwald 	verify_primary_services_with_uuid16();
3504902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3514902524cSMatthias Ringwald }
3524902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverPrimaryServicesByUUID128)3534902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){
3544902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128;
3554902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
3564902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3574902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
3584902524cSMatthias Ringwald 	verify_primary_services_with_uuid128();
3594902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
360a382a4adSMilanka Ringwald 
361a382a4adSMilanka Ringwald 	// invalid con handle
362a382a4adSMilanka Ringwald     status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, primary_service_uuid128);
36340faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
364a382a4adSMilanka Ringwald 
365a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
366a382a4adSMilanka Ringwald     status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
367a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
3684902524cSMatthias Ringwald }
3694902524cSMatthias Ringwald 
TEST(GATTClient,TestFindIncludedServicesForServiceWithUUID16)3704902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){
3714902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16;
3724902524cSMatthias Ringwald 	reset_query_state();
3734902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
3744902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3754902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3764902524cSMatthias Ringwald 
3774902524cSMatthias Ringwald 	reset_query_state();
3784902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
3794902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3804902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3814902524cSMatthias Ringwald 	verify_included_services_uuid16();
3824902524cSMatthias Ringwald }
3834902524cSMatthias Ringwald 
TEST(GATTClient,TestFindIncludedServicesForServiceWithUUID128)3844902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){
3854902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128;
3864902524cSMatthias Ringwald 	reset_query_state();
3874902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
3884902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3894902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3904902524cSMatthias Ringwald 
3914902524cSMatthias Ringwald 	reset_query_state();
3924902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
3934902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
3944902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
3954902524cSMatthias Ringwald 	verify_included_services_uuid128();
396a382a4adSMilanka Ringwald 
397a382a4adSMilanka Ringwald 	// invalid con handle
398a382a4adSMilanka Ringwald     status = gatt_client_find_included_services_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]);
39940faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
400a382a4adSMilanka Ringwald 
401a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
402a382a4adSMilanka Ringwald     status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
403a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4044902524cSMatthias Ringwald }
4054902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverCharacteristicsForService)4064902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){
4074902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16;
4084902524cSMatthias Ringwald 	reset_query_state();
4094902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
4104902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4114902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4124902524cSMatthias Ringwald 
4134902524cSMatthias Ringwald 	reset_query_state();
4144902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
4154902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4164902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4174902524cSMatthias Ringwald 	verify_charasteristics();
418a382a4adSMilanka Ringwald 
419a382a4adSMilanka Ringwald 	// invalid con handle
420a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]);
42140faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
422a382a4adSMilanka Ringwald 
423a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
424a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
425a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4264902524cSMatthias Ringwald }
4274902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverCharacteristicsByUUID16)4284902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){
4294902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID16;
4304902524cSMatthias Ringwald 	reset_query_state();
4314902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102);
4324902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4334902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4344902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
435a382a4adSMilanka Ringwald 
436a382a4adSMilanka Ringwald 	// invalid con handle
437a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 0x30, 0x32, 0xF102);
43840faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
439a382a4adSMilanka Ringwald 
440a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
441a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102);
442a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4434902524cSMatthias Ringwald }
4444902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverCharacteristicsByUUID128)4454902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){
4464902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID128;
4474902524cSMatthias Ringwald 	reset_query_state();
4484902524cSMatthias 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]);
4494902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4504902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4514902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
452a382a4adSMilanka Ringwald 
453a382a4adSMilanka Ringwald 	// invalid con handle
454a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_handle_range_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristic_handles[1][0], characteristic_handles[1][1], characteristic_uuids[1]);
45540faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
456a382a4adSMilanka Ringwald 
457a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
458a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_handle_range_by_uuid128(handle_ble_client_event, gatt_client_handle, characteristic_handles[1][0], characteristic_handles[1][1], characteristic_uuids[1]);
459a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4604902524cSMatthias Ringwald }
4614902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverCharacteristics4ServiceByUUID128)4624902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){
4634902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
4644902524cSMatthias Ringwald 	reset_query_state();
4654902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
4664902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4674902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4684902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4694902524cSMatthias Ringwald 
4704902524cSMatthias Ringwald 	reset_query_state();
4714902524cSMatthias Ringwald 	uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
4724902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
4734902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4744902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4754902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4764902524cSMatthias Ringwald 
4774902524cSMatthias Ringwald 	reset_query_state();
4784902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
4794902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4804902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4814902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4824902524cSMatthias Ringwald }
4834902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverCharacteristics4ServiceByUUID16)4844902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){
4854902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
4864902524cSMatthias Ringwald 	reset_query_state();
4874902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
4884902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4894902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4904902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4914902524cSMatthias Ringwald 
4924902524cSMatthias Ringwald 	reset_query_state();
4934902524cSMatthias Ringwald 	uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
4944902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
4954902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4964902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4974902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4984902524cSMatthias Ringwald 
4994902524cSMatthias Ringwald 	reset_query_state();
5004902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
5014902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5024902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5034902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5044902524cSMatthias Ringwald }
5054902524cSMatthias Ringwald 
TEST(GATTClient,TestDiscoverCharacteristicDescriptor)5064902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){
5074902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTIC_DESCRIPTORS;
5088404d3b7SMilanka Ringwald 
5098404d3b7SMilanka Ringwald 	reset_query_state();
5108404d3b7SMilanka Ringwald 	// invalid con handle
5118404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16);
51240faeb84SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
5138404d3b7SMilanka Ringwald 
5148404d3b7SMilanka Ringwald 	set_wrong_gatt_client_state();
5158404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5168404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5178404d3b7SMilanka Ringwald 
5184902524cSMatthias Ringwald 	reset_query_state();
5194902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5204902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5214902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5224902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5234902524cSMatthias Ringwald 
5244902524cSMatthias Ringwald 	reset_query_state();
5254902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
5264902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5274902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5284902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5294902524cSMatthias Ringwald 
5304902524cSMatthias Ringwald 	reset_query_state();
5314902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
5324902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5334902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5344902524cSMatthias Ringwald 	CHECK(result_counter);
5354902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_index);
5364902524cSMatthias Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
5374902524cSMatthias Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
5384902524cSMatthias Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
5394902524cSMatthias Ringwald }
5404902524cSMatthias Ringwald 
TEST(GATTClient,TestWriteClientCharacteristicConfiguration)5414902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){
5424902524cSMatthias Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
5434902524cSMatthias Ringwald 	reset_query_state();
5444902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5454902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5464902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5474902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5484902524cSMatthias Ringwald 
5494902524cSMatthias Ringwald 	reset_query_state();
5504902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
5514902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5524902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5534902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5544902524cSMatthias Ringwald 
5558404d3b7SMilanka Ringwald 	// invalid con handle
5568404d3b7SMilanka Ringwald     status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
55740faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
5588404d3b7SMilanka Ringwald 
5598404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
5608404d3b7SMilanka Ringwald     status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
5618404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5628404d3b7SMilanka Ringwald 
5634902524cSMatthias Ringwald 	reset_query_state();
5644902524cSMatthias Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
5654902524cSMatthias Ringwald  	CHECK_EQUAL(0, status);
5664902524cSMatthias Ringwald  	CHECK_EQUAL(1, gatt_query_complete);
5674902524cSMatthias Ringwald  	CHECK_EQUAL(1, result_counter);
5688404d3b7SMilanka Ringwald 
5698404d3b7SMilanka Ringwald  	reset_query_state();
5708404d3b7SMilanka Ringwald 	characteristics->properties = 0;
5718404d3b7SMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
5728404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status);
5738404d3b7SMilanka Ringwald 
5748404d3b7SMilanka Ringwald  	reset_query_state();
5758404d3b7SMilanka Ringwald 	characteristics->properties = 0;
5768404d3b7SMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION);
5778404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status);
578369697acSMilanka Ringwald 
579369697acSMilanka Ringwald  	reset_query_state();
580369697acSMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], 10);
581369697acSMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE, status);
582369697acSMilanka Ringwald }
583369697acSMilanka Ringwald 
TEST(GATTClient,TestWriteClientCharacteristicConfigurationNone)584369697acSMilanka Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfigurationNone){
585369697acSMilanka Ringwald  	reset_query_state();
586369697acSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
587369697acSMilanka Ringwald 	CHECK_EQUAL(0, status);
588369697acSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
589369697acSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
590369697acSMilanka Ringwald 
591369697acSMilanka Ringwald 	reset_query_state();
592369697acSMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NONE);
593369697acSMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
594369697acSMilanka Ringwald  }
595369697acSMilanka Ringwald 
TEST(GATTClient,TestWriteNonexistingClientCharacteristicConfiguration)596369697acSMilanka Ringwald TEST(GATTClient, TestWriteNonexistingClientCharacteristicConfiguration){
597369697acSMilanka Ringwald 	test = WRITE_NONEXISTING_CLIENT_CHARACTERISTIC_CONFIGURATION;
598369697acSMilanka Ringwald 	reset_query_state();
599369697acSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
600369697acSMilanka Ringwald 	CHECK_EQUAL(0, status);
601369697acSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
602369697acSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
603369697acSMilanka Ringwald 
604369697acSMilanka Ringwald 	reset_query_state();
605369697acSMilanka Ringwald 	characteristics->properties = ATT_PROPERTY_INDICATE;
606369697acSMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION);
607369697acSMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
6084902524cSMatthias Ringwald }
6094902524cSMatthias Ringwald 
TEST(GATTClient,TestReadCharacteristicDescriptor)6104902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){
6114902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_DESCRIPTOR;
6124902524cSMatthias Ringwald 	reset_query_state();
6134902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6144902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6154902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6164902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6174902524cSMatthias Ringwald 
6184902524cSMatthias Ringwald 	reset_query_state();
6194902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6204902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6214902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6224902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6234902524cSMatthias Ringwald 
6244902524cSMatthias Ringwald 	reset_query_state();
6254902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
6264902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6274902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6284902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
6294902524cSMatthias Ringwald 
630a382a4adSMilanka Ringwald 	// invalid con handle
631a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, HCI_CON_HANDLE_INVALID,  &characteristics[0]);
63240faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
633a382a4adSMilanka Ringwald 
634a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
635a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle,  &characteristics[0]);
636a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
637a382a4adSMilanka Ringwald 
638a382a4adSMilanka Ringwald 	reset_query_state();
639a382a4adSMilanka Ringwald 	uint16_t end_handle = characteristics[0].end_handle;
640a382a4adSMilanka Ringwald 	characteristics[0].end_handle = characteristics[0].value_handle;
641a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
642a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
643a382a4adSMilanka Ringwald 	characteristics[0].end_handle = end_handle;
644a382a4adSMilanka Ringwald 
6454902524cSMatthias Ringwald 	reset_query_state();
6464902524cSMatthias Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
6474902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6484902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6494902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
6508404d3b7SMilanka Ringwald 
6518404d3b7SMilanka Ringwald 	// invalid con handle
6528404d3b7SMilanka Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]);
65340faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
6548404d3b7SMilanka Ringwald 
6558404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
6568404d3b7SMilanka Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
6578404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
6584902524cSMatthias Ringwald }
6594902524cSMatthias Ringwald 
TEST(GATTClient,gatt_client_read_value_of_characteristic_using_value_handle)660a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristic_using_value_handle){
661a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
662a382a4adSMilanka Ringwald 	reset_query_state();
663a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
664a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
665a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
666a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
667a382a4adSMilanka Ringwald 
668a382a4adSMilanka Ringwald 	reset_query_state();
669a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
670a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
671a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
672a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
673a382a4adSMilanka Ringwald 
674a382a4adSMilanka Ringwald 	// invalid con handle
675a382a4adSMilanka Ringwald     status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle);
67640faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
677a382a4adSMilanka Ringwald 
678a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
679a382a4adSMilanka Ringwald     status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle);
680a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
681a382a4adSMilanka Ringwald 	reset_query_state();
682a382a4adSMilanka Ringwald }
683a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_read_long_value_of_characteristic_using_value_handle_with_context)684*54459808SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_context){
685*54459808SMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
686*54459808SMilanka Ringwald 	reset_query_state();
687*54459808SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
688*54459808SMilanka Ringwald 	CHECK_EQUAL(0, status);
689*54459808SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
690*54459808SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
691*54459808SMilanka Ringwald 
692*54459808SMilanka Ringwald 	reset_query_state();
693*54459808SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
694*54459808SMilanka Ringwald 	CHECK_EQUAL(0, status);
695*54459808SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
696*54459808SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
697*54459808SMilanka Ringwald 
698*54459808SMilanka Ringwald 	// invalid con handle
699*54459808SMilanka Ringwald     status = gatt_client_read_long_value_of_characteristic_using_value_handle_with_context(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, 0xF100, 0);
700*54459808SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
701*54459808SMilanka Ringwald 
702*54459808SMilanka Ringwald     set_wrong_gatt_client_state();
703*54459808SMilanka Ringwald     status = gatt_client_read_long_value_of_characteristic_using_value_handle_with_context(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0xF100, 0);
704*54459808SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
705*54459808SMilanka Ringwald 	reset_query_state();
706*54459808SMilanka Ringwald }
707*54459808SMilanka Ringwald 
TEST(GATTClient,gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset)708a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset){
709a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
710a382a4adSMilanka Ringwald 	reset_query_state();
711a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
712a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
713a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
714a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
715a382a4adSMilanka Ringwald 
716a382a4adSMilanka Ringwald 	reset_query_state();
717a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
718a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
719a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
720a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
721a382a4adSMilanka Ringwald 
722a382a4adSMilanka Ringwald 	// invalid con handle
723a382a4adSMilanka 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);
72440faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
725a382a4adSMilanka Ringwald 
726a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
727a382a4adSMilanka 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);
728a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
729a382a4adSMilanka Ringwald 	reset_query_state();
730a382a4adSMilanka Ringwald }
731a382a4adSMilanka Ringwald 
732a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_read_value_of_characteristics_by_uuid16)733a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid16){
734a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
735a382a4adSMilanka Ringwald 	reset_query_state();
736a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
737a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
738a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
739a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
740a382a4adSMilanka Ringwald 
741a382a4adSMilanka Ringwald 	reset_query_state();
742a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
743a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
744a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
745a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
746a382a4adSMilanka Ringwald 
747a382a4adSMilanka Ringwald 	reset_query_state();
748a382a4adSMilanka 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);
749a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
750a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
751a382a4adSMilanka Ringwald 
752a382a4adSMilanka Ringwald 	// invalid con handle
753a382a4adSMilanka 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);
75440faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
755a382a4adSMilanka Ringwald 
756a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
757a382a4adSMilanka 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);
758a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
759a382a4adSMilanka Ringwald 	reset_query_state();
760a382a4adSMilanka Ringwald }
761a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_read_value_of_characteristics_by_uuid128)762a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid128){
763a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
764a382a4adSMilanka Ringwald 	reset_query_state();
765a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
766a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
767a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
768a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
769a382a4adSMilanka Ringwald 
770a382a4adSMilanka Ringwald 	reset_query_state();
771a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
772a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
773a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
774a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
775a382a4adSMilanka Ringwald 
776a382a4adSMilanka Ringwald 	reset_query_state();
777a382a4adSMilanka 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);
778a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
779a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
780a382a4adSMilanka Ringwald 
781a382a4adSMilanka Ringwald 	// invalid con handle
782a382a4adSMilanka 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);
78340faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
784a382a4adSMilanka Ringwald 
785a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
786a382a4adSMilanka 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);
787a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
788a382a4adSMilanka Ringwald 	reset_query_state();
789a382a4adSMilanka Ringwald }
790a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_write_characteristic_descriptor_using_descriptor_handle)791a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_write_characteristic_descriptor_using_descriptor_handle){
792a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
793a382a4adSMilanka Ringwald 	reset_query_state();
794a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
795a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
796a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
797a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
798a382a4adSMilanka Ringwald 
799a382a4adSMilanka Ringwald 	reset_query_state();
800a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
801a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
802a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
803a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
804a382a4adSMilanka Ringwald 
805a382a4adSMilanka Ringwald 
806a382a4adSMilanka Ringwald 	reset_query_state();
807a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
808a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
809a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
810a382a4adSMilanka Ringwald 	CHECK_EQUAL(3, result_counter);
811a382a4adSMilanka Ringwald 
812a382a4adSMilanka Ringwald 	reset_query_state();
813a382a4adSMilanka 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);
814a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
815a382a4adSMilanka Ringwald 
816a382a4adSMilanka Ringwald 	// invalid con handle
817a382a4adSMilanka 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);
81840faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
819a382a4adSMilanka Ringwald 
820a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
821a382a4adSMilanka 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);
822a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
823a382a4adSMilanka Ringwald 	reset_query_state();
824a382a4adSMilanka Ringwald }
825a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_prepare_write)826a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_prepare_write){
827a382a4adSMilanka Ringwald 	reset_query_state();
828a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
829a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
830a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
831a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
832a382a4adSMilanka Ringwald 
833a382a4adSMilanka Ringwald 	reset_query_state();
834a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
835a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
836a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
837a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
838a382a4adSMilanka Ringwald 
839a382a4adSMilanka Ringwald 	reset_query_state();
840a382a4adSMilanka 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);
841a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
842a382a4adSMilanka Ringwald 
843a382a4adSMilanka Ringwald 	// invalid con handle
844a382a4adSMilanka 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);
84540faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
846a382a4adSMilanka Ringwald 
847a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
848a382a4adSMilanka 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);
849a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
850a382a4adSMilanka Ringwald 	reset_query_state();
851a382a4adSMilanka Ringwald }
852a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_execute_write)853a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_execute_write){
854a382a4adSMilanka Ringwald 	reset_query_state();
855a382a4adSMilanka Ringwald 	status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle);
856a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
857a382a4adSMilanka Ringwald 
858a382a4adSMilanka Ringwald 	// invalid con handle
859a382a4adSMilanka Ringwald     status = gatt_client_execute_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
86040faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
861a382a4adSMilanka Ringwald 
862a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
863a382a4adSMilanka Ringwald     status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle);
864a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
865a382a4adSMilanka Ringwald 	reset_query_state();
866a382a4adSMilanka Ringwald }
867a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_cancel_write)868a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_cancel_write){
869a382a4adSMilanka Ringwald 	reset_query_state();
870a382a4adSMilanka Ringwald 	status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle);
871a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
872a382a4adSMilanka Ringwald 
873a382a4adSMilanka Ringwald 	// invalid con handle
874a382a4adSMilanka Ringwald     status = gatt_client_cancel_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
87540faeb84SMilanka Ringwald  	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
876a382a4adSMilanka Ringwald 
877a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
878a382a4adSMilanka Ringwald     status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle);
879a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
880a382a4adSMilanka Ringwald 	reset_query_state();
881a382a4adSMilanka Ringwald }
882a382a4adSMilanka Ringwald 
TEST(GATTClient,TestReadCharacteristicValue)8834902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){
8844902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_VALUE;
8854902524cSMatthias Ringwald 	reset_query_state();
8864902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
8874902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
8884902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
8894902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
8904902524cSMatthias Ringwald 
8914902524cSMatthias Ringwald 	reset_query_state();
8924902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
8934902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
8944902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
8954902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
8964902524cSMatthias Ringwald 
8974902524cSMatthias Ringwald 	reset_query_state();
8984902524cSMatthias Ringwald 	status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
8994902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9004902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9014902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
9024902524cSMatthias Ringwald }
9034902524cSMatthias Ringwald 
TEST(GATTClient,TestWriteCharacteristicValue)9044902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){
9054902524cSMatthias Ringwald     test = WRITE_CHARACTERISTIC_VALUE;
9064902524cSMatthias Ringwald 	reset_query_state();
9074902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
9084902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9094902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9104902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9114902524cSMatthias Ringwald 
9124902524cSMatthias Ringwald 	reset_query_state();
9134902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
9144902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9154902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9164902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9174902524cSMatthias Ringwald 
9188404d3b7SMilanka Ringwald // invalid con handle
9198404d3b7SMilanka 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);
92040faeb84SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
9218404d3b7SMilanka Ringwald 
9228404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
9238404d3b7SMilanka 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);
9248404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
9258404d3b7SMilanka Ringwald 
9268404d3b7SMilanka Ringwald 
9274902524cSMatthias Ringwald 	reset_query_state();
9284902524cSMatthias 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);
9294902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9304902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9314902524cSMatthias Ringwald }
9324902524cSMatthias Ringwald 
TEST(GATTClient,TestWriteCharacteristicDescriptor)9334902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){
9344902524cSMatthias Ringwald 	test = WRITE_CHARACTERISTIC_DESCRIPTOR;
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_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
9494902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9504902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9514902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
9524902524cSMatthias Ringwald 
9534902524cSMatthias Ringwald 	reset_query_state();
9544902524cSMatthias Ringwald 	status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication);
9554902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9564902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9574902524cSMatthias Ringwald }
9584902524cSMatthias Ringwald 
TEST(GATTClient,TestReadLongCharacteristicValue)9594902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){
9604902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_VALUE;
9614902524cSMatthias Ringwald 	reset_query_state();
9624902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
9634902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9644902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9654902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9664902524cSMatthias Ringwald 
9674902524cSMatthias Ringwald 	reset_query_state();
9684902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
9694902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9704902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9714902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9724902524cSMatthias Ringwald 
9734902524cSMatthias Ringwald 	reset_query_state();
9744902524cSMatthias Ringwald 	status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
9754902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9764902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
977464b6e7bSMatthias Ringwald 	CHECK_EQUAL(7, result_counter);
9784902524cSMatthias Ringwald }
9794902524cSMatthias Ringwald 
TEST(GATTClient,TestReadLongCharacteristicDescriptor)9804902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){
9814902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_DESCRIPTOR;
9824902524cSMatthias Ringwald 	reset_query_state();
9834902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
9844902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9854902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9864902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9874902524cSMatthias Ringwald 
9884902524cSMatthias Ringwald 	reset_query_state();
9894902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
9904902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9914902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9924902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9934902524cSMatthias Ringwald 
9944902524cSMatthias Ringwald 	reset_query_state();
9954902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
9964902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9974902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9984902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
9994902524cSMatthias Ringwald 
10004902524cSMatthias Ringwald 	reset_query_state();
10014902524cSMatthias Ringwald 	result_counter = 0;
10024902524cSMatthias Ringwald 	status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
10034902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10044902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1005464b6e7bSMatthias Ringwald 	CHECK_EQUAL(7, result_counter);
10064902524cSMatthias Ringwald }
10074902524cSMatthias Ringwald 
10084902524cSMatthias Ringwald 
TEST(GATTClient,TestWriteLongCharacteristicDescriptor)10094902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){
10104902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR;
10114902524cSMatthias Ringwald 	reset_query_state();
10124902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
10134902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10144902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10154902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10164902524cSMatthias Ringwald 
10174902524cSMatthias Ringwald 	reset_query_state();
10184902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
10194902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10204902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10214902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10224902524cSMatthias Ringwald 
10234902524cSMatthias Ringwald 	reset_query_state();
10244902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
10254902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10264902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10274902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
10284902524cSMatthias Ringwald 
10294902524cSMatthias Ringwald 	result_counter = 0;
10304902524cSMatthias Ringwald 	status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value);
10314902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10324902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10334902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
1034*54459808SMilanka Ringwald 
1035*54459808SMilanka Ringwald 	result_counter = 0;
1036*54459808SMilanka Ringwald 	status = gatt_client_write_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, descriptors[0].handle, 0, sizeof(long_value), (uint8_t *)long_value);
1037*54459808SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
10384902524cSMatthias Ringwald }
10394902524cSMatthias Ringwald 
TEST(GATTClient,TestWriteLongCharacteristicValue)10404902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){
10414902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_VALUE;
10424902524cSMatthias Ringwald 	reset_query_state();
10434902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
10444902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10454902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10464902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10474902524cSMatthias Ringwald 
10484902524cSMatthias Ringwald 	reset_query_state();
10494902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
10504902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10514902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10524902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10534902524cSMatthias Ringwald 
10544902524cSMatthias Ringwald 
10554902524cSMatthias Ringwald 	reset_query_state();
10564902524cSMatthias 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);
10574902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10584902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10594902524cSMatthias Ringwald }
10604902524cSMatthias Ringwald 
TEST(GATTClient,TestWriteReliableLongCharacteristicValue)10614902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){
10624902524cSMatthias Ringwald 	test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE;
10634902524cSMatthias Ringwald 	reset_query_state();
10644902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
10654902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10664902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10674902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10684902524cSMatthias Ringwald 
10694902524cSMatthias Ringwald 	reset_query_state();
10704902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
10714902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10724902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10734902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10744902524cSMatthias Ringwald 
10758404d3b7SMilanka Ringwald 	// invalid con handle
10768404d3b7SMilanka 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);
107740faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
10788404d3b7SMilanka Ringwald 
10798404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
10808404d3b7SMilanka 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);
10818404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
10828404d3b7SMilanka Ringwald 
10834902524cSMatthias Ringwald     reset_query_state();
10844902524cSMatthias 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);
10854902524cSMatthias Ringwald     CHECK_EQUAL(0, status);
10864902524cSMatthias Ringwald     CHECK_EQUAL(1, gatt_query_complete);
1087*54459808SMilanka Ringwald 
1088*54459808SMilanka Ringwald     set_wrong_gatt_client_state();
1089*54459808SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_context(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value, 0xF100, 0);
1090*54459808SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1091*54459808SMilanka Ringwald 
1092*54459808SMilanka Ringwald 	reset_query_state();
1093*54459808SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_context(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value, 0xF100, 0);
1094*54459808SMilanka Ringwald 	CHECK_EQUAL(0, status);
1095*54459808SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10964902524cSMatthias Ringwald }
10974902524cSMatthias Ringwald 
TEST(GATTClient,gatt_client_write_long_value_of_characteristic_with_offset)10988404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){
10998404d3b7SMilanka Ringwald 	reset_query_state();
11008404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
11018404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11028404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11038404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11048404d3b7SMilanka Ringwald 
11058404d3b7SMilanka Ringwald 	reset_query_state();
11068404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
11078404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11088404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11098404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11108404d3b7SMilanka Ringwald 
11118404d3b7SMilanka Ringwald 	reset_query_state();
11128404d3b7SMilanka 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);
11138404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11148404d3b7SMilanka Ringwald 
11158404d3b7SMilanka Ringwald 	reset_query_state();
11168404d3b7SMilanka Ringwald 	// invalid con handle
11178404d3b7SMilanka 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);
111840faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
11198404d3b7SMilanka Ringwald 
11208404d3b7SMilanka Ringwald     reset_query_state();
11218404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
11228404d3b7SMilanka 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);
11238404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1124*54459808SMilanka Ringwald 
1125*54459808SMilanka Ringwald     	reset_query_state();
1126*54459808SMilanka Ringwald 	// invalid con handle
1127*54459808SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_context(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value, 0, 0);
1128*54459808SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
1129*54459808SMilanka Ringwald 
1130*54459808SMilanka Ringwald     reset_query_state();
1131*54459808SMilanka Ringwald     set_wrong_gatt_client_state();
1132*54459808SMilanka Ringwald 	status = gatt_client_write_long_value_of_characteristic_with_context(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value, 0, 0);
1133*54459808SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
11348404d3b7SMilanka Ringwald }
11358404d3b7SMilanka Ringwald 
TEST(GATTClient,gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset)11368404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){
11378404d3b7SMilanka Ringwald 	reset_query_state();
11388404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
11398404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11408404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11418404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11428404d3b7SMilanka Ringwald 
1143472021f2SMatthias Ringwald     reset_query_state();
1144472021f2SMatthias Ringwald     status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
1145472021f2SMatthias Ringwald     CHECK_EQUAL(0, status);
1146472021f2SMatthias Ringwald     CHECK_EQUAL(1, gatt_query_complete);
1147472021f2SMatthias Ringwald     verify_charasteristics();
1148472021f2SMatthias Ringwald 
11498404d3b7SMilanka Ringwald 	reset_query_state();
11508404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
11518404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11528404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
115361027ef7SMatthias Ringwald 	CHECK(result_counter != 0);
11548404d3b7SMilanka Ringwald 	CHECK_EQUAL(3, result_index);
11558404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
11568404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
11578404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
11588404d3b7SMilanka Ringwald 
11598404d3b7SMilanka Ringwald 	reset_query_state();
11608404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0);
11618404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11628404d3b7SMilanka Ringwald 
11638404d3b7SMilanka Ringwald 	reset_query_state();
11648404d3b7SMilanka Ringwald 	// invalid con handle
11658404d3b7SMilanka 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);
116640faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
11678404d3b7SMilanka Ringwald 
11688404d3b7SMilanka Ringwald     reset_query_state();
11698404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
11708404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0);
11718404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
11728404d3b7SMilanka Ringwald }
11738404d3b7SMilanka Ringwald 
TEST(GATTClient,gatt_client_read_multiple_characteristic_values)11748404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){
11758404d3b7SMilanka Ringwald 	reset_query_state();
11768404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
11778404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11788404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11798404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11808404d3b7SMilanka Ringwald 
11818404d3b7SMilanka Ringwald 	reset_query_state();
11828404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
11838404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11848404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11858404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11868404d3b7SMilanka Ringwald 
11878404d3b7SMilanka Ringwald 	uint16_t value_handles[] = {characteristics[0].value_handle};
11888404d3b7SMilanka Ringwald 
11898404d3b7SMilanka Ringwald 	reset_query_state();
11908404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles);
11918404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11928404d3b7SMilanka Ringwald 
11938404d3b7SMilanka Ringwald 	reset_query_state();
11948404d3b7SMilanka Ringwald 	// invalid con handle
11958404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles);
119640faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
11978404d3b7SMilanka Ringwald 
11988404d3b7SMilanka Ringwald 	reset_query_state();
11998404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
12008404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles);
12018404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
12028404d3b7SMilanka Ringwald }
12038404d3b7SMilanka Ringwald 
TEST(GATTClient,gatt_client_write_value_of_characteristic_without_response)12048404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){
12058404d3b7SMilanka Ringwald 	reset_query_state();
12068404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
12078404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12088404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12098404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12108404d3b7SMilanka Ringwald 
12118404d3b7SMilanka Ringwald 	reset_query_state();
12128404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
12138404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12148404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12158404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12168404d3b7SMilanka Ringwald 
12178404d3b7SMilanka Ringwald 	reset_query_state();
12188404d3b7SMilanka Ringwald 	// invalid con handle
12198404d3b7SMilanka 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);
122040faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
12218404d3b7SMilanka Ringwald 
12228404d3b7SMilanka Ringwald 	reset_query_state();
12238404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
12248404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
12258404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status);
12268404d3b7SMilanka Ringwald 
1227*54459808SMilanka Ringwald     l2cap_set_can_send_fixed_channel_packet_now(false);
1228*54459808SMilanka Ringwald     status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value);
1229*54459808SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_BUSY, status);
1230*54459808SMilanka Ringwald 
12318404d3b7SMilanka Ringwald 	reset_query_state();
12328404d3b7SMilanka Ringwald 
12338404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value);
12348404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12358404d3b7SMilanka Ringwald }
12364902524cSMatthias Ringwald 
TEST(GATTClient,gatt_client_is_ready)1237a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_is_ready){
1238a382a4adSMilanka Ringwald 	int status = gatt_client_is_ready(HCI_CON_HANDLE_INVALID);
1239a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1240a382a4adSMilanka Ringwald 
1241a382a4adSMilanka Ringwald 	status = gatt_client_is_ready(gatt_client_handle);
1242a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, status);
1243a382a4adSMilanka Ringwald }
1244a382a4adSMilanka Ringwald 
1245a382a4adSMilanka Ringwald 
TEST(GATTClient,register_for_notification)1246a382a4adSMilanka Ringwald TEST(GATTClient, register_for_notification){
1247a382a4adSMilanka Ringwald 	reset_query_state();
1248a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
1249a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1250a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1251a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1252a382a4adSMilanka Ringwald 
1253a382a4adSMilanka Ringwald 	reset_query_state();
1254a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
1255a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1256a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1257a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1258a382a4adSMilanka Ringwald 
1259a382a4adSMilanka Ringwald 	gatt_client_notification_t notification;
1260a382a4adSMilanka Ringwald 
1261a382a4adSMilanka Ringwald 	gatt_client_listen_for_characteristic_value_updates(&notification, handle_ble_client_event, gatt_client_handle, &characteristics[0]);
1262a382a4adSMilanka Ringwald 	gatt_client_stop_listening_for_characteristic_value_updates(&notification);
1263a382a4adSMilanka Ringwald 
1264a382a4adSMilanka Ringwald 	gatt_client_listen_for_characteristic_value_updates(&notification, handle_ble_client_event, gatt_client_handle, NULL);
1265a382a4adSMilanka Ringwald 	gatt_client_stop_listening_for_characteristic_value_updates(&notification);
1266*54459808SMilanka Ringwald 
1267*54459808SMilanka Ringwald     gatt_client_service_notification_t service_notification;
1268*54459808SMilanka Ringwald     gatt_client_listen_for_service_characteristic_value_updates(&service_notification, handle_ble_client_event, gatt_client_handle, &services[0], 0xF100, 0);
1269*54459808SMilanka Ringwald     gatt_client_stop_listening_for_service_characteristic_value_updates(&service_notification);
1270a382a4adSMilanka Ringwald }
1271a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_signed_write_without_response)1272a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_signed_write_without_response){
1273a382a4adSMilanka Ringwald 	reset_query_state();
1274a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
1275a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1276a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1277a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1278a382a4adSMilanka Ringwald 
1279a382a4adSMilanka Ringwald 	reset_query_state();
1280a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
1281a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1282a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1283a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1284a382a4adSMilanka Ringwald 
1285a382a4adSMilanka Ringwald 	reset_query_state();
1286a382a4adSMilanka Ringwald 	// invalid con handle
1287a382a4adSMilanka 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);
128840faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
1289a382a4adSMilanka Ringwald 
1290a382a4adSMilanka Ringwald 	reset_query_state();
1291a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
1292a382a4adSMilanka 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);
1293a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1294a382a4adSMilanka Ringwald 
1295a382a4adSMilanka Ringwald 	reset_query_state();
1296a382a4adSMilanka Ringwald 
1297a382a4adSMilanka 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);
1298a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1299a382a4adSMilanka Ringwald }
1300a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_discover_secondary_services)1301a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_discover_secondary_services){
1302a382a4adSMilanka Ringwald 	reset_query_state();
1303a382a4adSMilanka Ringwald 	// invalid con handle
1304a382a4adSMilanka Ringwald 	status = gatt_client_discover_secondary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
130540faeb84SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
1306a382a4adSMilanka Ringwald 
1307a382a4adSMilanka Ringwald 	reset_query_state();
1308a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
1309a382a4adSMilanka Ringwald 	status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle);
1310a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1311a382a4adSMilanka Ringwald 
1312a382a4adSMilanka Ringwald 	reset_query_state();
1313a382a4adSMilanka Ringwald 
1314a382a4adSMilanka Ringwald 	status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle);
1315a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1316a382a4adSMilanka Ringwald }
1317a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_request_can_write_without_response_event)1318617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_request_can_write_without_response_event){
13197e4c9b5dSMatthias Ringwald 	uint8_t status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
132040faeb84SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
1321a382a4adSMilanka Ringwald 
132240faeb84SMilanka Ringwald 	gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle);
1323617a2595SMilanka Ringwald 	CHECK_TRUE(gatt_client != NULL);
13247e4c9b5dSMatthias Ringwald 	gatt_client->write_without_response_callback = handle_ble_client_event;
1325617a2595SMilanka Ringwald 	status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle);
1326617a2595SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1327617a2595SMilanka Ringwald 
1328617a2595SMilanka Ringwald 	gatt_client->write_without_response_callback = NULL;
1329617a2595SMilanka Ringwald 	status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle);
1330617a2595SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
1331617a2595SMilanka Ringwald }
1332617a2595SMilanka Ringwald 
TEST(GATTClient,gatt_client_request_to_write_without_response)13337e4c9b5dSMatthias Ringwald TEST(GATTClient, gatt_client_request_to_write_without_response){
13347e4c9b5dSMatthias Ringwald     btstack_context_callback_registration_t callback_registration = { 0 };
13357e4c9b5dSMatthias Ringwald     uint8_t status = gatt_client_request_to_write_without_response(&callback_registration, HCI_CON_HANDLE_INVALID);
13367e4c9b5dSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
13377e4c9b5dSMatthias Ringwald 
13387e4c9b5dSMatthias Ringwald     status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle);
13397e4c9b5dSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
13407e4c9b5dSMatthias Ringwald }
13417e4c9b5dSMatthias Ringwald 
dummy_callback(void * context)13425fe445cbSMatthias Ringwald static void dummy_callback(void * context){
13435fe445cbSMatthias Ringwald     (void) context;
13445fe445cbSMatthias Ringwald }
TEST(GATTClient,gatt_client_request_to_send_gatt_query)13455fe445cbSMatthias Ringwald TEST(GATTClient, gatt_client_request_to_send_gatt_query){
13465fe445cbSMatthias Ringwald     btstack_context_callback_registration_t callback_registration = { 0 };
13475fe445cbSMatthias Ringwald     callback_registration.callback = &dummy_callback;
13485fe445cbSMatthias Ringwald 
13495fe445cbSMatthias Ringwald     uint8_t status = gatt_client_request_to_send_gatt_query(&callback_registration, HCI_CON_HANDLE_INVALID);
13505fe445cbSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
13515fe445cbSMatthias Ringwald 
13525fe445cbSMatthias Ringwald     status = gatt_client_request_to_send_gatt_query(&callback_registration, gatt_client_handle);
13535fe445cbSMatthias Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
13545fe445cbSMatthias Ringwald }
13555fe445cbSMatthias Ringwald 
TEST(GATTClient,gatt_client_send_mtu_negotiation)1356617a2595SMilanka Ringwald TEST(GATTClient, gatt_client_send_mtu_negotiation){
1357617a2595SMilanka Ringwald 	gatt_client_send_mtu_negotiation(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
1358617a2595SMilanka Ringwald 
1359617a2595SMilanka Ringwald 	gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle);
1360617a2595SMilanka Ringwald 
136140faeb84SMilanka Ringwald 	gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle);
1362617a2595SMilanka Ringwald 	CHECK_TRUE(gatt_client != NULL);
1363617a2595SMilanka Ringwald 	gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED;
1364617a2595SMilanka Ringwald 	gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle);
1365617a2595SMilanka Ringwald 
1366617a2595SMilanka Ringwald 	gatt_client->mtu_state = SEND_MTU_EXCHANGE;
1367617a2595SMilanka Ringwald }
1368a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_get_mtu)1369a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_get_mtu){
1370a382a4adSMilanka Ringwald 	reset_query_state();
1371a382a4adSMilanka Ringwald 	uint16_t mtu;
1372a382a4adSMilanka Ringwald 	int status = gatt_client_get_mtu(HCI_CON_HANDLE_INVALID, &mtu);
137340faeb84SMilanka Ringwald 	CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
1374a382a4adSMilanka Ringwald 
1375a382a4adSMilanka Ringwald 	status = gatt_client_get_mtu(gatt_client_handle, &mtu);
1376a382a4adSMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1377a382a4adSMilanka Ringwald 	CHECK_EQUAL(ATT_DEFAULT_MTU, mtu);
1378a382a4adSMilanka Ringwald 
137940faeb84SMilanka Ringwald 	gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle);
1380a382a4adSMilanka Ringwald 	CHECK_TRUE(gatt_client != NULL);
1381a382a4adSMilanka Ringwald 	gatt_client->mtu = 30;
1382a382a4adSMilanka Ringwald 
1383a382a4adSMilanka Ringwald 	gatt_client->mtu_state = MTU_EXCHANGED;
1384a382a4adSMilanka Ringwald 	status = gatt_client_get_mtu(gatt_client_handle, &mtu);
1385a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1386a382a4adSMilanka Ringwald 	CHECK_EQUAL(gatt_client->mtu, mtu);
1387a382a4adSMilanka Ringwald 
1388a382a4adSMilanka Ringwald 	gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED;
1389a382a4adSMilanka Ringwald 	status = gatt_client_get_mtu(gatt_client_handle, &mtu);
1390a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1391a382a4adSMilanka Ringwald 	CHECK_EQUAL(gatt_client->mtu, mtu);
1392a382a4adSMilanka Ringwald 
1393a382a4adSMilanka Ringwald 	gatt_client->mtu_state = SEND_MTU_EXCHANGE;
1394a382a4adSMilanka Ringwald }
1395a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_deserialize_characteristic_descriptor)1396369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_characteristic_descriptor){
1397369697acSMilanka Ringwald 	gatt_client_characteristic_descriptor_t descriptor;
1398369697acSMilanka Ringwald 
1399369697acSMilanka Ringwald 	uint8_t packet[18];
1400369697acSMilanka Ringwald 	uint16_t expected_handle = 0x1234;
1401369697acSMilanka Ringwald 	uint16_t expected_uuid16 = 0xABCD;
1402369697acSMilanka Ringwald 
1403369697acSMilanka Ringwald 	uint8_t uuid128[16];
1404369697acSMilanka Ringwald 	uuid_add_bluetooth_prefix(uuid128, expected_uuid16);
1405369697acSMilanka Ringwald 
1406369697acSMilanka Ringwald 	little_endian_store_16(packet, 0, expected_handle);
1407369697acSMilanka Ringwald 	reverse_128(uuid128, &packet[2]);
1408369697acSMilanka Ringwald 
1409369697acSMilanka Ringwald 	// uuid16 with Bluetooth prefix
1410369697acSMilanka Ringwald 	gatt_client_deserialize_characteristic_descriptor(packet, 0, &descriptor);
1411369697acSMilanka Ringwald 	CHECK_EQUAL(descriptor.handle, expected_handle);
1412369697acSMilanka Ringwald 	CHECK_EQUAL(descriptor.uuid16, expected_uuid16);
1413369697acSMilanka Ringwald 	MEMCMP_EQUAL(uuid128, descriptor.uuid128, sizeof(uuid128));
1414369697acSMilanka Ringwald 
1415369697acSMilanka Ringwald 	// uuid128
1416369697acSMilanka Ringwald 	memset(&uuid128[4], 0xaa, 12);
1417369697acSMilanka Ringwald 	reverse_128(uuid128, &packet[2]);
1418369697acSMilanka Ringwald 
1419369697acSMilanka Ringwald 	gatt_client_deserialize_characteristic_descriptor(packet, 0, &descriptor);
1420369697acSMilanka Ringwald 	CHECK_EQUAL(descriptor.handle, expected_handle);
1421369697acSMilanka Ringwald 	CHECK_EQUAL(descriptor.uuid16, 0);
1422369697acSMilanka Ringwald 	MEMCMP_EQUAL(uuid128, descriptor.uuid128, sizeof(uuid128));
1423369697acSMilanka Ringwald }
1424369697acSMilanka Ringwald 
TEST(GATTClient,gatt_client_deserialize_service)1425369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_service){
1426369697acSMilanka Ringwald 	gatt_client_service_t service;
1427369697acSMilanka Ringwald 
1428369697acSMilanka Ringwald 	uint8_t packet[20];
1429369697acSMilanka Ringwald 	uint16_t expected_start_group_handle = 0x1234;
1430369697acSMilanka Ringwald 	uint16_t expected_end_group_handle   = 0x5678;
1431369697acSMilanka Ringwald 	uint16_t expected_uuid16             = 0xABCD;
1432369697acSMilanka Ringwald 
1433369697acSMilanka Ringwald 	uint8_t uuid128[16];
1434369697acSMilanka Ringwald 	uuid_add_bluetooth_prefix(uuid128, expected_uuid16);
1435369697acSMilanka Ringwald 
1436369697acSMilanka Ringwald 	little_endian_store_16(packet, 0, expected_start_group_handle);
1437369697acSMilanka Ringwald 	little_endian_store_16(packet, 2, expected_end_group_handle);
1438369697acSMilanka Ringwald 	reverse_128(uuid128, &packet[4]);
1439369697acSMilanka Ringwald 
1440369697acSMilanka Ringwald 	// uuid16 with Bluetooth prefix
1441369697acSMilanka Ringwald 	gatt_client_deserialize_service(packet, 0, &service);
1442369697acSMilanka Ringwald 	CHECK_EQUAL(service.start_group_handle, expected_start_group_handle);
1443369697acSMilanka Ringwald 	CHECK_EQUAL(service.end_group_handle  , expected_end_group_handle);
1444369697acSMilanka Ringwald 	CHECK_EQUAL(service.uuid16, expected_uuid16);
1445369697acSMilanka Ringwald 	MEMCMP_EQUAL(uuid128, service.uuid128, sizeof(uuid128));
1446369697acSMilanka Ringwald 
1447369697acSMilanka Ringwald 	// uuid128
1448369697acSMilanka Ringwald 	memset(&uuid128[4], 0xaa, 12);
1449369697acSMilanka Ringwald 	reverse_128(uuid128, &packet[4]);
1450369697acSMilanka Ringwald 
1451369697acSMilanka Ringwald 	gatt_client_deserialize_service(packet, 0, &service);
1452369697acSMilanka Ringwald 	CHECK_EQUAL(service.start_group_handle, expected_start_group_handle);
1453369697acSMilanka Ringwald 	CHECK_EQUAL(service.end_group_handle  , expected_end_group_handle);
1454369697acSMilanka Ringwald 	CHECK_EQUAL(service.uuid16, 0);
1455369697acSMilanka Ringwald 	MEMCMP_EQUAL(uuid128, service.uuid128, sizeof(uuid128));
1456369697acSMilanka Ringwald }
1457369697acSMilanka Ringwald 
TEST(GATTClient,gatt_client_deserialize_characteristic)1458369697acSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_characteristic){
1459369697acSMilanka Ringwald 	gatt_client_characteristic_t characteristic;
1460369697acSMilanka Ringwald 
1461369697acSMilanka Ringwald 	uint8_t packet[24];
1462369697acSMilanka Ringwald 	uint16_t expected_start_handle = 0x1234;
1463369697acSMilanka Ringwald 	uint16_t expected_value_handle = 0x3455;
1464369697acSMilanka Ringwald 	uint16_t expected_end_handle   = 0x5678;
1465369697acSMilanka Ringwald 	uint16_t expected_properties   = 0x6789;
1466369697acSMilanka Ringwald 
1467369697acSMilanka Ringwald 	uint16_t expected_uuid16             = 0xABCD;
1468369697acSMilanka Ringwald 
1469369697acSMilanka Ringwald 	uint8_t uuid128[16];
1470369697acSMilanka Ringwald 	uuid_add_bluetooth_prefix(uuid128, expected_uuid16);
1471369697acSMilanka Ringwald 
1472369697acSMilanka Ringwald 	little_endian_store_16(packet, 0, expected_start_handle);
1473369697acSMilanka Ringwald 	little_endian_store_16(packet, 2, expected_value_handle);
1474369697acSMilanka Ringwald 	little_endian_store_16(packet, 4, expected_end_handle);
1475369697acSMilanka Ringwald 	little_endian_store_16(packet, 6, expected_properties);
1476369697acSMilanka Ringwald 	reverse_128(uuid128, &packet[8]);
1477369697acSMilanka Ringwald 
1478369697acSMilanka Ringwald 	// uuid16 with Bluetooth prefix
1479369697acSMilanka Ringwald 	gatt_client_deserialize_characteristic(packet, 0, &characteristic);
1480369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.start_handle, expected_start_handle);
1481369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.value_handle, expected_value_handle);
1482369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.end_handle  , expected_end_handle);
1483369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.properties  , expected_properties);
1484369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.uuid16, expected_uuid16);
1485369697acSMilanka Ringwald 	MEMCMP_EQUAL(uuid128, characteristic.uuid128, sizeof(uuid128));
1486369697acSMilanka Ringwald 
1487369697acSMilanka Ringwald 	// uuid128
1488369697acSMilanka Ringwald 	memset(&uuid128[4], 0xaa, 12);
1489369697acSMilanka Ringwald 	reverse_128(uuid128, &packet[8]);
1490369697acSMilanka Ringwald 
1491369697acSMilanka Ringwald 	gatt_client_deserialize_characteristic(packet, 0, &characteristic);
1492369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.start_handle, expected_start_handle);
1493369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.value_handle, expected_value_handle);
1494369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.end_handle  , expected_end_handle);
1495369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.properties  , expected_properties);
1496369697acSMilanka Ringwald 	CHECK_EQUAL(characteristic.uuid16, 0);
1497369697acSMilanka Ringwald 	MEMCMP_EQUAL(uuid128, characteristic.uuid128, sizeof(uuid128));
1498369697acSMilanka Ringwald }
1499a382a4adSMilanka Ringwald 
TEST(GATTClient,gatt_client_remove_gatt_query)1500*54459808SMilanka Ringwald TEST(GATTClient, gatt_client_remove_gatt_query) {
1501*54459808SMilanka Ringwald     btstack_context_callback_registration_t callback_registration = { 0 };
1502*54459808SMilanka Ringwald 
1503*54459808SMilanka Ringwald     uint8_t status = gatt_client_remove_gatt_query(&callback_registration, HCI_CON_HANDLE_INVALID);
1504*54459808SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
1505*54459808SMilanka Ringwald 
1506*54459808SMilanka Ringwald     status = gatt_client_remove_gatt_query(&callback_registration, gatt_client_handle);
1507*54459808SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
1508*54459808SMilanka Ringwald }
1509*54459808SMilanka Ringwald 
TEST(GATTClient,gatt_client_att_status_to_error_code)1510*54459808SMilanka Ringwald TEST(GATTClient, gatt_client_att_status_to_error_code) {
1511*54459808SMilanka Ringwald     uint8_t status = gatt_client_att_status_to_error_code(ATT_ERROR_SUCCESS);
1512*54459808SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
1513*54459808SMilanka Ringwald 
1514*54459808SMilanka Ringwald     status = gatt_client_att_status_to_error_code(ATT_ERROR_INVALID_ATTRIBUTE_VALUE_LENGTH);
1515*54459808SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_PARAMETER_OUT_OF_MANDATORY_RANGE, status);
1516*54459808SMilanka Ringwald 
1517*54459808SMilanka Ringwald     status = gatt_client_att_status_to_error_code(ATT_ERROR_UNLIKELY_ERROR);
1518*54459808SMilanka Ringwald     CHECK_EQUAL(ERROR_CODE_UNSPECIFIED_ERROR, status);
1519*54459808SMilanka Ringwald }
1520*54459808SMilanka Ringwald 
TEST(GATTClient,gatt_client_att_packet_handler)1521*54459808SMilanka Ringwald TEST(GATTClient, gatt_client_att_packet_handler) {
1522*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(0, 0, NULL, 0);
1523*54459808SMilanka Ringwald 
1524*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(HCI_EVENT_PACKET, 0, NULL, 0);
1525*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(ATT_DATA_PACKET, 0, NULL, 0);
1526*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(L2CAP_DATA_PACKET, 0, NULL, 0);
1527*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(10, 0, NULL, 0);
1528*54459808SMilanka Ringwald 
1529*54459808SMilanka Ringwald     uint8_t packet[10];
1530*54459808SMilanka Ringwald     little_endian_store_16(packet, 0, ATT_EVENT_MTU_EXCHANGE_COMPLETE);
1531*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(HCI_EVENT_PACKET, HCI_CON_HANDLE_INVALID, packet, 2);
1532*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(HCI_EVENT_PACKET, HCI_CON_HANDLE_INVALID, packet, 10);
1533*54459808SMilanka Ringwald     little_endian_store_16(packet, 0, ATT_EVENT_MTU_EXCHANGE_COMPLETE + 2);
1534*54459808SMilanka Ringwald     gatt_client_att_packet_handler_fuzz(HCI_EVENT_PACKET, HCI_CON_HANDLE_INVALID, packet, 10);
1535*54459808SMilanka Ringwald 
1536*54459808SMilanka Ringwald }
1537*54459808SMilanka Ringwald 
main(int argc,const char * argv[])15384902524cSMatthias Ringwald int main (int argc, const char * argv[]){
15394902524cSMatthias Ringwald 	att_set_db(profile_data);
15404902524cSMatthias Ringwald 	att_set_write_callback(&att_write_callback);
15414902524cSMatthias Ringwald 	att_set_read_callback(&att_read_callback);
15424902524cSMatthias Ringwald 
15434902524cSMatthias Ringwald 	gatt_client_init();
15444902524cSMatthias Ringwald 
15454902524cSMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
15464902524cSMatthias Ringwald }
1547