xref: /btstack/test/gatt_client/gatt_client_test.cpp (revision a382a4ad6c1ac6f4835f174fe361e9a26c2e3d5f)
14902524cSMatthias Ringwald 
24902524cSMatthias Ringwald // *****************************************************************************
34902524cSMatthias Ringwald //
44902524cSMatthias Ringwald // test rfcomm query tests
54902524cSMatthias Ringwald //
64902524cSMatthias Ringwald // *****************************************************************************
74902524cSMatthias Ringwald 
84902524cSMatthias Ringwald 
94902524cSMatthias Ringwald #include <stdint.h>
104902524cSMatthias Ringwald #include <stdio.h>
114902524cSMatthias Ringwald #include <stdlib.h>
124902524cSMatthias Ringwald #include <string.h>
134902524cSMatthias Ringwald 
144902524cSMatthias Ringwald #include "CppUTest/TestHarness.h"
154902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
164902524cSMatthias Ringwald 
174902524cSMatthias Ringwald #include "hci_cmd.h"
184902524cSMatthias Ringwald 
194902524cSMatthias Ringwald #include "btstack_memory.h"
204902524cSMatthias Ringwald #include "hci.h"
214902524cSMatthias Ringwald #include "hci_dump.h"
224902524cSMatthias Ringwald #include "ble/gatt_client.h"
234902524cSMatthias Ringwald #include "ble/att_db.h"
244902524cSMatthias Ringwald #include "profile.h"
254902524cSMatthias Ringwald #include "expected_results.h"
264902524cSMatthias Ringwald 
278404d3b7SMilanka Ringwald extern "C" void hci_setup_le_connection(uint16_t con_handle);
288404d3b7SMilanka Ringwald 
294902524cSMatthias Ringwald static uint16_t gatt_client_handle = 0x40;
304902524cSMatthias Ringwald static int gatt_query_complete = 0;
314902524cSMatthias Ringwald 
324902524cSMatthias Ringwald typedef enum {
334902524cSMatthias Ringwald 	IDLE,
344902524cSMatthias Ringwald 	DISCOVER_PRIMARY_SERVICES,
354902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID16,
364902524cSMatthias Ringwald     DISCOVER_PRIMARY_SERVICE_WITH_UUID128,
374902524cSMatthias Ringwald 
384902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16,
394902524cSMatthias Ringwald     DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128,
404902524cSMatthias Ringwald 
414902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16,
424902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128,
434902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID16,
444902524cSMatthias Ringwald     DISCOVER_CHARACTERISTICS_BY_UUID128,
454902524cSMatthias Ringwald 	DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID,
464902524cSMatthias Ringwald 
474902524cSMatthias Ringwald 	READ_CHARACTERISTIC_VALUE,
484902524cSMatthias Ringwald 	READ_LONG_CHARACTERISTIC_VALUE,
494902524cSMatthias Ringwald 	WRITE_CHARACTERISTIC_VALUE,
504902524cSMatthias Ringwald 	WRITE_LONG_CHARACTERISTIC_VALUE,
514902524cSMatthias Ringwald 
524902524cSMatthias Ringwald     DISCOVER_CHARACTERISTIC_DESCRIPTORS,
534902524cSMatthias Ringwald     READ_CHARACTERISTIC_DESCRIPTOR,
544902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_DESCRIPTOR,
554902524cSMatthias Ringwald     WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION,
564902524cSMatthias Ringwald     READ_LONG_CHARACTERISTIC_DESCRIPTOR,
574902524cSMatthias Ringwald     WRITE_LONG_CHARACTERISTIC_DESCRIPTOR,
584902524cSMatthias Ringwald     WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE,
594902524cSMatthias Ringwald     WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE
604902524cSMatthias Ringwald } current_test_t;
614902524cSMatthias Ringwald 
624902524cSMatthias Ringwald current_test_t test = IDLE;
634902524cSMatthias Ringwald 
644902524cSMatthias Ringwald uint8_t  characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb};
654902524cSMatthias Ringwald uint16_t characteristic_uuid16 = 0xF000;
664902524cSMatthias Ringwald 
67*a382a4adSMilanka Ringwald static const uint8_t service_data_uuid128[] = {
68*a382a4adSMilanka Ringwald 	// 0x0056 PRIMARY_SERVICE-0x34FB with Bluetooth prefix
69*a382a4adSMilanka Ringwald     0x18, 0x00, 0x02, 0x00, 0x56, 0x00, 0x00, 0x28, 0xFB, 0x34, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB,
70*a382a4adSMilanka Ringwald     // 0x0057 INCLUDE_SERVICE-0000FF10-0000-1000-8000-00805F9B34FB
71*a382a4adSMilanka Ringwald     0x0c, 0x00, 0x02, 0x00, 0x57, 0x00, 0x02, 0x28, 0x0f, 0x00, 0x11, 0x00,
72*a382a4adSMilanka Ringwald     // 0x0058 INCLUDE_SERVICE-0000FF11-0000-1000-8000-00805F9B34FB
73*a382a4adSMilanka Ringwald     0x0c, 0x00, 0x02, 0x00, 0x58, 0x00, 0x02, 0x28, 0x12, 0x00, 0x14, 0x00,
74*a382a4adSMilanka Ringwald     // Characteristics 16 and 128 bit with different authoriztion/authentication/encryption requirements and read/write flags
75*a382a4adSMilanka Ringwald     // - no requirements
76*a382a4adSMilanka Ringwald     // 0x0059 CHARACTERISTIC-F200-READ | WRITE | DYNAMIC | NOTIFY | INDICATE | RELIABLE_WRITE | WRITE_WITHOUT_RESPONSE
77*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x59, 0x00, 0x03, 0x28, 0xbe, 0x5a, 0x00, 0x00, 0xf2,
78*a382a4adSMilanka Ringwald     // 0x005a VALUE-F200-READ | WRITE | DYNAMIC | NOTIFY | INDICATE | RELIABLE_WRITE | WRITE_WITHOUT_RESPONSE-''
79*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
80*a382a4adSMilanka Ringwald     0x08, 0x00, 0x8e, 0x01, 0x5a, 0x00, 0x00, 0xf2,
81*a382a4adSMilanka Ringwald     // 0x005b CLIENT_CHARACTERISTIC_CONFIGURATION
82*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
83*a382a4adSMilanka Ringwald     0x0a, 0x00, 0x0e, 0x01, 0x5b, 0x00, 0x02, 0x29, 0x00, 0x00,
84*a382a4adSMilanka Ringwald     // 0x005c CHARACTERISTIC_EXTENDED_PROPERTIES
85*a382a4adSMilanka Ringwald     0x0a, 0x00, 0x02, 0x00, 0x5c, 0x00, 0x00, 0x29, 0x01, 0x00,
86*a382a4adSMilanka Ringwald     // 0x005d CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC-
87*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
88*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0a, 0x00, 0x5d, 0x00, 0x01, 0x29,
89*a382a4adSMilanka Ringwald     // 0x005e CHARACTERISTIC-0000F201-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | NOTIFY | INDICATE | RELIABLE_WRITE
90*a382a4adSMilanka Ringwald     0x1b, 0x00, 0x02, 0x00, 0x5e, 0x00, 0x03, 0x28, 0xba, 0x5f, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0xf2, 0x00, 0x00,
91*a382a4adSMilanka Ringwald     // 0x005f VALUE-0000F201-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | NOTIFY | INDICATE | RELIABLE_WRITE-''
92*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
93*a382a4adSMilanka Ringwald     0x16, 0x00, 0x8a, 0x03, 0x5f, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x01, 0xf2, 0x00, 0x00,
94*a382a4adSMilanka Ringwald     // 0x0060 CLIENT_CHARACTERISTIC_CONFIGURATION
95*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
96*a382a4adSMilanka Ringwald     0x0a, 0x00, 0x0e, 0x01, 0x60, 0x00, 0x02, 0x29, 0x00, 0x00,
97*a382a4adSMilanka Ringwald     // 0x0061 CHARACTERISTIC_EXTENDED_PROPERTIES
98*a382a4adSMilanka Ringwald     0x0a, 0x00, 0x02, 0x00, 0x61, 0x00, 0x00, 0x29, 0x01, 0x00,
99*a382a4adSMilanka Ringwald     // 0x0062 CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC-
100*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
101*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0a, 0x00, 0x62, 0x00, 0x01, 0x29,
102*a382a4adSMilanka Ringwald     // - neither read nor writable
103*a382a4adSMilanka Ringwald     // 0x0063 CHARACTERISTIC-F202-DYNAMIC
104*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x63, 0x00, 0x03, 0x28, 0x00, 0x64, 0x00, 0x02, 0xf2,
105*a382a4adSMilanka Ringwald     // 0x0064 VALUE-F202-DYNAMIC-''
106*a382a4adSMilanka Ringwald     //
107*a382a4adSMilanka Ringwald     0x08, 0x00, 0x00, 0x01, 0x64, 0x00, 0x02, 0xf2,
108*a382a4adSMilanka Ringwald     // 0x0065 CHARACTERISTIC_USER_DESCRIPTION-DYNAMIC-
109*a382a4adSMilanka Ringwald     // READ_ANYBODY
110*a382a4adSMilanka Ringwald     0x08, 0x00, 0x02, 0x00, 0x65, 0x00, 0x01, 0x29,
111*a382a4adSMilanka Ringwald     // 0x0066 CHARACTERISTIC-0000F203-0000-1000-8000-00805F9B34FB-DYNAMIC
112*a382a4adSMilanka Ringwald     0x1b, 0x00, 0x02, 0x00, 0x66, 0x00, 0x03, 0x28, 0x00, 0x67, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x03, 0xf2, 0x00, 0x00,
113*a382a4adSMilanka Ringwald     // 0x0067 VALUE-0000F203-0000-1000-8000-00805F9B34FB-DYNAMIC-''
114*a382a4adSMilanka Ringwald     //
115*a382a4adSMilanka Ringwald     0x16, 0x00, 0x00, 0x03, 0x67, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x03, 0xf2, 0x00, 0x00,
116*a382a4adSMilanka Ringwald     // 0x0068 CHARACTERISTIC_USER_DESCRIPTION-DYNAMIC-
117*a382a4adSMilanka Ringwald     // READ_ANYBODY
118*a382a4adSMilanka Ringwald     0x08, 0x00, 0x02, 0x00, 0x68, 0x00, 0x01, 0x29,
119*a382a4adSMilanka Ringwald     // - authorization required
120*a382a4adSMilanka Ringwald     // 0x0069 CHARACTERISTIC-F204-READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED
121*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x69, 0x00, 0x03, 0x28, 0x0a, 0x6a, 0x00, 0x04, 0xf2,
122*a382a4adSMilanka Ringwald     // 0x006a VALUE-F204-READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED-''
123*a382a4adSMilanka Ringwald     // READ_AUTHORIZED, WRITE_AUTHORIZED
124*a382a4adSMilanka Ringwald     0x08, 0x00, 0x1b, 0x0d, 0x6a, 0x00, 0x04, 0xf2,
125*a382a4adSMilanka Ringwald     // 0x006b CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED-
126*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_AUTHORIZED
127*a382a4adSMilanka Ringwald     0x08, 0x00, 0x1b, 0x00, 0x6b, 0x00, 0x01, 0x29,
128*a382a4adSMilanka Ringwald     // 0x006c CHARACTERISTIC-0000F205-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED
129*a382a4adSMilanka Ringwald     0x1b, 0x00, 0x02, 0x00, 0x6c, 0x00, 0x03, 0x28, 0x0a, 0x6d, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x05, 0xf2, 0x00, 0x00,
130*a382a4adSMilanka Ringwald     // 0x006d VALUE-0000F205-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED-''
131*a382a4adSMilanka Ringwald     // READ_AUTHORIZED, WRITE_AUTHORIZED
132*a382a4adSMilanka Ringwald     0x16, 0x00, 0x1b, 0x0f, 0x6d, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x05, 0xf2, 0x00, 0x00,
133*a382a4adSMilanka Ringwald     // 0x006e CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC | AUTHORIZATION_REQUIRED-
134*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_AUTHORIZED
135*a382a4adSMilanka Ringwald     0x08, 0x00, 0x1b, 0x00, 0x6e, 0x00, 0x01, 0x29,
136*a382a4adSMilanka Ringwald     // - authenthication required
137*a382a4adSMilanka Ringwald     // 0x006f CHARACTERISTIC-F206-READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED
138*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x6f, 0x00, 0x03, 0x28, 0x0a, 0x70, 0x00, 0x06, 0xf2,
139*a382a4adSMilanka Ringwald     // 0x0070 VALUE-F206-READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED-''
140*a382a4adSMilanka Ringwald     // READ_AUTHENTICATED, WRITE_AUTHENTICATED
141*a382a4adSMilanka Ringwald     0x08, 0x00, 0x1a, 0x09, 0x70, 0x00, 0x06, 0xf2,
142*a382a4adSMilanka Ringwald     // 0x0071 CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED-
143*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_AUTHENTICATED
144*a382a4adSMilanka Ringwald     0x08, 0x00, 0x1a, 0x00, 0x71, 0x00, 0x01, 0x29,
145*a382a4adSMilanka Ringwald     // 0x0072 CHARACTERISTIC-0000F207-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED
146*a382a4adSMilanka Ringwald     0x1b, 0x00, 0x02, 0x00, 0x72, 0x00, 0x03, 0x28, 0x0a, 0x73, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00,
147*a382a4adSMilanka Ringwald     // 0x0073 VALUE-0000F207-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED-''
148*a382a4adSMilanka Ringwald     // READ_AUTHENTICATED, WRITE_AUTHENTICATED
149*a382a4adSMilanka Ringwald     0x16, 0x00, 0x1a, 0x0b, 0x73, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x07, 0xf2, 0x00, 0x00,
150*a382a4adSMilanka Ringwald     // 0x0074 CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC | AUTHENTICATION_REQUIRED-
151*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_AUTHENTICATED
152*a382a4adSMilanka Ringwald     0x08, 0x00, 0x1a, 0x00, 0x74, 0x00, 0x01, 0x29,
153*a382a4adSMilanka Ringwald     // - encryptiont with 128 bit key required
154*a382a4adSMilanka Ringwald     // 0x0075 CHARACTERISTIC-F208-READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16
155*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x75, 0x00, 0x03, 0x28, 0x0a, 0x76, 0x00, 0x08, 0xf2,
156*a382a4adSMilanka Ringwald     // 0x0076 VALUE-F208-READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16-''
157*a382a4adSMilanka Ringwald     // READ_ENCRYPTED, WRITE_ENCRYPTED, ENCRYPTION_KEY_SIZE=16
158*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0b, 0xf5, 0x76, 0x00, 0x08, 0xf2,
159*a382a4adSMilanka Ringwald     // 0x0077 CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16-
160*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ENCRYPTED, ENCRYPTION_KEY_SIZE=16
161*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0b, 0xf0, 0x77, 0x00, 0x01, 0x29,
162*a382a4adSMilanka Ringwald     // 0x0078 CHARACTERISTIC-0000F209-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16
163*a382a4adSMilanka Ringwald     0x1b, 0x00, 0x02, 0x00, 0x78, 0x00, 0x03, 0x28, 0x0a, 0x79, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x00,
164*a382a4adSMilanka Ringwald     // 0x0079 VALUE-0000F209-0000-1000-8000-00805F9B34FB-READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16-''
165*a382a4adSMilanka Ringwald     // READ_ENCRYPTED, WRITE_ENCRYPTED, ENCRYPTION_KEY_SIZE=16
166*a382a4adSMilanka Ringwald     0x16, 0x00, 0x0b, 0xf7, 0x79, 0x00, 0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00, 0x09, 0xf2, 0x00, 0x00,
167*a382a4adSMilanka Ringwald     // 0x007a CHARACTERISTIC_USER_DESCRIPTION-READ | WRITE | DYNAMIC | ENCRYPTION_KEY_SIZE_16-
168*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ENCRYPTED, ENCRYPTION_KEY_SIZE=16
169*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0b, 0xf0, 0x7a, 0x00, 0x01, 0x29
170*a382a4adSMilanka Ringwald };
171*a382a4adSMilanka Ringwald 
172*a382a4adSMilanka Ringwald static const uint8_t service_data_uuid16[] = {
173*a382a4adSMilanka Ringwald 	// 0x0015 PRIMARY_SERVICE-FFFF
174*a382a4adSMilanka Ringwald     0x0a, 0x00, 0x02, 0x00, 0x15, 0x00, 0x00, 0x28, 0xff, 0xff,
175*a382a4adSMilanka Ringwald     // 0x0016 CHARACTERISTIC-FFFD-READ | WRITE | DYNAMIC
176*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x16, 0x00, 0x03, 0x28, 0x0a, 0x17, 0x00, 0xfd, 0xff,
177*a382a4adSMilanka Ringwald     // 0x0017 VALUE-FFFD-READ | WRITE | DYNAMIC-''
178*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
179*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0a, 0x01, 0x17, 0x00, 0xfd, 0xff,
180*a382a4adSMilanka Ringwald     // 0x0018 CHARACTERISTIC-FFFE-READ | WRITE | DYNAMIC
181*a382a4adSMilanka Ringwald     0x0d, 0x00, 0x02, 0x00, 0x18, 0x00, 0x03, 0x28, 0x0a, 0x19, 0x00, 0xfe, 0xff,
182*a382a4adSMilanka Ringwald     // 0x0019 VALUE-FFFE-READ | WRITE | DYNAMIC-''
183*a382a4adSMilanka Ringwald     // READ_ANYBODY, WRITE_ANYBODY
184*a382a4adSMilanka Ringwald     0x08, 0x00, 0x0a, 0x01, 0x19, 0x00, 0xfe, 0xff,
185*a382a4adSMilanka Ringwald };
186*a382a4adSMilanka Ringwald 
187*a382a4adSMilanka Ringwald static const uint8_t characteristic_data_uuid128[] = {};
188*a382a4adSMilanka Ringwald static const uint8_t characteristic_data_uuid16[] = {};
189*a382a4adSMilanka Ringwald static const uint8_t characteristic_descriptor_data_uuid128[] = {};
190*a382a4adSMilanka Ringwald static const uint8_t characteristic_descriptor_data_uuid16[] = {};
191*a382a4adSMilanka Ringwald 
192*a382a4adSMilanka Ringwald 
1934902524cSMatthias Ringwald static int result_index;
1944902524cSMatthias Ringwald static uint8_t result_counter;
1954902524cSMatthias Ringwald 
1964902524cSMatthias Ringwald static gatt_client_service_t services[50];
1974902524cSMatthias Ringwald static gatt_client_service_t included_services[50];
1984902524cSMatthias Ringwald 
1994902524cSMatthias Ringwald static gatt_client_characteristic_t characteristics[50];
2004902524cSMatthias Ringwald static gatt_client_characteristic_descriptor_t descriptors[50];
2014902524cSMatthias Ringwald 
2024902524cSMatthias Ringwald void mock_simulate_discover_primary_services_response(void);
2034902524cSMatthias Ringwald void mock_simulate_att_exchange_mtu_response(void);
2044902524cSMatthias Ringwald 
2054902524cSMatthias Ringwald void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){
2064902524cSMatthias Ringwald 	for (int i=0; i<size; i++){
2074902524cSMatthias Ringwald 		BYTES_EQUAL(expected[i], actual[i]);
2084902524cSMatthias Ringwald 	}
2094902524cSMatthias Ringwald }
2104902524cSMatthias Ringwald 
2114902524cSMatthias Ringwald void pUUID128(const uint8_t *uuid) {
2124902524cSMatthias Ringwald     printf("%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",
2134902524cSMatthias Ringwald            uuid[0], uuid[1], uuid[2], uuid[3], uuid[4], uuid[5], uuid[6], uuid[7],
2144902524cSMatthias Ringwald            uuid[8], uuid[9], uuid[10], uuid[11], uuid[12], uuid[13], uuid[14], uuid[15]);
2154902524cSMatthias Ringwald }
2164902524cSMatthias Ringwald 
2174902524cSMatthias Ringwald //static int counter = 0;
2184902524cSMatthias 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){
2194902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(exp_uuid, uuid, 16);
2204902524cSMatthias Ringwald 	if (!exp_handles) return;
2214902524cSMatthias Ringwald 	CHECK_EQUAL(exp_handles[0], start_handle);
2224902524cSMatthias Ringwald  	CHECK_EQUAL(exp_handles[1], end_handle);
2234902524cSMatthias Ringwald }
2244902524cSMatthias Ringwald 
2254902524cSMatthias Ringwald // -----------------------------------------------------
2264902524cSMatthias Ringwald 
2274902524cSMatthias Ringwald static void verify_primary_services_with_uuid16(void){
2284902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
2294902524cSMatthias 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);
2304902524cSMatthias Ringwald }
2314902524cSMatthias Ringwald 
2324902524cSMatthias Ringwald 
2334902524cSMatthias Ringwald static void verify_primary_services_with_uuid128(void){
2344902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
2354902524cSMatthias 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);
2364902524cSMatthias Ringwald }
2374902524cSMatthias Ringwald 
2384902524cSMatthias Ringwald static void verify_primary_services(void){
2394902524cSMatthias Ringwald 	CHECK_EQUAL(6, result_index);
2404902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
2414902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(primary_service_uuids[i], NULL, services[i].uuid128, services[i].start_group_handle, services[i].end_group_handle);
2424902524cSMatthias Ringwald 	}
2434902524cSMatthias Ringwald }
2444902524cSMatthias Ringwald 
2454902524cSMatthias Ringwald static void verify_included_services_uuid16(void){
2464902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_index);
2474902524cSMatthias 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);
2484902524cSMatthias Ringwald }
2494902524cSMatthias Ringwald 
2504902524cSMatthias Ringwald static void verify_included_services_uuid128(void){
2514902524cSMatthias Ringwald 	CHECK_EQUAL(2, result_index);
2524902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
2534902524cSMatthias 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);
2544902524cSMatthias Ringwald 	}
2554902524cSMatthias Ringwald }
2564902524cSMatthias Ringwald 
2574902524cSMatthias Ringwald static void verify_charasteristics(void){
2584902524cSMatthias Ringwald 	CHECK_EQUAL(15, result_index);
2594902524cSMatthias Ringwald 	for (int i=0; i<result_index; i++){
2604902524cSMatthias Ringwald 		CHECK_EQUAL_GATT_ATTRIBUTE(characteristic_uuids[i], characteristic_handles[i], characteristics[i].uuid128, characteristics[i].start_handle, characteristics[i].end_handle);
2614902524cSMatthias Ringwald     }
2624902524cSMatthias Ringwald }
2634902524cSMatthias Ringwald 
2644902524cSMatthias Ringwald static void verify_blob(uint16_t value_length, uint16_t value_offset, uint8_t * value){
2654902524cSMatthias Ringwald 	uint8_t * expected_value = (uint8_t*)&long_value[value_offset];
2664902524cSMatthias Ringwald     CHECK(value_length);
2674902524cSMatthias Ringwald 	CHECK_EQUAL_ARRAY(expected_value, value, value_length);
2684902524cSMatthias Ringwald     if (value_offset + value_length != sizeof(long_value)) return;
2694902524cSMatthias Ringwald     result_counter++;
2704902524cSMatthias Ringwald }
2714902524cSMatthias Ringwald 
2724902524cSMatthias Ringwald static void handle_ble_client_event(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
2734902524cSMatthias Ringwald 	if (packet_type != HCI_EVENT_PACKET) return;
2744902524cSMatthias Ringwald 	uint8_t status;
2754902524cSMatthias Ringwald 	gatt_client_service_t service;
2764902524cSMatthias Ringwald 	gatt_client_characteristic_t characteristic;
2774902524cSMatthias Ringwald 	gatt_client_characteristic_descriptor_t descriptor;
2784902524cSMatthias Ringwald 	switch (packet[0]){
2794902524cSMatthias Ringwald 		case GATT_EVENT_QUERY_COMPLETE:
2804902524cSMatthias Ringwald 			status = packet[4];
2814902524cSMatthias Ringwald             gatt_query_complete = 1;
2824902524cSMatthias Ringwald             if (status){
2834902524cSMatthias Ringwald                 gatt_query_complete = 0;
2844902524cSMatthias Ringwald                 printf("GATT_EVENT_QUERY_COMPLETE failed with status 0x%02X\n", status);
2854902524cSMatthias Ringwald             }
2864902524cSMatthias Ringwald             break;
2874902524cSMatthias Ringwald 		case GATT_EVENT_SERVICE_QUERY_RESULT:
2884902524cSMatthias Ringwald 			service.start_group_handle = little_endian_read_16(packet, 4);
2894902524cSMatthias Ringwald 			service.end_group_handle   = little_endian_read_16(packet, 6);
2904902524cSMatthias Ringwald 			service.uuid16 = 0;
2914902524cSMatthias Ringwald 			reverse_128(&packet[8], service.uuid128);
2924902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(service.uuid128)){
2934902524cSMatthias Ringwald 				service.uuid16 = big_endian_read_32(service.uuid128, 0);
2944902524cSMatthias Ringwald 			}
2954902524cSMatthias Ringwald 			services[result_index++] = service;
2964902524cSMatthias Ringwald 			result_counter++;
2974902524cSMatthias Ringwald             break;
2984902524cSMatthias Ringwald         case GATT_EVENT_INCLUDED_SERVICE_QUERY_RESULT:
2994902524cSMatthias Ringwald 			service.start_group_handle = little_endian_read_16(packet, 6);
3004902524cSMatthias Ringwald 			service.end_group_handle   = little_endian_read_16(packet, 8);
3014902524cSMatthias Ringwald 			service.uuid16 = 0;
3024902524cSMatthias Ringwald 			reverse_128(&packet[10], service.uuid128);
3034902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(service.uuid128)){
3044902524cSMatthias Ringwald 				service.uuid16 = big_endian_read_32(service.uuid128, 0);
3054902524cSMatthias Ringwald 			}
3064902524cSMatthias Ringwald             included_services[result_index++] = service;
3074902524cSMatthias Ringwald             result_counter++;
3084902524cSMatthias Ringwald             break;
3094902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_QUERY_RESULT:
3104902524cSMatthias Ringwald         	characteristic.start_handle = little_endian_read_16(packet, 4);
3114902524cSMatthias Ringwald         	characteristic.value_handle = little_endian_read_16(packet, 6);
3124902524cSMatthias Ringwald         	characteristic.end_handle =   little_endian_read_16(packet, 8);
3134902524cSMatthias Ringwald         	characteristic.properties =   little_endian_read_16(packet, 10);
3144902524cSMatthias Ringwald 			characteristic.uuid16 = 0;
3154902524cSMatthias Ringwald 			reverse_128(&packet[12], characteristic.uuid128);
3164902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(characteristic.uuid128)){
3174902524cSMatthias Ringwald 				characteristic.uuid16 = big_endian_read_32(characteristic.uuid128, 0);
3184902524cSMatthias Ringwald 			}
3194902524cSMatthias Ringwald         	characteristics[result_index++] = characteristic;
3204902524cSMatthias Ringwald         	result_counter++;
3214902524cSMatthias Ringwald             break;
3224902524cSMatthias Ringwald         case GATT_EVENT_ALL_CHARACTERISTIC_DESCRIPTORS_QUERY_RESULT:
3234902524cSMatthias Ringwald         	descriptor.handle = little_endian_read_16(packet, 4);
3244902524cSMatthias Ringwald 			reverse_128(&packet[6], descriptor.uuid128);
3254902524cSMatthias Ringwald 			if (uuid_has_bluetooth_prefix(descriptor.uuid128)){
3264902524cSMatthias Ringwald 				descriptor.uuid16 = big_endian_read_32(descriptor.uuid128, 0);
3274902524cSMatthias Ringwald 			}
3284902524cSMatthias Ringwald         	descriptors[result_index++] = descriptor;
3294902524cSMatthias Ringwald         	result_counter++;
3304902524cSMatthias Ringwald         	break;
3314902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_VALUE_QUERY_RESULT:
3324902524cSMatthias Ringwald         case GATT_EVENT_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT:
3334902524cSMatthias Ringwald         	CHECK_EQUAL(short_value_length, little_endian_read_16(packet, 6));
3344902524cSMatthias Ringwald         	CHECK_EQUAL_ARRAY((uint8_t*)short_value, &packet[8], short_value_length);
3354902524cSMatthias Ringwald         	result_counter++;
3364902524cSMatthias Ringwald         	break;
3374902524cSMatthias Ringwald         case GATT_EVENT_LONG_CHARACTERISTIC_VALUE_QUERY_RESULT:
3384902524cSMatthias Ringwald         case GATT_EVENT_LONG_CHARACTERISTIC_DESCRIPTOR_QUERY_RESULT:
3394902524cSMatthias Ringwald         	verify_blob(little_endian_read_16(packet, 8), little_endian_read_16(packet, 6), &packet[10]);
3404902524cSMatthias Ringwald         	result_counter++;
3414902524cSMatthias Ringwald         	break;
3424902524cSMatthias Ringwald 	}
3434902524cSMatthias Ringwald }
3444902524cSMatthias Ringwald 
3454902524cSMatthias 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){
3464902524cSMatthias Ringwald 	switch(test){
3474902524cSMatthias Ringwald 		case WRITE_CHARACTERISTIC_DESCRIPTOR:
3484902524cSMatthias Ringwald 		case WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION:
3494902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode);
3504902524cSMatthias Ringwald 			CHECK_EQUAL(0, offset);
3514902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY(indication, buffer, 2);
3524902524cSMatthias Ringwald 			result_counter++;
3534902524cSMatthias Ringwald 			break;
3544902524cSMatthias Ringwald 		case WRITE_CHARACTERISTIC_VALUE:
3554902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_NONE, transaction_mode);
3564902524cSMatthias Ringwald 			CHECK_EQUAL(0, offset);
3574902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY((uint8_t *)short_value, buffer, short_value_length);
3584902524cSMatthias Ringwald     		result_counter++;
3594902524cSMatthias Ringwald 			break;
3604902524cSMatthias Ringwald 		case WRITE_LONG_CHARACTERISTIC_DESCRIPTOR:
3614902524cSMatthias Ringwald 		case WRITE_LONG_CHARACTERISTIC_VALUE:
3624902524cSMatthias Ringwald 		case WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE:
3634902524cSMatthias Ringwald 			if (transaction_mode == ATT_TRANSACTION_MODE_VALIDATE) break;
3644902524cSMatthias Ringwald 			if (transaction_mode == ATT_TRANSACTION_MODE_EXECUTE) break;
3654902524cSMatthias Ringwald 			CHECK_EQUAL(ATT_TRANSACTION_MODE_ACTIVE, transaction_mode);
3664902524cSMatthias Ringwald 			CHECK_EQUAL_ARRAY((uint8_t *)&long_value[offset], buffer, buffer_size);
3674902524cSMatthias Ringwald 			if (offset + buffer_size != sizeof(long_value)) break;
3684902524cSMatthias Ringwald 			result_counter++;
3694902524cSMatthias Ringwald 			break;
3704902524cSMatthias Ringwald 		default:
3714902524cSMatthias Ringwald 			break;
3724902524cSMatthias Ringwald 	}
3734902524cSMatthias Ringwald 	return 0;
3744902524cSMatthias Ringwald }
3754902524cSMatthias Ringwald 
3764902524cSMatthias Ringwald int copy_bytes(uint8_t * value, uint16_t value_length, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){
3774902524cSMatthias Ringwald 	int blob_length = value_length - offset;
3784902524cSMatthias Ringwald 	if (blob_length >= buffer_size) blob_length = buffer_size;
3794902524cSMatthias Ringwald 
3804902524cSMatthias Ringwald 	memcpy(buffer, &value[offset], blob_length);
3814902524cSMatthias Ringwald 	return blob_length;
3824902524cSMatthias Ringwald }
3834902524cSMatthias Ringwald 
3844902524cSMatthias 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){
3854902524cSMatthias 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);
3864902524cSMatthias Ringwald 	switch(test){
3874902524cSMatthias Ringwald 		case READ_CHARACTERISTIC_DESCRIPTOR:
3884902524cSMatthias Ringwald 		case READ_CHARACTERISTIC_VALUE:
3894902524cSMatthias Ringwald 			result_counter++;
3904902524cSMatthias Ringwald 			if (buffer){
3914902524cSMatthias Ringwald 				return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size);
3924902524cSMatthias Ringwald 			}
3934902524cSMatthias Ringwald 			return short_value_length;
3944902524cSMatthias Ringwald 		case READ_LONG_CHARACTERISTIC_DESCRIPTOR:
3954902524cSMatthias Ringwald 		case READ_LONG_CHARACTERISTIC_VALUE:
3964902524cSMatthias Ringwald 			result_counter++;
3974902524cSMatthias Ringwald 			if (buffer) {
3984902524cSMatthias Ringwald 				return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size);
3994902524cSMatthias Ringwald 			}
4004902524cSMatthias Ringwald 			return long_value_length;
4014902524cSMatthias Ringwald 		default:
4024902524cSMatthias Ringwald 			break;
4034902524cSMatthias Ringwald 	}
4044902524cSMatthias Ringwald 	return 0;
4054902524cSMatthias Ringwald }
4064902524cSMatthias Ringwald 
4074902524cSMatthias Ringwald // static const char * decode_status(uint8_t status){
4084902524cSMatthias Ringwald // 	switch (status){
4094902524cSMatthias Ringwald // 		case 0: return "0";
4104902524cSMatthias Ringwald //     	case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE";
4114902524cSMatthias Ringwald //     	case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS";
4124902524cSMatthias Ringwald //     	case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED";
4134902524cSMatthias Ringwald //     	case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG";
4144902524cSMatthias Ringwald // 	    case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY";
4154902524cSMatthias Ringwald // 	    case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED";
4164902524cSMatthias Ringwald // 	    case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED";
4174902524cSMatthias Ringwald // 	}
4184902524cSMatthias Ringwald // }
4194902524cSMatthias Ringwald 
4204902524cSMatthias Ringwald TEST_GROUP(GATTClient){
4214902524cSMatthias Ringwald 	int acl_buffer_size;
4224902524cSMatthias Ringwald     uint8_t acl_buffer[27];
4234902524cSMatthias Ringwald     uint8_t status;
4244902524cSMatthias Ringwald 
4254902524cSMatthias Ringwald 	void setup(void){
4264902524cSMatthias Ringwald 		result_counter = 0;
4274902524cSMatthias Ringwald 		result_index = 0;
4284902524cSMatthias Ringwald 		test = IDLE;
4298404d3b7SMilanka Ringwald 		hci_setup_le_connection(gatt_client_handle);
4304902524cSMatthias Ringwald 	}
4314902524cSMatthias Ringwald 
4324902524cSMatthias Ringwald 	void reset_query_state(void){
4338404d3b7SMilanka Ringwald 		gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle);
4348404d3b7SMilanka Ringwald 		gatt_client->gatt_client_state = P_READY;
435*a382a4adSMilanka Ringwald 		gatt_client_set_required_security_level(LEVEL_0);
436*a382a4adSMilanka Ringwald 		gatt_client_mtu_enable_auto_negotiation(1);
4378404d3b7SMilanka Ringwald 
4384902524cSMatthias Ringwald 		gatt_query_complete = 0;
4394902524cSMatthias Ringwald 		result_counter = 0;
4404902524cSMatthias Ringwald 		result_index = 0;
4414902524cSMatthias Ringwald 	}
4428404d3b7SMilanka Ringwald 
4438404d3b7SMilanka Ringwald 	void set_wrong_gatt_client_state(void){
4448404d3b7SMilanka Ringwald 		gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle);
4458404d3b7SMilanka Ringwald 	    CHECK_TRUE(gatt_client != NULL);
4468404d3b7SMilanka Ringwald 	    gatt_client->gatt_client_state = P_W2_SEND_SERVICE_QUERY;
4478404d3b7SMilanka Ringwald 	}
4484902524cSMatthias Ringwald };
4494902524cSMatthias Ringwald 
450*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_setters){
451*a382a4adSMilanka Ringwald 	gatt_client_set_required_security_level(LEVEL_4);
452*a382a4adSMilanka Ringwald 	gatt_client_mtu_enable_auto_negotiation(0);
453*a382a4adSMilanka Ringwald }
4544902524cSMatthias Ringwald 
4554902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServices){
4564902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICES;
4578404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
4588404d3b7SMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
4598404d3b7SMilanka Ringwald 
4608404d3b7SMilanka Ringwald 	set_wrong_gatt_client_state();
4618404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
4628404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4638404d3b7SMilanka Ringwald 
4644902524cSMatthias Ringwald 	reset_query_state();
4654902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle);
4664902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4674902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4684902524cSMatthias Ringwald 	verify_primary_services();
4694902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4704902524cSMatthias Ringwald }
4714902524cSMatthias Ringwald 
4724902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){
4734902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16;
4744902524cSMatthias Ringwald 	reset_query_state();
4754902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
4764902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4774902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4784902524cSMatthias Ringwald 	verify_primary_services_with_uuid16();
4794902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
4804902524cSMatthias Ringwald }
4814902524cSMatthias Ringwald 
4824902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){
4834902524cSMatthias Ringwald 	test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128;
4844902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
4854902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
4864902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
4874902524cSMatthias Ringwald 	verify_primary_services_with_uuid128();
4884902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
489*a382a4adSMilanka Ringwald 
490*a382a4adSMilanka Ringwald 	// invalid con handle
491*a382a4adSMilanka Ringwald     status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, primary_service_uuid128);
492*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
493*a382a4adSMilanka Ringwald 
494*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
495*a382a4adSMilanka Ringwald     status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
496*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4974902524cSMatthias Ringwald }
4984902524cSMatthias Ringwald 
4994902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){
5004902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16;
5014902524cSMatthias Ringwald 	reset_query_state();
5024902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5034902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5044902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5054902524cSMatthias Ringwald 
5064902524cSMatthias Ringwald 	reset_query_state();
5074902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
5084902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5094902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5104902524cSMatthias Ringwald 	verify_included_services_uuid16();
5114902524cSMatthias Ringwald }
5124902524cSMatthias Ringwald 
5134902524cSMatthias Ringwald TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){
5144902524cSMatthias Ringwald 	test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128;
5154902524cSMatthias Ringwald 	reset_query_state();
5164902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
5174902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5184902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5194902524cSMatthias Ringwald 
5204902524cSMatthias Ringwald 	reset_query_state();
5214902524cSMatthias Ringwald 	status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
5224902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5234902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5244902524cSMatthias Ringwald 	verify_included_services_uuid128();
525*a382a4adSMilanka Ringwald 
526*a382a4adSMilanka Ringwald 	// invalid con handle
527*a382a4adSMilanka Ringwald     status = gatt_client_find_included_services_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]);
528*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
529*a382a4adSMilanka Ringwald 
530*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
531*a382a4adSMilanka Ringwald     status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
532*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5334902524cSMatthias Ringwald }
5344902524cSMatthias Ringwald 
5354902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsForService){
5364902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16;
5374902524cSMatthias Ringwald 	reset_query_state();
5384902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
5394902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5404902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5414902524cSMatthias Ringwald 
5424902524cSMatthias Ringwald 	reset_query_state();
5434902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
5444902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5454902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5464902524cSMatthias Ringwald 	verify_charasteristics();
547*a382a4adSMilanka Ringwald 
548*a382a4adSMilanka Ringwald 	// invalid con handle
549*a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]);
550*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
551*a382a4adSMilanka Ringwald 
552*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
553*a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]);
554*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5554902524cSMatthias Ringwald }
5564902524cSMatthias Ringwald 
5574902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){
5584902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID16;
5594902524cSMatthias Ringwald 	reset_query_state();
5604902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102);
5614902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5624902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5634902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
564*a382a4adSMilanka Ringwald 
565*a382a4adSMilanka Ringwald 	// invalid con handle
566*a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 0x30, 0x32, 0xF102);
567*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
568*a382a4adSMilanka Ringwald 
569*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
570*a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102);
571*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5724902524cSMatthias Ringwald }
5734902524cSMatthias Ringwald 
5744902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){
5754902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_BY_UUID128;
5764902524cSMatthias Ringwald 	reset_query_state();
5774902524cSMatthias 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]);
5784902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5794902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5804902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
581*a382a4adSMilanka Ringwald 
582*a382a4adSMilanka Ringwald 	// invalid con handle
583*a382a4adSMilanka 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]);
584*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
585*a382a4adSMilanka Ringwald 
586*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
587*a382a4adSMilanka 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]);
588*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
5894902524cSMatthias Ringwald }
5904902524cSMatthias Ringwald 
5914902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){
5924902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
5934902524cSMatthias Ringwald 	reset_query_state();
5944902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
5954902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
5964902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
5974902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
5984902524cSMatthias Ringwald 
5994902524cSMatthias Ringwald 	reset_query_state();
6004902524cSMatthias Ringwald 	uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
6014902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
6024902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6034902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6044902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6054902524cSMatthias Ringwald 
6064902524cSMatthias Ringwald 	reset_query_state();
6074902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
6084902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6094902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6104902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6114902524cSMatthias Ringwald }
6124902524cSMatthias Ringwald 
6134902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){
6144902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID;
6154902524cSMatthias Ringwald 	reset_query_state();
6164902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6174902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6184902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6194902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6204902524cSMatthias Ringwald 
6214902524cSMatthias Ringwald 	reset_query_state();
6224902524cSMatthias Ringwald 	uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
6234902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid);
6244902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6254902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6264902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6274902524cSMatthias Ringwald 
6284902524cSMatthias Ringwald 	reset_query_state();
6294902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6304902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6314902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6324902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6334902524cSMatthias Ringwald }
6344902524cSMatthias Ringwald 
6354902524cSMatthias Ringwald TEST(GATTClient, TestDiscoverCharacteristicDescriptor){
6364902524cSMatthias Ringwald 	test = DISCOVER_CHARACTERISTIC_DESCRIPTORS;
6378404d3b7SMilanka Ringwald 
6388404d3b7SMilanka Ringwald 	reset_query_state();
6398404d3b7SMilanka Ringwald 	// invalid con handle
6408404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16);
6418404d3b7SMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
6428404d3b7SMilanka Ringwald 
6438404d3b7SMilanka Ringwald 	set_wrong_gatt_client_state();
6448404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6458404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
6468404d3b7SMilanka Ringwald 
6474902524cSMatthias Ringwald 	reset_query_state();
6484902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6494902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6504902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6514902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6524902524cSMatthias Ringwald 
6534902524cSMatthias Ringwald 	reset_query_state();
6544902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6554902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6564902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6574902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6584902524cSMatthias Ringwald 
6594902524cSMatthias Ringwald 	reset_query_state();
6604902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
6614902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6624902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6634902524cSMatthias Ringwald 	CHECK(result_counter);
6644902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_index);
6654902524cSMatthias Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
6664902524cSMatthias Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
6674902524cSMatthias Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
6684902524cSMatthias Ringwald }
6694902524cSMatthias Ringwald 
6704902524cSMatthias Ringwald TEST(GATTClient, TestWriteClientCharacteristicConfiguration){
6714902524cSMatthias Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
6724902524cSMatthias Ringwald 	reset_query_state();
6734902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
6744902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6754902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6764902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6774902524cSMatthias Ringwald 
6784902524cSMatthias Ringwald 	reset_query_state();
6794902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
6804902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
6814902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
6824902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
6834902524cSMatthias Ringwald 
6848404d3b7SMilanka Ringwald 	// invalid con handle
6858404d3b7SMilanka Ringwald     status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
6868404d3b7SMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
6878404d3b7SMilanka Ringwald 
6888404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
6898404d3b7SMilanka Ringwald     status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
6908404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
6918404d3b7SMilanka Ringwald 
6924902524cSMatthias Ringwald 	reset_query_state();
6934902524cSMatthias Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
6944902524cSMatthias Ringwald  	CHECK_EQUAL(0, status);
6954902524cSMatthias Ringwald  	CHECK_EQUAL(1, gatt_query_complete);
6964902524cSMatthias Ringwald  	CHECK_EQUAL(1, result_counter);
6978404d3b7SMilanka Ringwald 
6988404d3b7SMilanka Ringwald  	reset_query_state();
6998404d3b7SMilanka Ringwald 	characteristics->properties = 0;
7008404d3b7SMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION);
7018404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status);
7028404d3b7SMilanka Ringwald 
7038404d3b7SMilanka Ringwald  	reset_query_state();
7048404d3b7SMilanka Ringwald 	characteristics->properties = 0;
7058404d3b7SMilanka Ringwald 	status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION);
7068404d3b7SMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status);
7074902524cSMatthias Ringwald }
7084902524cSMatthias Ringwald 
7094902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicDescriptor){
7104902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_DESCRIPTOR;
7114902524cSMatthias Ringwald 	reset_query_state();
7124902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
7134902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7144902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7154902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7164902524cSMatthias Ringwald 
7174902524cSMatthias Ringwald 	reset_query_state();
7184902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
7194902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7204902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7214902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
7224902524cSMatthias Ringwald 
7234902524cSMatthias Ringwald 	reset_query_state();
7244902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
7254902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7264902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7274902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
7284902524cSMatthias Ringwald 
729*a382a4adSMilanka Ringwald 	// invalid con handle
730*a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, HCI_CON_HANDLE_INVALID,  &characteristics[0]);
731*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
732*a382a4adSMilanka Ringwald 
733*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
734*a382a4adSMilanka Ringwald     status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle,  &characteristics[0]);
735*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
736*a382a4adSMilanka Ringwald 
737*a382a4adSMilanka Ringwald 	reset_query_state();
738*a382a4adSMilanka Ringwald 	uint16_t end_handle = characteristics[0].end_handle;
739*a382a4adSMilanka Ringwald 	characteristics[0].end_handle = characteristics[0].value_handle;
740*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
741*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
742*a382a4adSMilanka Ringwald 	characteristics[0].end_handle = end_handle;
743*a382a4adSMilanka Ringwald 
7444902524cSMatthias Ringwald 	reset_query_state();
7454902524cSMatthias Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
7464902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
7474902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
7484902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
7498404d3b7SMilanka Ringwald 
7508404d3b7SMilanka Ringwald 	// invalid con handle
7518404d3b7SMilanka Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]);
7528404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
7538404d3b7SMilanka Ringwald 
7548404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
7558404d3b7SMilanka Ringwald 	status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
7568404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
7574902524cSMatthias Ringwald }
7584902524cSMatthias Ringwald 
759*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristic_using_value_handle){
760*a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
761*a382a4adSMilanka Ringwald 	reset_query_state();
762*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
763*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
764*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
765*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
766*a382a4adSMilanka Ringwald 
767*a382a4adSMilanka Ringwald 	reset_query_state();
768*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
769*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
770*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
771*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
772*a382a4adSMilanka Ringwald 
773*a382a4adSMilanka Ringwald 	// invalid con handle
774*a382a4adSMilanka Ringwald     status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle);
775*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
776*a382a4adSMilanka Ringwald 
777*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
778*a382a4adSMilanka Ringwald     status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle);
779*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
780*a382a4adSMilanka Ringwald 	reset_query_state();
781*a382a4adSMilanka Ringwald }
782*a382a4adSMilanka Ringwald 
783*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset){
784*a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
785*a382a4adSMilanka Ringwald 	reset_query_state();
786*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
787*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
788*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
789*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
790*a382a4adSMilanka Ringwald 
791*a382a4adSMilanka Ringwald 	reset_query_state();
792*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
793*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
794*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
795*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
796*a382a4adSMilanka Ringwald 
797*a382a4adSMilanka Ringwald 	// invalid con handle
798*a382a4adSMilanka 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);
799*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
800*a382a4adSMilanka Ringwald 
801*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
802*a382a4adSMilanka 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);
803*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
804*a382a4adSMilanka Ringwald 	reset_query_state();
805*a382a4adSMilanka Ringwald }
806*a382a4adSMilanka Ringwald 
807*a382a4adSMilanka Ringwald 
808*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid16){
809*a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
810*a382a4adSMilanka Ringwald 	reset_query_state();
811*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
812*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
813*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
814*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
815*a382a4adSMilanka Ringwald 
816*a382a4adSMilanka Ringwald 	reset_query_state();
817*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
818*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
819*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
820*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
821*a382a4adSMilanka Ringwald 
822*a382a4adSMilanka Ringwald 	reset_query_state();
823*a382a4adSMilanka 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);
824*a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
825*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
826*a382a4adSMilanka Ringwald 
827*a382a4adSMilanka Ringwald 	// invalid con handle
828*a382a4adSMilanka 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);
829*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
830*a382a4adSMilanka Ringwald 
831*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
832*a382a4adSMilanka 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);
833*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
834*a382a4adSMilanka Ringwald 	reset_query_state();
835*a382a4adSMilanka Ringwald }
836*a382a4adSMilanka Ringwald 
837*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid128){
838*a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
839*a382a4adSMilanka Ringwald 	reset_query_state();
840*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
841*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
842*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
843*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
844*a382a4adSMilanka Ringwald 
845*a382a4adSMilanka Ringwald 	reset_query_state();
846*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
847*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
848*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
849*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
850*a382a4adSMilanka Ringwald 
851*a382a4adSMilanka Ringwald 	reset_query_state();
852*a382a4adSMilanka 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);
853*a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
854*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
855*a382a4adSMilanka Ringwald 
856*a382a4adSMilanka Ringwald 	// invalid con handle
857*a382a4adSMilanka 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);
858*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
859*a382a4adSMilanka Ringwald 
860*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
861*a382a4adSMilanka 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);
862*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
863*a382a4adSMilanka Ringwald 	reset_query_state();
864*a382a4adSMilanka Ringwald }
865*a382a4adSMilanka Ringwald 
866*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_write_characteristic_descriptor_using_descriptor_handle){
867*a382a4adSMilanka Ringwald 	test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION;
868*a382a4adSMilanka Ringwald 	reset_query_state();
869*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
870*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
871*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
872*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
873*a382a4adSMilanka Ringwald 
874*a382a4adSMilanka Ringwald 	reset_query_state();
875*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
876*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
877*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
878*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
879*a382a4adSMilanka Ringwald 
880*a382a4adSMilanka Ringwald 
881*a382a4adSMilanka Ringwald 	reset_query_state();
882*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
883*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
884*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
885*a382a4adSMilanka Ringwald 	CHECK_EQUAL(3, result_counter);
886*a382a4adSMilanka Ringwald 
887*a382a4adSMilanka Ringwald 	reset_query_state();
888*a382a4adSMilanka 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);
889*a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
890*a382a4adSMilanka Ringwald 
891*a382a4adSMilanka Ringwald 	// invalid con handle
892*a382a4adSMilanka 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);
893*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
894*a382a4adSMilanka Ringwald 
895*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
896*a382a4adSMilanka 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);
897*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
898*a382a4adSMilanka Ringwald 	reset_query_state();
899*a382a4adSMilanka Ringwald }
900*a382a4adSMilanka Ringwald 
901*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_prepare_write){
902*a382a4adSMilanka Ringwald 	reset_query_state();
903*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
904*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
905*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
906*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
907*a382a4adSMilanka Ringwald 
908*a382a4adSMilanka Ringwald 	reset_query_state();
909*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
910*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
911*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
912*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
913*a382a4adSMilanka Ringwald 
914*a382a4adSMilanka Ringwald 	reset_query_state();
915*a382a4adSMilanka 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);
916*a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
917*a382a4adSMilanka Ringwald 
918*a382a4adSMilanka Ringwald 	// invalid con handle
919*a382a4adSMilanka 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);
920*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
921*a382a4adSMilanka Ringwald 
922*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
923*a382a4adSMilanka 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);
924*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
925*a382a4adSMilanka Ringwald 	reset_query_state();
926*a382a4adSMilanka Ringwald }
927*a382a4adSMilanka Ringwald 
928*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_execute_write){
929*a382a4adSMilanka Ringwald 	reset_query_state();
930*a382a4adSMilanka Ringwald 	status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle);
931*a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
932*a382a4adSMilanka Ringwald 
933*a382a4adSMilanka Ringwald 	// invalid con handle
934*a382a4adSMilanka Ringwald     status = gatt_client_execute_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
935*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
936*a382a4adSMilanka Ringwald 
937*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
938*a382a4adSMilanka Ringwald     status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle);
939*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
940*a382a4adSMilanka Ringwald 	reset_query_state();
941*a382a4adSMilanka Ringwald }
942*a382a4adSMilanka Ringwald 
943*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_cancel_write){
944*a382a4adSMilanka Ringwald 	reset_query_state();
945*a382a4adSMilanka Ringwald 	status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle);
946*a382a4adSMilanka Ringwald  	CHECK_EQUAL(0, status);
947*a382a4adSMilanka Ringwald 
948*a382a4adSMilanka Ringwald 	// invalid con handle
949*a382a4adSMilanka Ringwald     status = gatt_client_cancel_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
950*a382a4adSMilanka Ringwald  	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
951*a382a4adSMilanka Ringwald 
952*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
953*a382a4adSMilanka Ringwald     status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle);
954*a382a4adSMilanka Ringwald  	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
955*a382a4adSMilanka Ringwald 	reset_query_state();
956*a382a4adSMilanka Ringwald }
957*a382a4adSMilanka Ringwald 
958*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_deserialize_service){
959*a382a4adSMilanka Ringwald 	gatt_client_service_t service;
960*a382a4adSMilanka Ringwald 	gatt_client_deserialize_service(service_data_uuid16, 0, &service);
961*a382a4adSMilanka Ringwald 	gatt_client_deserialize_service(service_data_uuid128, 0, &service);
962*a382a4adSMilanka Ringwald }
963*a382a4adSMilanka Ringwald 
964*a382a4adSMilanka Ringwald // TEST(GATTClient, gatt_client_deserialize_characteristic){
965*a382a4adSMilanka Ringwald // 	gatt_client_characteristic_t characteristic;
966*a382a4adSMilanka Ringwald // 	gatt_client_deserialize_characteristic(characteristic_data_uuid16, 0, &characteristic);
967*a382a4adSMilanka Ringwald // 	gatt_client_deserialize_characteristic(characteristic_data_uuid128, 0, &characteristic);
968*a382a4adSMilanka Ringwald // }
969*a382a4adSMilanka Ringwald 
970*a382a4adSMilanka Ringwald // TEST(GATTClient, gatt_client_deserialize_characteristic_descriptor){
971*a382a4adSMilanka Ringwald // 	gatt_client_characteristic_descriptor_t characteristic_descriptor;
972*a382a4adSMilanka Ringwald // 	gatt_client_deserialize_characteristic_descriptor(characteristic_descriptor_data_uuid16, 0, &characteristic_descriptor);
973*a382a4adSMilanka Ringwald // 	gatt_client_deserialize_characteristic_descriptor(characteristic_descriptor_data_uuid128, 0, &characteristic_descriptor);
974*a382a4adSMilanka Ringwald // }
975*a382a4adSMilanka Ringwald 
9764902524cSMatthias Ringwald TEST(GATTClient, TestReadCharacteristicValue){
9774902524cSMatthias Ringwald 	test = READ_CHARACTERISTIC_VALUE;
9784902524cSMatthias Ringwald 	reset_query_state();
9794902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
9804902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9814902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9824902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9834902524cSMatthias Ringwald 
9844902524cSMatthias Ringwald 	reset_query_state();
9854902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
9864902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9874902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9884902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
9894902524cSMatthias Ringwald 
9904902524cSMatthias Ringwald 	reset_query_state();
9914902524cSMatthias Ringwald 	status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
9924902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
9934902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
9944902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
9954902524cSMatthias Ringwald }
9964902524cSMatthias Ringwald 
9974902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicValue){
9984902524cSMatthias Ringwald     test = WRITE_CHARACTERISTIC_VALUE;
9994902524cSMatthias Ringwald 	reset_query_state();
10004902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
10014902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10024902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10034902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10044902524cSMatthias Ringwald 
10054902524cSMatthias Ringwald 	reset_query_state();
10064902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
10074902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10084902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10094902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10104902524cSMatthias Ringwald 
10118404d3b7SMilanka Ringwald // invalid con handle
10128404d3b7SMilanka 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);
10138404d3b7SMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
10148404d3b7SMilanka Ringwald 
10158404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
10168404d3b7SMilanka 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);
10178404d3b7SMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
10188404d3b7SMilanka Ringwald 
10198404d3b7SMilanka Ringwald 
10204902524cSMatthias Ringwald 	reset_query_state();
10214902524cSMatthias 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);
10224902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10234902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10244902524cSMatthias Ringwald }
10254902524cSMatthias Ringwald 
10264902524cSMatthias Ringwald TEST(GATTClient, TestWriteCharacteristicDescriptor){
10274902524cSMatthias Ringwald 	test = WRITE_CHARACTERISTIC_DESCRIPTOR;
10284902524cSMatthias Ringwald 	reset_query_state();
10294902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
10304902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10314902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10324902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10334902524cSMatthias Ringwald 
10344902524cSMatthias Ringwald 	reset_query_state();
10354902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
10364902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10374902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10384902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10394902524cSMatthias Ringwald 
10404902524cSMatthias Ringwald 	reset_query_state();
10414902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
10424902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10434902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10444902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
10454902524cSMatthias Ringwald 
10464902524cSMatthias Ringwald 	reset_query_state();
10474902524cSMatthias Ringwald 	status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication);
10484902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10494902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10504902524cSMatthias Ringwald }
10514902524cSMatthias Ringwald 
10524902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicValue){
10534902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_VALUE;
10544902524cSMatthias Ringwald 	reset_query_state();
10554902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
10564902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10574902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10584902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10594902524cSMatthias Ringwald 
10604902524cSMatthias Ringwald 	reset_query_state();
10614902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
10624902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10634902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10644902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10654902524cSMatthias Ringwald 
10664902524cSMatthias Ringwald 	reset_query_state();
10674902524cSMatthias Ringwald 	status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
10684902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10694902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10708404d3b7SMilanka Ringwald 	CHECK_EQUAL(4, result_counter);
10714902524cSMatthias Ringwald }
10724902524cSMatthias Ringwald 
10734902524cSMatthias Ringwald TEST(GATTClient, TestReadLongCharacteristicDescriptor){
10744902524cSMatthias Ringwald 	test = READ_LONG_CHARACTERISTIC_DESCRIPTOR;
10754902524cSMatthias Ringwald 	reset_query_state();
10764902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
10774902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10784902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10794902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10804902524cSMatthias Ringwald 
10814902524cSMatthias Ringwald 	reset_query_state();
10824902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
10834902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10844902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10854902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
10864902524cSMatthias Ringwald 
10874902524cSMatthias Ringwald 	reset_query_state();
10884902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
10894902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10904902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10914902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
10924902524cSMatthias Ringwald 
10934902524cSMatthias Ringwald 	reset_query_state();
10944902524cSMatthias Ringwald 	result_counter = 0;
10954902524cSMatthias Ringwald 	status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]);
10964902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
10974902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
10988404d3b7SMilanka Ringwald 	CHECK_EQUAL(4, result_counter);
10994902524cSMatthias Ringwald }
11004902524cSMatthias Ringwald 
11014902524cSMatthias Ringwald 
11024902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicDescriptor){
11034902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR;
11044902524cSMatthias Ringwald 	reset_query_state();
11054902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128);
11064902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11074902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11084902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11094902524cSMatthias Ringwald 
11104902524cSMatthias Ringwald 	reset_query_state();
11114902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200);
11124902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11134902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11144902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11154902524cSMatthias Ringwald 
11164902524cSMatthias Ringwald 	reset_query_state();
11174902524cSMatthias Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
11184902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11194902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11204902524cSMatthias Ringwald 	CHECK_EQUAL(3, result_counter);
11214902524cSMatthias Ringwald 
11224902524cSMatthias Ringwald 	result_counter = 0;
11234902524cSMatthias Ringwald 	status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value);
11244902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11254902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11264902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11274902524cSMatthias Ringwald }
11284902524cSMatthias Ringwald 
11294902524cSMatthias Ringwald TEST(GATTClient, TestWriteLongCharacteristicValue){
11304902524cSMatthias Ringwald 	test = WRITE_LONG_CHARACTERISTIC_VALUE;
11314902524cSMatthias Ringwald 	reset_query_state();
11324902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
11334902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11344902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11354902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11364902524cSMatthias Ringwald 
11374902524cSMatthias Ringwald 	reset_query_state();
11384902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
11394902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11404902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11414902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11424902524cSMatthias Ringwald 
11434902524cSMatthias Ringwald 
11444902524cSMatthias Ringwald 	reset_query_state();
11454902524cSMatthias 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);
11464902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11474902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11484902524cSMatthias Ringwald }
11494902524cSMatthias Ringwald 
11504902524cSMatthias Ringwald TEST(GATTClient, TestWriteReliableLongCharacteristicValue){
11514902524cSMatthias Ringwald 	test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE;
11524902524cSMatthias Ringwald 	reset_query_state();
11534902524cSMatthias Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
11544902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11554902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11564902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11574902524cSMatthias Ringwald 
11584902524cSMatthias Ringwald 	reset_query_state();
11594902524cSMatthias Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
11604902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11614902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11624902524cSMatthias Ringwald 	CHECK_EQUAL(1, result_counter);
11634902524cSMatthias Ringwald 
11648404d3b7SMilanka Ringwald 	// invalid con handle
11658404d3b7SMilanka 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);
11668404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
11678404d3b7SMilanka Ringwald 
11688404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
11698404d3b7SMilanka 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);
11708404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
11718404d3b7SMilanka Ringwald 
11724902524cSMatthias Ringwald 	reset_query_state();
11734902524cSMatthias 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);
11744902524cSMatthias Ringwald 	CHECK_EQUAL(0, status);
11754902524cSMatthias Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11764902524cSMatthias Ringwald }
11774902524cSMatthias Ringwald 
11788404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){
11798404d3b7SMilanka Ringwald 	reset_query_state();
11808404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
11818404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11828404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11838404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11848404d3b7SMilanka Ringwald 
11858404d3b7SMilanka Ringwald 	reset_query_state();
11868404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
11878404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11888404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
11898404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
11908404d3b7SMilanka Ringwald 
11918404d3b7SMilanka Ringwald 	reset_query_state();
11928404d3b7SMilanka 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);
11938404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
11948404d3b7SMilanka Ringwald 
11958404d3b7SMilanka Ringwald 	reset_query_state();
11968404d3b7SMilanka Ringwald 	// invalid con handle
11978404d3b7SMilanka 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);
11988404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
11998404d3b7SMilanka Ringwald 
12008404d3b7SMilanka Ringwald     reset_query_state();
12018404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
12028404d3b7SMilanka 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);
12038404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
12048404d3b7SMilanka Ringwald }
12058404d3b7SMilanka Ringwald 
12068404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){
12078404d3b7SMilanka Ringwald 	reset_query_state();
12088404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
12098404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12108404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12118404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12128404d3b7SMilanka Ringwald 
12138404d3b7SMilanka Ringwald 	reset_query_state();
12148404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]);
12158404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12168404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12178404d3b7SMilanka Ringwald 	CHECK(result_counter);
12188404d3b7SMilanka Ringwald 	CHECK_EQUAL(3, result_index);
12198404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2902, descriptors[0].uuid16);
12208404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2900, descriptors[1].uuid16);
12218404d3b7SMilanka Ringwald 	CHECK_EQUAL(0x2901, descriptors[2].uuid16);
12228404d3b7SMilanka Ringwald 
12238404d3b7SMilanka Ringwald 	reset_query_state();
12248404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0);
12258404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12268404d3b7SMilanka Ringwald 
12278404d3b7SMilanka Ringwald 	reset_query_state();
12288404d3b7SMilanka Ringwald 	// invalid con handle
12298404d3b7SMilanka 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);
12308404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
12318404d3b7SMilanka Ringwald 
12328404d3b7SMilanka Ringwald     reset_query_state();
12338404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
12348404d3b7SMilanka Ringwald 	status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0);
12358404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
12368404d3b7SMilanka Ringwald }
12378404d3b7SMilanka Ringwald 
12388404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_read_multiple_characteristic_values){
12398404d3b7SMilanka Ringwald 	reset_query_state();
12408404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
12418404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12428404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12438404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12448404d3b7SMilanka Ringwald 
12458404d3b7SMilanka Ringwald 	reset_query_state();
12468404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
12478404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12488404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12498404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12508404d3b7SMilanka Ringwald 
12518404d3b7SMilanka Ringwald 	uint16_t value_handles[] = {characteristics[0].value_handle};
12528404d3b7SMilanka Ringwald 
12538404d3b7SMilanka Ringwald 	reset_query_state();
12548404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles);
12558404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12568404d3b7SMilanka Ringwald 
12578404d3b7SMilanka Ringwald 	reset_query_state();
12588404d3b7SMilanka Ringwald 	// invalid con handle
12598404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles);
12608404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
12618404d3b7SMilanka Ringwald 
12628404d3b7SMilanka Ringwald 	reset_query_state();
12638404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
12648404d3b7SMilanka Ringwald 	status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles);
12658404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
12668404d3b7SMilanka Ringwald }
12678404d3b7SMilanka Ringwald 
12688404d3b7SMilanka Ringwald TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){
12698404d3b7SMilanka Ringwald 	reset_query_state();
12708404d3b7SMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
12718404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12728404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12738404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12748404d3b7SMilanka Ringwald 
12758404d3b7SMilanka Ringwald 	reset_query_state();
12768404d3b7SMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
12778404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12788404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
12798404d3b7SMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
12808404d3b7SMilanka Ringwald 
12818404d3b7SMilanka Ringwald 	uint16_t value_handles[] = {characteristics[0].value_handle};
12828404d3b7SMilanka Ringwald 
12838404d3b7SMilanka Ringwald 	reset_query_state();
12848404d3b7SMilanka Ringwald 	// invalid con handle
12858404d3b7SMilanka 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);
12868404d3b7SMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
12878404d3b7SMilanka Ringwald 
12888404d3b7SMilanka Ringwald 	reset_query_state();
12898404d3b7SMilanka Ringwald     set_wrong_gatt_client_state();
12908404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value);
12918404d3b7SMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status);
12928404d3b7SMilanka Ringwald 
12938404d3b7SMilanka Ringwald 	reset_query_state();
12948404d3b7SMilanka Ringwald 
12958404d3b7SMilanka Ringwald 	status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value);
12968404d3b7SMilanka Ringwald 	CHECK_EQUAL(0, status);
12978404d3b7SMilanka Ringwald }
12984902524cSMatthias Ringwald 
1299*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_is_ready){
1300*a382a4adSMilanka Ringwald 	int status = gatt_client_is_ready(HCI_CON_HANDLE_INVALID);
1301*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1302*a382a4adSMilanka Ringwald 
1303*a382a4adSMilanka Ringwald 	status = gatt_client_is_ready(gatt_client_handle);
1304*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, status);
1305*a382a4adSMilanka Ringwald }
1306*a382a4adSMilanka Ringwald 
1307*a382a4adSMilanka Ringwald 
1308*a382a4adSMilanka Ringwald TEST(GATTClient, register_for_notification){
1309*a382a4adSMilanka Ringwald 	reset_query_state();
1310*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
1311*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1312*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1313*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1314*a382a4adSMilanka Ringwald 
1315*a382a4adSMilanka Ringwald 	reset_query_state();
1316*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
1317*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1318*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1319*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1320*a382a4adSMilanka Ringwald 
1321*a382a4adSMilanka Ringwald 	gatt_client_notification_t notification;
1322*a382a4adSMilanka Ringwald 
1323*a382a4adSMilanka Ringwald 	gatt_client_listen_for_characteristic_value_updates(&notification, handle_ble_client_event, gatt_client_handle, &characteristics[0]);
1324*a382a4adSMilanka Ringwald 	gatt_client_stop_listening_for_characteristic_value_updates(&notification);
1325*a382a4adSMilanka Ringwald 
1326*a382a4adSMilanka Ringwald 	gatt_client_listen_for_characteristic_value_updates(&notification, handle_ble_client_event, gatt_client_handle, NULL);
1327*a382a4adSMilanka Ringwald 	gatt_client_stop_listening_for_characteristic_value_updates(&notification);
1328*a382a4adSMilanka Ringwald }
1329*a382a4adSMilanka Ringwald 
1330*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_signed_write_without_response){
1331*a382a4adSMilanka Ringwald 	reset_query_state();
1332*a382a4adSMilanka Ringwald 	status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16);
1333*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1334*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1335*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1336*a382a4adSMilanka Ringwald 
1337*a382a4adSMilanka Ringwald 	reset_query_state();
1338*a382a4adSMilanka Ringwald 	status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100);
1339*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1340*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, gatt_query_complete);
1341*a382a4adSMilanka Ringwald 	CHECK_EQUAL(1, result_counter);
1342*a382a4adSMilanka Ringwald 
1343*a382a4adSMilanka Ringwald 	reset_query_state();
1344*a382a4adSMilanka Ringwald 	// invalid con handle
1345*a382a4adSMilanka 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);
1346*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
1347*a382a4adSMilanka Ringwald 
1348*a382a4adSMilanka Ringwald 	reset_query_state();
1349*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
1350*a382a4adSMilanka 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);
1351*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1352*a382a4adSMilanka Ringwald 
1353*a382a4adSMilanka Ringwald 	reset_query_state();
1354*a382a4adSMilanka Ringwald 
1355*a382a4adSMilanka 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);
1356*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1357*a382a4adSMilanka Ringwald }
1358*a382a4adSMilanka Ringwald 
1359*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_discover_secondary_services){
1360*a382a4adSMilanka Ringwald 	reset_query_state();
1361*a382a4adSMilanka Ringwald 	// invalid con handle
1362*a382a4adSMilanka Ringwald 	status = gatt_client_discover_secondary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID);
1363*a382a4adSMilanka Ringwald     CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
1364*a382a4adSMilanka Ringwald 
1365*a382a4adSMilanka Ringwald 	reset_query_state();
1366*a382a4adSMilanka Ringwald     set_wrong_gatt_client_state();
1367*a382a4adSMilanka Ringwald 	status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle);
1368*a382a4adSMilanka Ringwald     CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1369*a382a4adSMilanka Ringwald 
1370*a382a4adSMilanka Ringwald 	reset_query_state();
1371*a382a4adSMilanka Ringwald 
1372*a382a4adSMilanka Ringwald 	status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle);
1373*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1374*a382a4adSMilanka Ringwald }
1375*a382a4adSMilanka Ringwald 
1376*a382a4adSMilanka Ringwald 
1377*a382a4adSMilanka Ringwald 
1378*a382a4adSMilanka Ringwald TEST(GATTClient, gatt_client_get_mtu){
1379*a382a4adSMilanka Ringwald 	reset_query_state();
1380*a382a4adSMilanka Ringwald 	uint16_t mtu;
1381*a382a4adSMilanka Ringwald 	int status = gatt_client_get_mtu(HCI_CON_HANDLE_INVALID, &mtu);
1382*a382a4adSMilanka Ringwald 	CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
1383*a382a4adSMilanka Ringwald 
1384*a382a4adSMilanka Ringwald 	status = gatt_client_get_mtu(gatt_client_handle, &mtu);
1385*a382a4adSMilanka Ringwald 	CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
1386*a382a4adSMilanka Ringwald 	CHECK_EQUAL(ATT_DEFAULT_MTU, mtu);
1387*a382a4adSMilanka Ringwald 
1388*a382a4adSMilanka Ringwald 	gatt_client_t * gatt_client = gatt_client_get_client(gatt_client_handle);
1389*a382a4adSMilanka Ringwald 	CHECK_TRUE(gatt_client != NULL);
1390*a382a4adSMilanka Ringwald 	gatt_client->mtu = 30;
1391*a382a4adSMilanka Ringwald 
1392*a382a4adSMilanka Ringwald 	gatt_client->mtu_state = MTU_EXCHANGED;
1393*a382a4adSMilanka Ringwald 	status = gatt_client_get_mtu(gatt_client_handle, &mtu);
1394*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1395*a382a4adSMilanka Ringwald 	CHECK_EQUAL(gatt_client->mtu, mtu);
1396*a382a4adSMilanka Ringwald 
1397*a382a4adSMilanka Ringwald 	gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED;
1398*a382a4adSMilanka Ringwald 	status = gatt_client_get_mtu(gatt_client_handle, &mtu);
1399*a382a4adSMilanka Ringwald 	CHECK_EQUAL(0, status);
1400*a382a4adSMilanka Ringwald 	CHECK_EQUAL(gatt_client->mtu, mtu);
1401*a382a4adSMilanka Ringwald 
1402*a382a4adSMilanka Ringwald 	gatt_client->mtu_state = SEND_MTU_EXCHANGE;
1403*a382a4adSMilanka Ringwald }
1404*a382a4adSMilanka Ringwald 
1405*a382a4adSMilanka Ringwald 
14064902524cSMatthias Ringwald int main (int argc, const char * argv[]){
14074902524cSMatthias Ringwald 	att_set_db(profile_data);
14084902524cSMatthias Ringwald 	att_set_write_callback(&att_write_callback);
14094902524cSMatthias Ringwald 	att_set_read_callback(&att_read_callback);
14104902524cSMatthias Ringwald 
14114902524cSMatthias Ringwald 	gatt_client_init();
14124902524cSMatthias Ringwald 
14134902524cSMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
14144902524cSMatthias Ringwald }
1415