// ***************************************************************************** // // test rfcomm query tests // // ***************************************************************************** #include #include #include #include #include "CppUTest/TestHarness.h" #include "CppUTest/CommandLineTestRunner.h" #include "hci_cmd.h" #include "btstack_memory.h" #include "hci.h" #include "hci_dump.h" #include "ble/gatt_client.h" #include "ble/att_db.h" #include "profile.h" #include "expected_results.h" extern "C" void hci_setup_le_connection(uint16_t con_handle); static uint16_t gatt_client_handle = 0x40; static int gatt_query_complete = 0; typedef enum { IDLE, DISCOVER_PRIMARY_SERVICES, DISCOVER_PRIMARY_SERVICE_WITH_UUID16, DISCOVER_PRIMARY_SERVICE_WITH_UUID128, DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16, DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128, DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16, DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID128, DISCOVER_CHARACTERISTICS_BY_UUID16, DISCOVER_CHARACTERISTICS_BY_UUID128, DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID, READ_CHARACTERISTIC_VALUE, READ_LONG_CHARACTERISTIC_VALUE, WRITE_CHARACTERISTIC_VALUE, WRITE_LONG_CHARACTERISTIC_VALUE, DISCOVER_CHARACTERISTIC_DESCRIPTORS, READ_CHARACTERISTIC_DESCRIPTOR, WRITE_CHARACTERISTIC_DESCRIPTOR, WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION, READ_LONG_CHARACTERISTIC_DESCRIPTOR, WRITE_LONG_CHARACTERISTIC_DESCRIPTOR, WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE, WRITE_CHARACTERISTIC_VALUE_WITHOUT_RESPONSE } current_test_t; current_test_t test = IDLE; uint8_t characteristic_uuid128[] = {0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5f, 0x9b, 0x34, 0xfb}; uint16_t characteristic_uuid16 = 0xF000; static int result_index; static uint8_t result_counter; static gatt_client_service_t services[50]; static gatt_client_service_t included_services[50]; static gatt_client_characteristic_t characteristics[50]; static gatt_client_characteristic_descriptor_t descriptors[50]; void mock_simulate_discover_primary_services_response(void); void mock_simulate_att_exchange_mtu_response(void); void CHECK_EQUAL_ARRAY(const uint8_t * expected, uint8_t * actual, int size){ for (int i=0; i= buffer_size) blob_length = buffer_size; memcpy(buffer, &value[offset], blob_length); return blob_length; } extern "C" uint16_t att_read_callback(uint16_t handle, uint16_t attribute_handle, uint16_t offset, uint8_t * buffer, uint16_t buffer_size){ //printf("gatt client test, att_read_callback_t handle 0x%04x, offset %u, buffer %p, buffer_size %u\n", handle, offset, buffer, buffer_size); switch(test){ case READ_CHARACTERISTIC_DESCRIPTOR: case READ_CHARACTERISTIC_VALUE: result_counter++; if (buffer){ return copy_bytes((uint8_t *)short_value, short_value_length, offset, buffer, buffer_size); } return short_value_length; case READ_LONG_CHARACTERISTIC_DESCRIPTOR: case READ_LONG_CHARACTERISTIC_VALUE: result_counter++; if (buffer) { return copy_bytes((uint8_t *)long_value, long_value_length, offset, buffer, buffer_size); } return long_value_length; default: break; } return 0; } // static const char * decode_status(uint8_t status){ // switch (status){ // case 0: return "0"; // case GATT_CLIENT_IN_WRONG_STATE: return "GATT_CLIENT_IN_WRONG_STATE"; // case GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS: return "GATT_CLIENT_DIFFERENT_CONTEXT_FOR_ADDRESS_ALREADY_EXISTS"; // case GATT_CLIENT_NOT_CONNECTED: return "GATT_CLIENT_NOT_CONNECTED"; // case GATT_CLIENT_VALUE_TOO_LONG: return "GATT_CLIENT_VALUE_TOO_LONG"; // case GATT_CLIENT_BUSY: return "GATT_CLIENT_BUSY"; // case GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED: return "GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED"; // case GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED: return "GATT_CLIENTCHARACTERISTIC_INDICATION_NOT_SUPPORTED"; // } // } TEST_GROUP(GATTClient){ int acl_buffer_size; uint8_t acl_buffer[27]; uint8_t status; void setup(void){ result_counter = 0; result_index = 0; test = IDLE; hci_setup_le_connection(gatt_client_handle); } gatt_client_t * get_gatt_client(hci_con_handle_t con_handle){ gatt_client_t * gatt_client; (void) gatt_client_get_client(gatt_client_handle, &gatt_client); return gatt_client; } void reset_query_state(void){ gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); gatt_client->state = P_READY; gatt_client_set_required_security_level(LEVEL_0); gatt_client_mtu_enable_auto_negotiation(1); gatt_query_complete = 0; result_counter = 0; result_index = 0; } void set_wrong_gatt_client_state(void){ gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); CHECK_TRUE(gatt_client != NULL); gatt_client->state = P_W2_SEND_SERVICE_QUERY; } }; TEST(GATTClient, gatt_client_setters){ gatt_client_set_required_security_level(LEVEL_4); gatt_client_mtu_enable_auto_negotiation(0); } TEST(GATTClient, gatt_client_is_ready_mtu_exchange_disabled){ gatt_client_mtu_enable_auto_negotiation(0); int status = gatt_client_is_ready(gatt_client_handle); CHECK_EQUAL(1, status); } TEST(GATTClient, TestDiscoverPrimaryServices){ test = DISCOVER_PRIMARY_SERVICES; status = gatt_client_discover_primary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); status = gatt_client_discover_primary_services(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); verify_primary_services(); CHECK_EQUAL(1, gatt_query_complete); } TEST(GATTClient, TestDiscoverPrimaryServicesByUUID16){ test = DISCOVER_PRIMARY_SERVICE_WITH_UUID16; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, result_counter); verify_primary_services_with_uuid16(); CHECK_EQUAL(1, gatt_query_complete); } TEST(GATTClient, TestDiscoverPrimaryServicesByUUID128){ test = DISCOVER_PRIMARY_SERVICE_WITH_UUID128; status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); CHECK_EQUAL(0, status); CHECK_EQUAL(1, result_counter); verify_primary_services_with_uuid128(); CHECK_EQUAL(1, gatt_query_complete); // invalid con handle status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, HCI_CON_HANDLE_INVALID, primary_service_uuid128); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID16){ test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID16; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); reset_query_state(); status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); verify_included_services_uuid16(); } TEST(GATTClient, TestFindIncludedServicesForServiceWithUUID128){ test = DISCOVER_INCLUDED_SERVICE_FOR_SERVICE_WITH_UUID128; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); reset_query_state(); status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); verify_included_services_uuid128(); // invalid con handle status = gatt_client_find_included_services_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_find_included_services_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, TestDiscoverCharacteristicsForService){ test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_WITH_UUID16; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); reset_query_state(); status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); verify_charasteristics(); // invalid con handle status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &services[0]); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_discover_characteristics_for_service(handle_ble_client_event, gatt_client_handle, &services[0]); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, TestDiscoverCharacteristicsByUUID16){ test = DISCOVER_CHARACTERISTICS_BY_UUID16; reset_query_state(); status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 0x30, 0x32, 0xF102); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_discover_characteristics_for_handle_range_by_uuid16(handle_ble_client_event, gatt_client_handle, 0x30, 0x32, 0xF102); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, TestDiscoverCharacteristicsByUUID128){ test = DISCOVER_CHARACTERISTICS_BY_UUID128; reset_query_state(); 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]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle 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]); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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]); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID128){ test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); uint8_t characteristic_uuid[] = {0x00, 0x00, 0xF2, 0x01, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); } TEST(GATTClient, TestDiscoverCharacteristics4ServiceByUUID16){ test = DISCOVER_CHARACTERISTICS_FOR_SERVICE_BY_UUID; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); uint8_t characteristic_uuid[]= { 0x00, 0x00, 0xF1, 0x05, 0x00, 0x00, 0x10, 0x00, 0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB}; status = gatt_client_discover_characteristics_for_service_by_uuid128(handle_ble_client_event, gatt_client_handle, &services[0], characteristic_uuid); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); } TEST(GATTClient, TestDiscoverCharacteristicDescriptor){ test = DISCOVER_CHARACTERISTIC_DESCRIPTORS; reset_query_state(); // invalid con handle status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, HCI_CON_HANDLE_INVALID, service_uuid16); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK(result_counter); CHECK_EQUAL(3, result_index); CHECK_EQUAL(0x2902, descriptors[0].uuid16); CHECK_EQUAL(0x2900, descriptors[1].uuid16); CHECK_EQUAL(0x2901, descriptors[2].uuid16); } TEST(GATTClient, TestWriteClientCharacteristicConfiguration){ test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); characteristics->properties = 0; status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_NOTIFICATION); CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_NOTIFICATION_NOT_SUPPORTED, status); reset_query_state(); characteristics->properties = 0; status = gatt_client_write_client_characteristic_configuration(handle_ble_client_event, gatt_client_handle, &characteristics[0], GATT_CLIENT_CHARACTERISTICS_CONFIGURATION_INDICATION); CHECK_EQUAL(GATT_CLIENT_CHARACTERISTIC_INDICATION_NOT_SUPPORTED, status); } TEST(GATTClient, TestReadCharacteristicDescriptor){ test = READ_CHARACTERISTIC_DESCRIPTOR; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); // invalid con handle status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &characteristics[0]); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); uint16_t end_handle = characteristics[0].end_handle; characteristics[0].end_handle = characteristics[0].value_handle; status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); characteristics[0].end_handle = end_handle; reset_query_state(); status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); // invalid con handle status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, HCI_CON_HANDLE_INVALID, &descriptors[0]); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_read_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, gatt_client_read_value_of_characteristic_using_value_handle){ test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, HCI_CON_HANDLE_INVALID, characteristics[0].value_handle); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_read_value_of_characteristic_using_value_handle(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_read_long_value_of_characteristic_using_value_handle_with_offset){ test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid16){ test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); 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); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_read_value_of_characteristics_by_uuid128){ test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); 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); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_write_characteristic_descriptor_using_descriptor_handle){ test = WRITE_CLIENT_CHARACTERISTIC_CONFIGURATION; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); reset_query_state(); 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); CHECK_EQUAL(0, status); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_prepare_write){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_prepare_write(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, short_value_length, (uint8_t*)short_value); CHECK_EQUAL(0, status); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_prepare_write(handle_ble_client_event, gatt_client_handle, characteristics[0].value_handle, 0, short_value_length, (uint8_t*)short_value); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_execute_write){ reset_query_state(); status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(0, status); // invalid con handle status = gatt_client_execute_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_execute_write(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, gatt_client_cancel_write){ reset_query_state(); status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(0, status); // invalid con handle status = gatt_client_cancel_write(handle_ble_client_event, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); status = gatt_client_cancel_write(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); } TEST(GATTClient, TestReadCharacteristicValue){ test = READ_CHARACTERISTIC_VALUE; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_read_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); } TEST(GATTClient, TestWriteCharacteristicValue){ test = WRITE_CHARACTERISTIC_VALUE; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); 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); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); } TEST(GATTClient, TestWriteCharacteristicDescriptor){ test = WRITE_CHARACTERISTIC_DESCRIPTOR; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); reset_query_state(); status = gatt_client_write_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(indication), indication); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); } TEST(GATTClient, TestReadLongCharacteristicValue){ test = READ_LONG_CHARACTERISTIC_VALUE; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_read_long_value_of_characteristic(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(4, result_counter); } TEST(GATTClient, TestReadLongCharacteristicDescriptor){ test = READ_LONG_CHARACTERISTIC_DESCRIPTOR; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); reset_query_state(); result_counter = 0; status = gatt_client_read_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(4, result_counter); } TEST(GATTClient, TestWriteLongCharacteristicDescriptor){ test = WRITE_LONG_CHARACTERISTIC_DESCRIPTOR; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid128(handle_ble_client_event, gatt_client_handle, primary_service_uuid128); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF200); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(3, result_counter); result_counter = 0; status = gatt_client_write_long_characteristic_descriptor(handle_ble_client_event, gatt_client_handle, &descriptors[0], sizeof(long_value), (uint8_t *)long_value); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); } TEST(GATTClient, TestWriteLongCharacteristicValue){ test = WRITE_LONG_CHARACTERISTIC_VALUE; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); 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); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); } TEST(GATTClient, TestWriteReliableLongCharacteristicValue){ test = WRITE_RELIABLE_LONG_CHARACTERISTIC_VALUE; reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); 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); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); } TEST(GATTClient, gatt_client_write_long_value_of_characteristic_with_offset){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); 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); CHECK_EQUAL(0, status); reset_query_state(); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); reset_query_state(); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristic_descriptors(handle_ble_client_event, gatt_client_handle, &characteristics[0]); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK(result_counter); CHECK_EQUAL(3, result_index); CHECK_EQUAL(0x2902, descriptors[0].uuid16); CHECK_EQUAL(0x2900, descriptors[1].uuid16); CHECK_EQUAL(0x2901, descriptors[2].uuid16); reset_query_state(); status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); CHECK_EQUAL(0, status); reset_query_state(); // invalid con handle status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, HCI_CON_HANDLE_INVALID, descriptors[0].handle, 0); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); reset_query_state(); set_wrong_gatt_client_state(); status = gatt_client_read_long_characteristic_descriptor_using_descriptor_handle_with_offset(handle_ble_client_event, gatt_client_handle, descriptors[0].handle, 0); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, gatt_client_read_multiple_characteristic_values){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); uint16_t value_handles[] = {characteristics[0].value_handle}; reset_query_state(); status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); CHECK_EQUAL(0, status); reset_query_state(); // invalid con handle status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, HCI_CON_HANDLE_INVALID, 1, value_handles); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); reset_query_state(); set_wrong_gatt_client_state(); status = gatt_client_read_multiple_characteristic_values(handle_ble_client_event, gatt_client_handle, 1, value_handles); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); } TEST(GATTClient, gatt_client_write_value_of_characteristic_without_response){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); // invalid con handle status = gatt_client_write_value_of_characteristic_without_response(HCI_CON_HANDLE_INVALID, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); reset_query_state(); set_wrong_gatt_client_state(); status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, long_value_length, (uint8_t*)long_value); CHECK_EQUAL(GATT_CLIENT_VALUE_TOO_LONG, status); reset_query_state(); status = gatt_client_write_value_of_characteristic_without_response(gatt_client_handle, characteristics[0].value_handle, 19, (uint8_t*)long_value); CHECK_EQUAL(0, status); } TEST(GATTClient, gatt_client_is_ready){ int status = gatt_client_is_ready(HCI_CON_HANDLE_INVALID); CHECK_EQUAL(0, status); status = gatt_client_is_ready(gatt_client_handle); CHECK_EQUAL(1, status); } TEST(GATTClient, register_for_notification){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); gatt_client_notification_t notification; gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, &characteristics[0]); gatt_client_stop_listening_for_characteristic_value_updates(¬ification); gatt_client_listen_for_characteristic_value_updates(¬ification, handle_ble_client_event, gatt_client_handle, NULL); gatt_client_stop_listening_for_characteristic_value_updates(¬ification); } TEST(GATTClient, gatt_client_signed_write_without_response){ reset_query_state(); status = gatt_client_discover_primary_services_by_uuid16(handle_ble_client_event, gatt_client_handle, service_uuid16); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); status = gatt_client_discover_characteristics_for_service_by_uuid16(handle_ble_client_event, gatt_client_handle, &services[0], 0xF100); CHECK_EQUAL(0, status); CHECK_EQUAL(1, gatt_query_complete); CHECK_EQUAL(1, result_counter); reset_query_state(); // invalid con handle 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); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); reset_query_state(); set_wrong_gatt_client_state(); 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); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); 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); CHECK_EQUAL(0, status); } TEST(GATTClient, gatt_client_discover_secondary_services){ reset_query_state(); // invalid con handle status = gatt_client_discover_secondary_services(handle_ble_client_event, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); reset_query_state(); set_wrong_gatt_client_state(); status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); reset_query_state(); status = gatt_client_discover_secondary_services(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(0, status); } TEST(GATTClient, gatt_client_request_can_write_without_response_event){ uint8_t status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); CHECK_TRUE(gatt_client != NULL); gatt_client->write_without_response_callback = handle_ble_client_event; status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); gatt_client->write_without_response_callback = NULL; status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(ERROR_CODE_SUCCESS, status); } TEST(GATTClient, gatt_client_request_to_write_without_response){ btstack_context_callback_registration_t callback_registration = { 0 }; uint8_t status = gatt_client_request_to_write_without_response(&callback_registration, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); status = gatt_client_request_can_write_without_response_event(handle_ble_client_event, gatt_client_handle); CHECK_EQUAL(ERROR_CODE_SUCCESS, status); } static void dummy_callback(void * context){ (void) context; } TEST(GATTClient, gatt_client_request_to_send_gatt_query){ btstack_context_callback_registration_t callback_registration = { 0 }; callback_registration.callback = &dummy_callback; uint8_t status = gatt_client_request_to_send_gatt_query(&callback_registration, HCI_CON_HANDLE_INVALID); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); status = gatt_client_request_to_send_gatt_query(&callback_registration, gatt_client_handle); CHECK_EQUAL(ERROR_CODE_SUCCESS, status); } TEST(GATTClient, gatt_client_send_mtu_negotiation){ gatt_client_send_mtu_negotiation(handle_ble_client_event, HCI_CON_HANDLE_INVALID); gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); CHECK_TRUE(gatt_client != NULL); gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; gatt_client_send_mtu_negotiation(handle_ble_client_event, gatt_client_handle); gatt_client->mtu_state = SEND_MTU_EXCHANGE; } TEST(GATTClient, gatt_client_get_mtu){ reset_query_state(); uint16_t mtu; int status = gatt_client_get_mtu(HCI_CON_HANDLE_INVALID, &mtu); CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status); status = gatt_client_get_mtu(gatt_client_handle, &mtu); CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status); CHECK_EQUAL(ATT_DEFAULT_MTU, mtu); gatt_client_t * gatt_client = get_gatt_client(gatt_client_handle); CHECK_TRUE(gatt_client != NULL); gatt_client->mtu = 30; gatt_client->mtu_state = MTU_EXCHANGED; status = gatt_client_get_mtu(gatt_client_handle, &mtu); CHECK_EQUAL(0, status); CHECK_EQUAL(gatt_client->mtu, mtu); gatt_client->mtu_state = MTU_AUTO_EXCHANGE_DISABLED; status = gatt_client_get_mtu(gatt_client_handle, &mtu); CHECK_EQUAL(0, status); CHECK_EQUAL(gatt_client->mtu, mtu); gatt_client->mtu_state = SEND_MTU_EXCHANGE; } int main (int argc, const char * argv[]){ att_set_db(profile_data); att_set_write_callback(&att_write_callback); att_set_read_callback(&att_read_callback); gatt_client_init(); return CommandLineTestRunner::RunAllTests(argc, argv); }