xref: /btstack/test/gatt_client/gatt_client_test.cpp (revision 4902524cc6a45a01cfead054f48b6584dbb1f1cc)
1*4902524cSMatthias Ringwald 
2*4902524cSMatthias Ringwald // *****************************************************************************
3*4902524cSMatthias Ringwald //
4*4902524cSMatthias Ringwald // test rfcomm query tests
5*4902524cSMatthias Ringwald //
6*4902524cSMatthias Ringwald // *****************************************************************************
7*4902524cSMatthias Ringwald 
8*4902524cSMatthias Ringwald 
9*4902524cSMatthias Ringwald #include <stdint.h>
10*4902524cSMatthias Ringwald #include <stdio.h>
11*4902524cSMatthias Ringwald #include <stdlib.h>
12*4902524cSMatthias Ringwald #include <string.h>
13*4902524cSMatthias Ringwald 
14*4902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
15*4902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
16*4902524cSMatthias Ringwald 
17*4902524cSMatthias Ringwald #include "hci_cmd.h"
18*4902524cSMatthias Ringwald 
19*4902524cSMatthias Ringwald #include "btstack_memory.h"
20*4902524cSMatthias Ringwald #include "hci.h"
21*4902524cSMatthias Ringwald #include "hci_dump.h"
22*4902524cSMatthias Ringwald #include "ble/gatt_client.h"
23*4902524cSMatthias Ringwald #include "ble/att_db.h"
24*4902524cSMatthias Ringwald #include "profile.h"
25*4902524cSMatthias Ringwald #include "expected_results.h"
26*4902524cSMatthias Ringwald 
27*4902524cSMatthias Ringwald static uint16_t gatt_client_handle = 0x40;
28*4902524cSMatthias Ringwald static int gatt_query_complete = 0;
29*4902524cSMatthias Ringwald 
30*4902524cSMatthias Ringwald typedef enum {
31*4902524cSMatthias Ringwald 	IDLE,
32*4902524cSMatthias Ringwald 	DISCOVER_PRIMARY_SERVICES,
33*4902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID16,
34*4902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID128,
35*4902524cSMatthias Ringwald 
36*4902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16,
37*4902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128,
38*4902524cSMatthias Ringwald 
39*4902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16,
40*4902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128,
41*4902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID16,
42*4902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID128,
43*4902524cSMatthias Ringwald 	DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID,
44*4902524cSMatthias Ringwald 
45*4902524cSMatthias Ringwald 	READ_CHARACTERISTIC_VALUE,
46*4902524cSMatthias Ringwald 	READ_LONG_CHARACTERISTIC_VALUE,
47*4902524cSMatthias Ringwald 	WRITE_CHARACTERISTIC_VALUE,
48*4902524cSMatthias Ringwald 	WRITE_LONG_CHARACTERISTIC_VALUE,
49*4902524cSMatthias Ringwald 
50*4902524cSMatthias Ringwald     DISCOVER_CHARACTERISTIC_DESCRIPTORS,
51*4902524cSMatthias Ringwald     READ_CHARACTERISTIC_DESCRIPTOR,
52*4902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_DESCRIPTOR,
53*4902524cSMatthias Ringwald     WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION,
54*4902524cSMatthias Ringwald     READ_LONG_CHARACTERISTIC_DESCRIPTOR,
55*4902524cSMatthias Ringwald     WRITE_LONG_CHARACTERISTIC_DESCRIPTOR,
56*4902524cSMatthias Ringwald     WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE,
57*4902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE
58*4902524cSMatthias Ringwald } current_test_t;
59*4902524cSMatthias Ringwald 
60*4902524cSMatthias Ringwald current_test_t test = IDLE;
61*4902524cSMatthias Ringwald 
62*4902524cSMatthias Ringwald uint8_t  characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb};
63*4902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000;
64*4902524cSMatthias Ringwald 
65*4902524cSMatthias Ringwald static int result_index;
66*4902524cSMatthias Ringwald static uint8_t result_counter;
67*4902524cSMatthias Ringwald 
68*4902524cSMatthias Ringwald static gatt_client_service_t services[50];
69*4902524cSMatthias Ringwald static gatt_client_service_t included_services[50];
70*4902524cSMatthias Ringwald 
71*4902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50];
72*4902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50];
73*4902524cSMatthias Ringwald 
74*4902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void);
75*4902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void);
76*4902524cSMatthias Ringwald 
77*4902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
78*4902524cSMatthias Ringwald 	for (int i=0; i<size; i++){
79*4902524cSMatthias Ringwald 		BYTES_EQUAL(expected[i], actual[i]);
80*4902524cSMatthias Ringwald 	}
81*4902524cSMatthias Ringwald }
82*4902524cSMatthias Ringwald 
83*4902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) {
84*4902524cSMatthias Ringwald     printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
85*4902524cSMatthias Ringwald            uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
86*4902524cSMatthias Ringwald            uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
87*4902524cSMatthias Ringwald }
88*4902524cSMatthias Ringwald 
89*4902524cSMatthias Ringwald //static int counter = 0;
90*4902524cSMatthias 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){
91*4902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16);
92*4902524cSMatthias Ringwald 	if (!exp_handles) return;
93*4902524cSMatthias Ringwald 	CHECK_EQUAL(exp_handles[0], start_handle);
94*4902524cSMatthias Ringwald  	CHECK_EQUAL(exp_handles[1], end_handle);
95*4902524cSMatthias Ringwald }
96*4902524cSMatthias Ringwald 
97*4902524cSMatthias Ringwald // -----------------------------------------------------
98*4902524cSMatthias Ringwald 
99*4902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){
100*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
101*4902524cSMatthias 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);
102*4902524cSMatthias Ringwald }
103*4902524cSMatthias Ringwald 
104*4902524cSMatthias Ringwald 
105*4902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){
106*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
107*4902524cSMatthias 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);
108*4902524cSMatthias Ringwald }
109*4902524cSMatthias Ringwald 
110*4902524cSMatthias Ringwald static void verify_primary_services(void){
111*4902524cSMatthias Ringwald 	CHECK_EQUAL(6, result_index);
112*4902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
113*4902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle);
114*4902524cSMatthias Ringwald 	}
115*4902524cSMatthias Ringwald }
116*4902524cSMatthias Ringwald 
117*4902524cSMatthias Ringwald static void verify_included_services_uuid16(void){
118*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
119*4902524cSMatthias 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);
120*4902524cSMatthias Ringwald }
121*4902524cSMatthias Ringwald 
122*4902524cSMatthias Ringwald static void verify_included_services_uuid128(void){
123*4902524cSMatthias Ringwald 	CHECK_EQUAL(2, result_index);
124*4902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
125*4902524cSMatthias 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);
126*4902524cSMatthias Ringwald 	}
127*4902524cSMatthias Ringwald }
128*4902524cSMatthias Ringwald 
129*4902524cSMatthias Ringwald static void verify_charasteristics(void){
130*4902524cSMatthias Ringwald 	CHECK_EQUAL(15, result_index);
131*4902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
132*4902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle);
133*4902524cSMatthias Ringwald     }
134*4902524cSMatthias Ringwald }
135*4902524cSMatthias Ringwald 
136*4902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){
137*4902524cSMatthias Ringwald 	uint8_t * expected_value = (uint8_t*)&long_value[value_offset];
138*4902524cSMatthias Ringwald     CHECK(value_length);
139*4902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(expected_value, value, value_length);
140*4902524cSMatthias Ringwald     if (value_offset + value_length != sizeof(long_value)) return;
141*4902524cSMatthias Ringwald     result_counter++;
142*4902524cSMatthias Ringwald }
143*4902524cSMatthias Ringwald 
144*4902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
145*4902524cSMatthias Ringwald 	if (packet_type != HCI_EVENT_PACKET) return;
146*4902524cSMatthias Ringwald 	uint8_t status;
147*4902524cSMatthias Ringwald 	gatt_client_service_t service;
148*4902524cSMatthias Ringwald 	gatt_client_characteristic_t characteristic;
149*4902524cSMatthias Ringwald 	gatt_client_characteristic_descriptor_t descriptor;
150*4902524cSMatthias Ringwald 	switch (packet[0]){
151*4902524cSMatthias Ringwald 		case GATT_EVENT_QUERY_COMPLETE:
152*4902524cSMatthias Ringwald 			status = packet[4];
153*4902524cSMatthias Ringwald             gatt_query_complete = 1;
154*4902524cSMatthias Ringwald             if (status){
155*4902524cSMatthias Ringwald                 gatt_query_complete = 0;
156*4902524cSMatthias Ringwald                 printf("GATT_EVENT_QUERY_COMPLETE failed with status 0x%02X\n", status);
157*4902524cSMatthias Ringwald             }
158*4902524cSMatthias Ringwald             break;
159*4902524cSMatthias Ringwald 		case GATT_EVENT_SERVICE_QUERY_RESULT:
160*4902524cSMatthias Ringwald 			service.start_group_handle = little_endian_read_16(packet, 4);
161*4902524cSMatthias Ringwald 			service.end_group_handle   = little_endian_read_16(packet, 6);
162*4902524cSMatthias Ringwald 			service.uuid16 = 0;
163*4902524cSMatthias Ringwald 			reverse_128(&packet[8], service.uuid128);
164*4902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(service.uuid128)){
165*4902524cSMatthias Ringwald 				service.uuid16 = big_endian_read_32(service.uuid128, 0);
166*4902524cSMatthias Ringwald 			}
167*4902524cSMatthias Ringwald 			services[result_index++] = service;
168*4902524cSMatthias Ringwald 			result_counter++;
169*4902524cSMatthias Ringwald             break;
170*4902524cSMatthias Ringwald         case GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT:
171*4902524cSMatthias Ringwald 			service.start_group_handle = little_endian_read_16(packet, 6);
172*4902524cSMatthias Ringwald 			service.end_group_handle   = little_endian_read_16(packet, 8);
173*4902524cSMatthias Ringwald 			service.uuid16 = 0;
174*4902524cSMatthias Ringwald 			reverse_128(&packet[10], service.uuid128);
175*4902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(service.uuid128)){
176*4902524cSMatthias Ringwald 				service.uuid16 = big_endian_read_32(service.uuid128, 0);
177*4902524cSMatthias Ringwald 			}
178*4902524cSMatthias Ringwald             included_services[result_index++] = service;
179*4902524cSMatthias Ringwald             result_counter++;
180*4902524cSMatthias Ringwald             break;
181*4902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT:
182*4902524cSMatthias Ringwald         	characteristic.start_handle = little_endian_read_16(packet, 4);
183*4902524cSMatthias Ringwald         	characteristic.value_handle = little_endian_read_16(packet, 6);
184*4902524cSMatthias Ringwald         	characteristic.end_handle =   little_endian_read_16(packet, 8);
185*4902524cSMatthias Ringwald         	characteristic.properties =   little_endian_read_16(packet, 10);
186*4902524cSMatthias Ringwald 			characteristic.uuid16 = 0;
187*4902524cSMatthias Ringwald 			reverse_128(&packet[12], characteristic.uuid128);
188*4902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(characteristic.uuid128)){
189*4902524cSMatthias Ringwald 				characteristic.uuid16 = big_endian_read_32(characteristic.uuid128, 0);
190*4902524cSMatthias Ringwald 			}
191*4902524cSMatthias Ringwald         	characteristics[result_index++] = characteristic;
192*4902524cSMatthias Ringwald         	result_counter++;
193*4902524cSMatthias Ringwald             break;
194*4902524cSMatthias Ringwald         case GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT:
195*4902524cSMatthias Ringwald         	descriptor.handle = little_endian_read_16(packet, 4);
196*4902524cSMatthias Ringwald 			reverse_128(&packet[6], descriptor.uuid128);
197*4902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(descriptor.uuid128)){
198*4902524cSMatthias Ringwald 				descriptor.uuid16 = big_endian_read_32(descriptor.uuid128, 0);
199*4902524cSMatthias Ringwald 			}
200*4902524cSMatthias Ringwald         	descriptors[result_index++] = descriptor;
201*4902524cSMatthias Ringwald         	result_counter++;
202*4902524cSMatthias Ringwald         	break;
203*4902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT:
204*4902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT:
205*4902524cSMatthias Ringwald         	CHECK_EQUAL(short_value_length, little_endian_read_16(packet, 6));
206*4902524cSMatthias Ringwald         	CHECK_EQUAL_ARRAY((uint8_t*)short_value, &packet[8], short_value_length);
207*4902524cSMatthias Ringwald         	result_counter++;
208*4902524cSMatthias Ringwald         	break;
209*4902524cSMatthias Ringwald         case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT:
210*4902524cSMatthias Ringwald         case GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT:
211*4902524cSMatthias Ringwald         	verify_blob(little_endian_read_16(packet, 8), little_endian_read_16(packet, 6), &packet[10]);
212*4902524cSMatthias Ringwald         	result_counter++;
213*4902524cSMatthias Ringwald         	break;
214*4902524cSMatthias Ringwald 	}
215*4902524cSMatthias Ringwald }
216*4902524cSMatthias Ringwald 
217*4902524cSMatthias 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){
218*4902524cSMatthias Ringwald 	switch(test){
219*4902524cSMatthias Ringwald 		case WRITE_CHARACTERISTIC_DESCRIPTOR:
220*4902524cSMatthias Ringwald 		case WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION:
221*4902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode);
222*4902524cSMatthias Ringwald 			CHECK_EQUAL(0, offset);
223*4902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY(indication, buffer, 2);
224*4902524cSMatthias Ringwald 			result_counter++;
225*4902524cSMatthias Ringwald 			break;
226*4902524cSMatthias Ringwald 		case WRITE_CHARACTERISTIC_VALUE:
227*4902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode);
228*4902524cSMatthias Ringwald 			CHECK_EQUAL(0, offset);
229*4902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY((uint8_t *)short_value, buffer, short_value_length);
230*4902524cSMatthias Ringwald     		result_counter++;
231*4902524cSMatthias Ringwald 			break;
232*4902524cSMatthias Ringwald 		case WRITE_LONG_CHARACTERISTIC_DESCRIPTOR:
233*4902524cSMatthias Ringwald 		case WRITE_LONG_CHARACTERISTIC_VALUE:
234*4902524cSMatthias Ringwald 		case WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE:
235*4902524cSMatthias Ringwald 			if (transaction_mode == ATT_TRANSACTION_MODE_VALIDATE) break;
236*4902524cSMatthias Ringwald 			if (transaction_mode == ATT_TRANSACTION_MODE_EXECUTE) break;
237*4902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_ACTIVE, transaction_mode);
238*4902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY((uint8_t *)&long_value[offset], buffer, buffer_size);
239*4902524cSMatthias Ringwald 			if (offset + buffer_size != sizeof(long_value)) break;
240*4902524cSMatthias Ringwald 			result_counter++;
241*4902524cSMatthias Ringwald 			break;
242*4902524cSMatthias Ringwald 		default:
243*4902524cSMatthias Ringwald 			break;
244*4902524cSMatthias Ringwald 	}
245*4902524cSMatthias Ringwald 	return 0;
246*4902524cSMatthias Ringwald }
247*4902524cSMatthias Ringwald 
248*4902524cSMatthias Ringwald int copy_bytes(uint8_t * value, uint16_t value_length, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
249*4902524cSMatthias Ringwald 	int blob_length = value_length - offset;
250*4902524cSMatthias Ringwald 	if (blob_length >= buffer_size) blob_length = buffer_size;
251*4902524cSMatthias Ringwald 
252*4902524cSMatthias Ringwald 	memcpy(buffer, &value[offset], blob_length);
253*4902524cSMatthias Ringwald 	return blob_length;
254*4902524cSMatthias Ringwald }
255*4902524cSMatthias Ringwald 
256*4902524cSMatthias 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){
257*4902524cSMatthias 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);
258*4902524cSMatthias Ringwald 	switch(test){
259*4902524cSMatthias Ringwald 		case READ_CHARACTERISTIC_DESCRIPTOR:
260*4902524cSMatthias Ringwald 		case READ_CHARACTERISTIC_VALUE:
261*4902524cSMatthias Ringwald 			result_counter++;
262*4902524cSMatthias Ringwald 			if (buffer){
263*4902524cSMatthias Ringwald 				return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size);
264*4902524cSMatthias Ringwald 			}
265*4902524cSMatthias Ringwald 			return short_value_length;
266*4902524cSMatthias Ringwald 		case READ_LONG_CHARACTERISTIC_DESCRIPTOR:
267*4902524cSMatthias Ringwald 		case READ_LONG_CHARACTERISTIC_VALUE:
268*4902524cSMatthias Ringwald 			result_counter++;
269*4902524cSMatthias Ringwald 			if (buffer) {
270*4902524cSMatthias Ringwald 				return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size);
271*4902524cSMatthias Ringwald 			}
272*4902524cSMatthias Ringwald 			return long_value_length;
273*4902524cSMatthias Ringwald 		default:
274*4902524cSMatthias Ringwald 			break;
275*4902524cSMatthias Ringwald 	}
276*4902524cSMatthias Ringwald 	return 0;
277*4902524cSMatthias Ringwald }
278*4902524cSMatthias Ringwald 
279*4902524cSMatthias Ringwald // static const char * decode_status(uint8_t status){
280*4902524cSMatthias Ringwald // 	switch (status){
281*4902524cSMatthias Ringwald // 		case 0: return "0";
282*4902524cSMatthias Ringwald //     	case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE";
283*4902524cSMatthias Ringwald //     	case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS";
284*4902524cSMatthias Ringwald //     	case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED";
285*4902524cSMatthias Ringwald //     	case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG";
286*4902524cSMatthias Ringwald // 	    case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY";
287*4902524cSMatthias Ringwald // 	    case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED";
288*4902524cSMatthias Ringwald // 	    case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED";
289*4902524cSMatthias Ringwald // 	}
290*4902524cSMatthias Ringwald // }
291*4902524cSMatthias Ringwald 
292*4902524cSMatthias Ringwald TEST_GROUP(GATTClient){
293*4902524cSMatthias Ringwald 	int acl_buffer_size;
294*4902524cSMatthias Ringwald     uint8_t acl_buffer[27];
295*4902524cSMatthias Ringwald     uint8_t status;
296*4902524cSMatthias Ringwald 
297*4902524cSMatthias Ringwald 	void setup(void){
298*4902524cSMatthias Ringwald 		result_counter = 0;
299*4902524cSMatthias Ringwald 		result_index = 0;
300*4902524cSMatthias Ringwald 		test = IDLE;
301*4902524cSMatthias Ringwald 	}
302*4902524cSMatthias Ringwald 
303*4902524cSMatthias Ringwald 	void reset_query_state(void){
304*4902524cSMatthias Ringwald 		gatt_query_complete = 0;
305*4902524cSMatthias Ringwald 		result_counter = 0;
306*4902524cSMatthias Ringwald 		result_index = 0;
307*4902524cSMatthias Ringwald 	}
308*4902524cSMatthias Ringwald };
309*4902524cSMatthias Ringwald 
310*4902524cSMatthias Ringwald 
311*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){
312*4902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICES;
313*4902524cSMatthias Ringwald 	reset_query_state();
314*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
315*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
316*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
317*4902524cSMatthias Ringwald 	verify_primary_services();
318*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
319*4902524cSMatthias Ringwald }
320*4902524cSMatthias Ringwald 
321*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){
322*4902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16;
323*4902524cSMatthias Ringwald 	reset_query_state();
324*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
325*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
326*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
327*4902524cSMatthias Ringwald 	verify_primary_services_with_uuid16();
328*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
329*4902524cSMatthias Ringwald }
330*4902524cSMatthias Ringwald 
331*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){
332*4902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128;
333*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
334*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
335*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
336*4902524cSMatthias Ringwald 	verify_primary_services_with_uuid128();
337*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
338*4902524cSMatthias Ringwald }
339*4902524cSMatthias Ringwald 
340*4902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){
341*4902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16;
342*4902524cSMatthias Ringwald 	reset_query_state();
343*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
344*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
345*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
346*4902524cSMatthias Ringwald 
347*4902524cSMatthias Ringwald 	reset_query_state();
348*4902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
349*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
350*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
351*4902524cSMatthias Ringwald 	verify_included_services_uuid16();
352*4902524cSMatthias Ringwald }
353*4902524cSMatthias Ringwald 
354*4902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){
355*4902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128;
356*4902524cSMatthias Ringwald 	reset_query_state();
357*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
358*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
359*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
360*4902524cSMatthias Ringwald 
361*4902524cSMatthias Ringwald 	reset_query_state();
362*4902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
363*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
364*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
365*4902524cSMatthias Ringwald 	verify_included_services_uuid128();
366*4902524cSMatthias Ringwald }
367*4902524cSMatthias Ringwald 
368*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){
369*4902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16;
370*4902524cSMatthias Ringwald 	reset_query_state();
371*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
372*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
373*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
374*4902524cSMatthias Ringwald 
375*4902524cSMatthias Ringwald 	reset_query_state();
376*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
377*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
378*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
379*4902524cSMatthias Ringwald 	verify_charasteristics();
380*4902524cSMatthias Ringwald }
381*4902524cSMatthias Ringwald 
382*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){
383*4902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID16;
384*4902524cSMatthias Ringwald 	reset_query_state();
385*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102);
386*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
387*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
388*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
389*4902524cSMatthias Ringwald }
390*4902524cSMatthias Ringwald 
391*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){
392*4902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID128;
393*4902524cSMatthias Ringwald 	reset_query_state();
394*4902524cSMatthias 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]);
395*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
396*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
397*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
398*4902524cSMatthias Ringwald }
399*4902524cSMatthias Ringwald 
400*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){
401*4902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
402*4902524cSMatthias Ringwald 	reset_query_state();
403*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
404*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
405*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
406*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
407*4902524cSMatthias Ringwald 
408*4902524cSMatthias Ringwald 	reset_query_state();
409*4902524cSMatthias Ringwald 	uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
410*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
411*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
412*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
413*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
414*4902524cSMatthias Ringwald 
415*4902524cSMatthias Ringwald 	reset_query_state();
416*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
417*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
418*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
419*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
420*4902524cSMatthias Ringwald }
421*4902524cSMatthias Ringwald 
422*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){
423*4902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
424*4902524cSMatthias Ringwald 	reset_query_state();
425*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
426*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
427*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
428*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
429*4902524cSMatthias Ringwald 
430*4902524cSMatthias Ringwald 	reset_query_state();
431*4902524cSMatthias Ringwald 	uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
432*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
433*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
434*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
435*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
436*4902524cSMatthias Ringwald 
437*4902524cSMatthias Ringwald 	reset_query_state();
438*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
439*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
440*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
441*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
442*4902524cSMatthias Ringwald }
443*4902524cSMatthias Ringwald 
444*4902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){
445*4902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTIC_DESCRIPTORS;
446*4902524cSMatthias Ringwald 	reset_query_state();
447*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
448*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
449*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
450*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
451*4902524cSMatthias Ringwald 
452*4902524cSMatthias Ringwald 	reset_query_state();
453*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
454*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
455*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
456*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
457*4902524cSMatthias Ringwald 
458*4902524cSMatthias Ringwald 	reset_query_state();
459*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
460*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
461*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
462*4902524cSMatthias Ringwald 	CHECK(result_counter);
463*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_index);
464*4902524cSMatthias Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
465*4902524cSMatthias Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
466*4902524cSMatthias Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
467*4902524cSMatthias Ringwald }
468*4902524cSMatthias Ringwald 
469*4902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){
470*4902524cSMatthias Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
471*4902524cSMatthias Ringwald 	reset_query_state();
472*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
473*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
474*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
475*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
476*4902524cSMatthias Ringwald 
477*4902524cSMatthias Ringwald 	reset_query_state();
478*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
479*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
480*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
481*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
482*4902524cSMatthias Ringwald 
483*4902524cSMatthias Ringwald 	reset_query_state();
484*4902524cSMatthias Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
485*4902524cSMatthias Ringwald  	CHECK_EQUAL(0, status);
486*4902524cSMatthias Ringwald  	CHECK_EQUAL(1, gatt_query_complete);
487*4902524cSMatthias Ringwald  	CHECK_EQUAL(1, result_counter);
488*4902524cSMatthias Ringwald }
489*4902524cSMatthias Ringwald 
490*4902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){
491*4902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_DESCRIPTOR;
492*4902524cSMatthias Ringwald 	reset_query_state();
493*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
494*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
495*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
496*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
497*4902524cSMatthias Ringwald 
498*4902524cSMatthias Ringwald 	reset_query_state();
499*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
500*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
501*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
502*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
503*4902524cSMatthias Ringwald 
504*4902524cSMatthias Ringwald 	reset_query_state();
505*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
506*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
507*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
508*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
509*4902524cSMatthias Ringwald 
510*4902524cSMatthias Ringwald 	reset_query_state();
511*4902524cSMatthias Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
512*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
513*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
514*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
515*4902524cSMatthias Ringwald }
516*4902524cSMatthias Ringwald 
517*4902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){
518*4902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_VALUE;
519*4902524cSMatthias Ringwald 	reset_query_state();
520*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
521*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
522*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
523*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
524*4902524cSMatthias Ringwald 
525*4902524cSMatthias Ringwald 	reset_query_state();
526*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
527*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
528*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
529*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
530*4902524cSMatthias Ringwald 
531*4902524cSMatthias Ringwald 	reset_query_state();
532*4902524cSMatthias Ringwald 	status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
533*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
534*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
535*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
536*4902524cSMatthias Ringwald }
537*4902524cSMatthias Ringwald 
538*4902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){
539*4902524cSMatthias Ringwald     test = WRITE_CHARACTERISTIC_VALUE;
540*4902524cSMatthias Ringwald 	reset_query_state();
541*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
542*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
543*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
544*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
545*4902524cSMatthias Ringwald 
546*4902524cSMatthias Ringwald 	reset_query_state();
547*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
548*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
549*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
550*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
551*4902524cSMatthias Ringwald 
552*4902524cSMatthias Ringwald 	reset_query_state();
553*4902524cSMatthias 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);
554*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
555*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
556*4902524cSMatthias Ringwald }
557*4902524cSMatthias Ringwald 
558*4902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){
559*4902524cSMatthias Ringwald 	test = WRITE_CHARACTERISTIC_DESCRIPTOR;
560*4902524cSMatthias Ringwald 	reset_query_state();
561*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
562*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
563*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
564*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
565*4902524cSMatthias Ringwald 
566*4902524cSMatthias Ringwald 	reset_query_state();
567*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
568*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
569*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
570*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
571*4902524cSMatthias Ringwald 
572*4902524cSMatthias Ringwald 	reset_query_state();
573*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
574*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
575*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
576*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
577*4902524cSMatthias Ringwald 
578*4902524cSMatthias Ringwald 	reset_query_state();
579*4902524cSMatthias Ringwald 	status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication);
580*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
581*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
582*4902524cSMatthias Ringwald }
583*4902524cSMatthias Ringwald 
584*4902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){
585*4902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_VALUE;
586*4902524cSMatthias Ringwald 	reset_query_state();
587*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
588*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
589*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
590*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
591*4902524cSMatthias Ringwald 
592*4902524cSMatthias Ringwald 	reset_query_state();
593*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
594*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
595*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
596*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
597*4902524cSMatthias Ringwald 
598*4902524cSMatthias Ringwald 	reset_query_state();
599*4902524cSMatthias Ringwald 	status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
600*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
601*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
602*4902524cSMatthias Ringwald 	CHECK_EQUAL(7, result_counter);
603*4902524cSMatthias Ringwald }
604*4902524cSMatthias Ringwald 
605*4902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){
606*4902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_DESCRIPTOR;
607*4902524cSMatthias Ringwald 	reset_query_state();
608*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
609*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
610*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
611*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
612*4902524cSMatthias Ringwald 
613*4902524cSMatthias Ringwald 	reset_query_state();
614*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
615*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
616*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
617*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
618*4902524cSMatthias Ringwald 
619*4902524cSMatthias Ringwald 	reset_query_state();
620*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
621*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
622*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
623*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
624*4902524cSMatthias Ringwald 
625*4902524cSMatthias Ringwald 	reset_query_state();
626*4902524cSMatthias Ringwald 	result_counter = 0;
627*4902524cSMatthias Ringwald 	status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
628*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
629*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
630*4902524cSMatthias Ringwald 	CHECK_EQUAL(7, result_counter);
631*4902524cSMatthias Ringwald }
632*4902524cSMatthias Ringwald 
633*4902524cSMatthias Ringwald 
634*4902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){
635*4902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR;
636*4902524cSMatthias Ringwald 	reset_query_state();
637*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
638*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
639*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
640*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
641*4902524cSMatthias Ringwald 
642*4902524cSMatthias Ringwald 	reset_query_state();
643*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
644*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
645*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
646*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
647*4902524cSMatthias Ringwald 
648*4902524cSMatthias Ringwald 	reset_query_state();
649*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
650*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
651*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
652*4902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
653*4902524cSMatthias Ringwald 
654*4902524cSMatthias Ringwald 	result_counter = 0;
655*4902524cSMatthias Ringwald 	status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value);
656*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
657*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
658*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
659*4902524cSMatthias Ringwald }
660*4902524cSMatthias Ringwald 
661*4902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){
662*4902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_VALUE;
663*4902524cSMatthias Ringwald 	reset_query_state();
664*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
665*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
666*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
667*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
668*4902524cSMatthias Ringwald 
669*4902524cSMatthias Ringwald 	reset_query_state();
670*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
671*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
672*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
673*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
674*4902524cSMatthias Ringwald 
675*4902524cSMatthias Ringwald 
676*4902524cSMatthias Ringwald 	reset_query_state();
677*4902524cSMatthias 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);
678*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
679*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
680*4902524cSMatthias Ringwald }
681*4902524cSMatthias Ringwald 
682*4902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){
683*4902524cSMatthias Ringwald 	test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE;
684*4902524cSMatthias Ringwald 	reset_query_state();
685*4902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
686*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
687*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
688*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
689*4902524cSMatthias Ringwald 
690*4902524cSMatthias Ringwald 	reset_query_state();
691*4902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
692*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
693*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
694*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
695*4902524cSMatthias Ringwald 
696*4902524cSMatthias Ringwald 	reset_query_state();
697*4902524cSMatthias 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);
698*4902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
699*4902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
700*4902524cSMatthias Ringwald }
701*4902524cSMatthias Ringwald 
702*4902524cSMatthias Ringwald 
703*4902524cSMatthias Ringwald int main (int argc, const char * argv[]){
704*4902524cSMatthias Ringwald 	att_set_db(profile_data);
705*4902524cSMatthias Ringwald 	att_set_write_callback(&att_write_callback);
706*4902524cSMatthias Ringwald 	att_set_read_callback(&att_read_callback);
707*4902524cSMatthias Ringwald 
708*4902524cSMatthias Ringwald 	gatt_client_init();
709*4902524cSMatthias Ringwald 
710*4902524cSMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
711*4902524cSMatthias Ringwald }
712