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(¬ification, handle_ble_client_event, gatt_client_handle, &characteristics[0]); 1324*a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 1325*a382a4adSMilanka Ringwald 1326*a382a4adSMilanka Ringwald gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, NULL); 1327*a382a4adSMilanka Ringwald gatt_client_stop_listening_for_characteristic_value_updates(¬ification); 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