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