1*4902524cSMatthias Ringwald // ***************************************************************************** 2*4902524cSMatthias Ringwald // 3*4902524cSMatthias Ringwald // test ANCS Client 4*4902524cSMatthias Ringwald // 5*4902524cSMatthias Ringwald // ***************************************************************************** 6*4902524cSMatthias Ringwald 7*4902524cSMatthias Ringwald 8*4902524cSMatthias Ringwald #include <stdint.h> 9*4902524cSMatthias Ringwald #include <stdio.h> 10*4902524cSMatthias Ringwald #include <stdlib.h> 11*4902524cSMatthias Ringwald #include <string.h> 12*4902524cSMatthias Ringwald 13*4902524cSMatthias Ringwald #include "CppUTest/TestHarness.h" 14*4902524cSMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h" 15*4902524cSMatthias Ringwald #include "CppUTestExt/MockSupport.h" 16*4902524cSMatthias Ringwald 17*4902524cSMatthias Ringwald #include "bluetooth.h" 18*4902524cSMatthias Ringwald #include "bluetooth_gatt.h" 19*4902524cSMatthias Ringwald #include "btstack_debug.h" 20*4902524cSMatthias Ringwald #include "btstack_event.h" 21*4902524cSMatthias Ringwald #include "btstack_memory.h" 22*4902524cSMatthias Ringwald #include "btstack_util.h" 23*4902524cSMatthias Ringwald #include "hci.h" 24*4902524cSMatthias Ringwald 25*4902524cSMatthias Ringwald #include "ble/gatt-service/ancs_client.h" 26*4902524cSMatthias Ringwald #include "mock_gatt_client.h" 27*4902524cSMatthias Ringwald 28*4902524cSMatthias Ringwald extern "C" void ancs_client_set_invalid_parser_state(void); 29*4902524cSMatthias Ringwald 30*4902524cSMatthias Ringwald // mock hci 31*4902524cSMatthias Ringwald 32*4902524cSMatthias Ringwald static const uint8_t ancs_service_uuid[] = {0x79,0x05,0xF4,0x31,0xB5,0xCE,0x4E,0x99,0xA4,0x0F,0x4B,0x1E,0x12,0x2D,0x00,0xD0}; 33*4902524cSMatthias Ringwald static const uint8_t ancs_notification_source_uuid[] = {0x9F,0xBF,0x12,0x0D,0x63,0x01,0x42,0xD9,0x8C,0x58,0x25,0xE6,0x99,0xA2,0x1D,0xBD}; 34*4902524cSMatthias Ringwald static const uint8_t ancs_control_point_uuid[] = {0x69,0xD1,0xD8,0xF3,0x45,0xE1,0x49,0xA8,0x98,0x21,0x9B,0xBD,0xFD,0xAA,0xD9,0xD9}; 35*4902524cSMatthias Ringwald static const uint8_t ancs_data_source_uuid[] = {0x22,0xEA,0xC6,0xE9,0x24,0xD6,0x4B,0xB5,0xBE,0x44,0xB3,0x6A,0xCE,0x7C,0x7B,0xFB}; 36*4902524cSMatthias Ringwald 37*4902524cSMatthias Ringwald static btstack_packet_callback_registration_t * ancs_callback_registration; 38*4902524cSMatthias Ringwald static const hci_con_handle_t ancs_con_handle = 0x001; 39*4902524cSMatthias Ringwald static bool ancs_connected; 40*4902524cSMatthias Ringwald 41*4902524cSMatthias Ringwald void hci_add_event_handler(btstack_packet_callback_registration_t * callback_handler){ 42*4902524cSMatthias Ringwald ancs_callback_registration = callback_handler; 43*4902524cSMatthias Ringwald } 44*4902524cSMatthias Ringwald 45*4902524cSMatthias Ringwald static void hci_emit_event(uint8_t * event, uint16_t size, int dump){ 46*4902524cSMatthias Ringwald btstack_assert(ancs_callback_registration != NULL); 47*4902524cSMatthias Ringwald (*ancs_callback_registration->callback)(HCI_EVENT_PACKET, 0, event, size); 48*4902524cSMatthias Ringwald } 49*4902524cSMatthias Ringwald 50*4902524cSMatthias Ringwald static void hci_emit_le_connection_complete(uint8_t address_type, const bd_addr_t address, hci_con_handle_t con_handle, uint8_t status){ 51*4902524cSMatthias Ringwald uint8_t event[21]; 52*4902524cSMatthias Ringwald event[0] = HCI_EVENT_LE_META; 53*4902524cSMatthias Ringwald event[1] = sizeof(event) - 2u; 54*4902524cSMatthias Ringwald event[2] = HCI_SUBEVENT_LE_CONNECTION_COMPLETE; 55*4902524cSMatthias Ringwald event[3] = status; 56*4902524cSMatthias Ringwald little_endian_store_16(event, 4, con_handle); 57*4902524cSMatthias Ringwald event[6] = 0; // TODO: role 58*4902524cSMatthias Ringwald event[7] = address_type; 59*4902524cSMatthias Ringwald reverse_bd_addr(address, &event[8]); 60*4902524cSMatthias Ringwald little_endian_store_16(event, 14, 0); // interval 61*4902524cSMatthias Ringwald little_endian_store_16(event, 16, 0); // latency 62*4902524cSMatthias Ringwald little_endian_store_16(event, 18, 0); // supervision timeout 63*4902524cSMatthias Ringwald event[20] = 0; // master clock accuracy 64*4902524cSMatthias Ringwald hci_emit_event(event, sizeof(event), 1); 65*4902524cSMatthias Ringwald } 66*4902524cSMatthias Ringwald 67*4902524cSMatthias Ringwald static void hci_emit_connection_encrypted(hci_con_handle_t con_handle, uint8_t encrypted){ 68*4902524cSMatthias Ringwald uint8_t encryption_complete_event[6] = { HCI_EVENT_ENCRYPTION_CHANGE, 4, 0, 0, 0, 0}; 69*4902524cSMatthias Ringwald little_endian_store_16(encryption_complete_event, 3, con_handle); 70*4902524cSMatthias Ringwald encryption_complete_event[5] = encrypted; 71*4902524cSMatthias Ringwald hci_emit_event(encryption_complete_event, sizeof(encryption_complete_event), 0); 72*4902524cSMatthias Ringwald } 73*4902524cSMatthias Ringwald 74*4902524cSMatthias Ringwald static void hci_emit_disconnection_complete(hci_con_handle_t con_handle, uint8_t reason){ 75*4902524cSMatthias Ringwald uint8_t event[6]; 76*4902524cSMatthias Ringwald event[0] = HCI_EVENT_DISCONNECTION_COMPLETE; 77*4902524cSMatthias Ringwald event[1] = sizeof(event) - 2u; 78*4902524cSMatthias Ringwald event[2] = 0; // status = OK 79*4902524cSMatthias Ringwald little_endian_store_16(event, 3, con_handle); 80*4902524cSMatthias Ringwald event[5] = reason; 81*4902524cSMatthias Ringwald hci_emit_event(event, sizeof(event), 1); 82*4902524cSMatthias Ringwald } 83*4902524cSMatthias Ringwald 84*4902524cSMatthias Ringwald // mock sm 85*4902524cSMatthias Ringwald void sm_request_pairing(hci_con_handle_t con_handle){ 86*4902524cSMatthias Ringwald } 87*4902524cSMatthias Ringwald 88*4902524cSMatthias Ringwald 89*4902524cSMatthias Ringwald // temp btstack run loop mock 90*4902524cSMatthias Ringwald 91*4902524cSMatthias Ringwald static btstack_timer_source_t * btstack_timer = NULL; 92*4902524cSMatthias Ringwald 93*4902524cSMatthias Ringwald void btstack_run_lopo_deinit(void){ 94*4902524cSMatthias Ringwald btstack_timer = NULL; 95*4902524cSMatthias Ringwald } 96*4902524cSMatthias Ringwald 97*4902524cSMatthias Ringwald void btstack_run_loop_add_timer(btstack_timer_source_t * timer){ 98*4902524cSMatthias Ringwald btstack_timer = timer; 99*4902524cSMatthias Ringwald } 100*4902524cSMatthias Ringwald 101*4902524cSMatthias Ringwald int btstack_run_loop_remove_timer(btstack_timer_source_t * timer){ 102*4902524cSMatthias Ringwald btstack_timer = NULL; 103*4902524cSMatthias Ringwald return 1; 104*4902524cSMatthias Ringwald } 105*4902524cSMatthias Ringwald 106*4902524cSMatthias Ringwald void btstack_run_loop_set_timer(btstack_timer_source_t * timer, uint32_t timeout_in_ms){ 107*4902524cSMatthias Ringwald } 108*4902524cSMatthias Ringwald 109*4902524cSMatthias Ringwald void btstack_run_loop_set_timer_handler(btstack_timer_source_t * timer, void (*process)(btstack_timer_source_t * _timer)){ 110*4902524cSMatthias Ringwald timer->process = process; 111*4902524cSMatthias Ringwald } 112*4902524cSMatthias Ringwald 113*4902524cSMatthias Ringwald void btstack_run_loop_set_timer_context(btstack_timer_source_t * timer, void * context){ 114*4902524cSMatthias Ringwald timer->context = context; 115*4902524cSMatthias Ringwald } 116*4902524cSMatthias Ringwald 117*4902524cSMatthias Ringwald void * btstack_run_loop_get_timer_context(btstack_timer_source_t * timer){ 118*4902524cSMatthias Ringwald return timer->context; 119*4902524cSMatthias Ringwald } 120*4902524cSMatthias Ringwald 121*4902524cSMatthias Ringwald void mock_btstack_run_loop_trigger_timer(void){ 122*4902524cSMatthias Ringwald btstack_assert(btstack_timer != NULL); 123*4902524cSMatthias Ringwald (*btstack_timer->process)(btstack_timer); 124*4902524cSMatthias Ringwald } 125*4902524cSMatthias Ringwald 126*4902524cSMatthias Ringwald static void ancs_client_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ 127*4902524cSMatthias Ringwald UNUSED(packet_type); 128*4902524cSMatthias Ringwald UNUSED(channel); 129*4902524cSMatthias Ringwald UNUSED(size); 130*4902524cSMatthias Ringwald 131*4902524cSMatthias Ringwald switch (hci_event_gattservice_meta_get_subevent_code(packet)){ 132*4902524cSMatthias Ringwald case ANCS_SUBEVENT_CLIENT_CONNECTED: 133*4902524cSMatthias Ringwald ancs_connected = true; 134*4902524cSMatthias Ringwald break; 135*4902524cSMatthias Ringwald default: 136*4902524cSMatthias Ringwald break; 137*4902524cSMatthias Ringwald } 138*4902524cSMatthias Ringwald } 139*4902524cSMatthias Ringwald 140*4902524cSMatthias Ringwald TEST_GROUP(ANCS_CLIENT){ 141*4902524cSMatthias Ringwald mock_gatt_client_service_t * service; 142*4902524cSMatthias Ringwald mock_gatt_client_characteristic_t * ancs_data_source_characteristic; 143*4902524cSMatthias Ringwald mock_gatt_client_characteristic_t * ancs_notification_source_characteristic; 144*4902524cSMatthias Ringwald mock_gatt_client_characteristic_t * ancs_control_point_characteristic; 145*4902524cSMatthias Ringwald mock_gatt_client_characteristic_descriptor_t * descriptor; 146*4902524cSMatthias Ringwald 147*4902524cSMatthias Ringwald uint8_t value_buffer[3]; 148*4902524cSMatthias Ringwald 149*4902524cSMatthias Ringwald void setup(void){ 150*4902524cSMatthias Ringwald ancs_connected = false; 151*4902524cSMatthias Ringwald mock_gatt_client_reset(); 152*4902524cSMatthias Ringwald ancs_client_init(); 153*4902524cSMatthias Ringwald ancs_client_register_callback(&ancs_client_event_handler); 154*4902524cSMatthias Ringwald } 155*4902524cSMatthias Ringwald 156*4902524cSMatthias Ringwald void setup_service(bool add_characteristics, bool add_descriptors){ 157*4902524cSMatthias Ringwald // TODO: setup ANCS Service 158*4902524cSMatthias Ringwald service = mock_gatt_client_add_primary_service_uuid128(ancs_service_uuid); 159*4902524cSMatthias Ringwald 160*4902524cSMatthias Ringwald if (!add_characteristics) return; 161*4902524cSMatthias Ringwald ancs_control_point_characteristic = mock_gatt_client_add_characteristic_uuid128(ancs_control_point_uuid, ATT_PROPERTY_NOTIFY); 162*4902524cSMatthias Ringwald if (add_descriptors) { 163*4902524cSMatthias Ringwald descriptor = mock_gatt_client_add_characteristic_descriptor_uuid16(ORG_BLUETOOTH_DESCRIPTOR_GATT_CLIENT_CHARACTERISTIC_CONFIGURATION); 164*4902524cSMatthias Ringwald } 165*4902524cSMatthias Ringwald ancs_data_source_characteristic = mock_gatt_client_add_characteristic_uuid128(ancs_data_source_uuid, ATT_PROPERTY_NOTIFY); 166*4902524cSMatthias Ringwald if (add_descriptors) { 167*4902524cSMatthias Ringwald descriptor = mock_gatt_client_add_characteristic_descriptor_uuid16(ORG_BLUETOOTH_DESCRIPTOR_GATT_CLIENT_CHARACTERISTIC_CONFIGURATION); 168*4902524cSMatthias Ringwald } 169*4902524cSMatthias Ringwald ancs_notification_source_characteristic = mock_gatt_client_add_characteristic_uuid128(ancs_notification_source_uuid, ATT_PROPERTY_NOTIFY); 170*4902524cSMatthias Ringwald if (add_descriptors) { 171*4902524cSMatthias Ringwald descriptor = mock_gatt_client_add_characteristic_descriptor_uuid16(ORG_BLUETOOTH_DESCRIPTOR_GATT_CLIENT_CHARACTERISTIC_CONFIGURATION); 172*4902524cSMatthias Ringwald } 173*4902524cSMatthias Ringwald // mock_gatt_client_dump_services(); 174*4902524cSMatthias Ringwald 175*4902524cSMatthias Ringwald } 176*4902524cSMatthias Ringwald 177*4902524cSMatthias Ringwald void connect(void){ 178*4902524cSMatthias Ringwald // simulated connected 179*4902524cSMatthias Ringwald bd_addr_t some_address; 180*4902524cSMatthias Ringwald hci_emit_le_connection_complete(0, some_address, ancs_con_handle, ERROR_CODE_SUCCESS); 181*4902524cSMatthias Ringwald hci_emit_connection_encrypted(ancs_con_handle, 1); 182*4902524cSMatthias Ringwald } 183*4902524cSMatthias Ringwald 184*4902524cSMatthias Ringwald void teardown(void){ 185*4902524cSMatthias Ringwald } 186*4902524cSMatthias Ringwald }; 187*4902524cSMatthias Ringwald 188*4902524cSMatthias Ringwald 189*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, resolve_ids){ 190*4902524cSMatthias Ringwald for (int i = 0; i<6; i++){ 191*4902524cSMatthias Ringwald const char * name = ancs_client_attribute_name_for_id(i); 192*4902524cSMatthias Ringwald CHECK_TRUE(name != NULL); 193*4902524cSMatthias Ringwald } 194*4902524cSMatthias Ringwald CHECK_EQUAL(NULL, ancs_client_attribute_name_for_id(6)); 195*4902524cSMatthias Ringwald } 196*4902524cSMatthias Ringwald 197*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, ignored_events){ 198*4902524cSMatthias Ringwald // default hci event 199*4902524cSMatthias Ringwald uint8_t some_other_event[] = { 0, 0}; 200*4902524cSMatthias Ringwald hci_emit_event(some_other_event, sizeof(some_other_event), 0); 201*4902524cSMatthias Ringwald // default hci le subevent 202*4902524cSMatthias Ringwald uint8_t some_le_event[] = { HCI_EVENT_LE_META, 1, 0}; 203*4902524cSMatthias Ringwald hci_emit_event(some_le_event, sizeof(some_le_event), 0); 204*4902524cSMatthias Ringwald // encypted but different con handle 205*4902524cSMatthias Ringwald hci_emit_connection_encrypted(ancs_con_handle+1, 1); 206*4902524cSMatthias Ringwald // encypted but different state 207*4902524cSMatthias Ringwald hci_emit_connection_encrypted(ancs_con_handle, 1); 208*4902524cSMatthias Ringwald // non-encypted 209*4902524cSMatthias Ringwald hci_emit_connection_encrypted(ancs_con_handle, 0); 210*4902524cSMatthias Ringwald // disconnected different handle 211*4902524cSMatthias Ringwald hci_emit_disconnection_complete(ancs_con_handle+1,0); 212*4902524cSMatthias Ringwald // disconnected different handle 213*4902524cSMatthias Ringwald hci_emit_disconnection_complete(ancs_con_handle,0); 214*4902524cSMatthias Ringwald } 215*4902524cSMatthias Ringwald 216*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, connect_no_service){ 217*4902524cSMatthias Ringwald connect(); 218*4902524cSMatthias Ringwald mock_gatt_client_run(); 219*4902524cSMatthias Ringwald } 220*4902524cSMatthias Ringwald 221*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, connect_unexpected_event_during_service_disc){ 222*4902524cSMatthias Ringwald connect(); 223*4902524cSMatthias Ringwald mock_gatt_client_emit_dummy_event(); 224*4902524cSMatthias Ringwald } 225*4902524cSMatthias Ringwald 226*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, connect_unexpected_events){ 227*4902524cSMatthias Ringwald setup_service(true, true); 228*4902524cSMatthias Ringwald connect(); 229*4902524cSMatthias Ringwald mock_gatt_client_run_once(); 230*4902524cSMatthias Ringwald mock_gatt_client_emit_dummy_event(); 231*4902524cSMatthias Ringwald mock_gatt_client_run_once(); 232*4902524cSMatthias Ringwald mock_gatt_client_emit_dummy_event(); 233*4902524cSMatthias Ringwald mock_gatt_client_run_once(); 234*4902524cSMatthias Ringwald mock_gatt_client_emit_dummy_event(); 235*4902524cSMatthias Ringwald mock_gatt_client_run_once(); 236*4902524cSMatthias Ringwald mock_gatt_client_emit_dummy_event(); 237*4902524cSMatthias Ringwald } 238*4902524cSMatthias Ringwald 239*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, connect){ 240*4902524cSMatthias Ringwald setup_service(true, true); 241*4902524cSMatthias Ringwald connect(); 242*4902524cSMatthias Ringwald mock_gatt_client_run(); 243*4902524cSMatthias Ringwald CHECK_TRUE(ancs_connected); 244*4902524cSMatthias Ringwald } 245*4902524cSMatthias Ringwald 246*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, connect_extra_characteristic){ 247*4902524cSMatthias Ringwald setup_service(true, true); 248*4902524cSMatthias Ringwald mock_gatt_client_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL, 0); 249*4902524cSMatthias Ringwald connect(); 250*4902524cSMatthias Ringwald mock_gatt_client_run(); 251*4902524cSMatthias Ringwald } 252*4902524cSMatthias Ringwald 253*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, disconnect){ 254*4902524cSMatthias Ringwald setup_service(true, true); 255*4902524cSMatthias Ringwald connect(); 256*4902524cSMatthias Ringwald mock_gatt_client_run(); 257*4902524cSMatthias Ringwald hci_emit_disconnection_complete(ancs_con_handle,0); 258*4902524cSMatthias Ringwald } 259*4902524cSMatthias Ringwald 260*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, notification_characteristic){ 261*4902524cSMatthias Ringwald setup_service(true, true); 262*4902524cSMatthias Ringwald connect(); 263*4902524cSMatthias Ringwald mock_gatt_client_run(); 264*4902524cSMatthias Ringwald const uint8_t data[] = {}; 265*4902524cSMatthias Ringwald mock_gatt_client_send_notification(ancs_notification_source_characteristic, data, sizeof(data)); 266*4902524cSMatthias Ringwald } 267*4902524cSMatthias Ringwald 268*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, data_source_characteristic){ 269*4902524cSMatthias Ringwald setup_service(true, true); 270*4902524cSMatthias Ringwald connect(); 271*4902524cSMatthias Ringwald mock_gatt_client_run(); 272*4902524cSMatthias Ringwald // simulate notification 273*4902524cSMatthias Ringwald const uint8_t notification_data[] = {0,0,0,0,0,0,0,0}; 274*4902524cSMatthias Ringwald mock_gatt_client_send_notification(ancs_notification_source_characteristic, notification_data, sizeof(notification_data)); 275*4902524cSMatthias Ringwald // command id = 0 / CommandIDGetNotificationAttributes 276*4902524cSMatthias Ringwald // notification uid 0x1111 277*4902524cSMatthias Ringwald // attribute id 1 278*4902524cSMatthias Ringwald // len 1 279*4902524cSMatthias Ringwald // attribute id 2 280*4902524cSMatthias Ringwald // len 0 281*4902524cSMatthias Ringwald const uint8_t data[] = { 0, 0,0,0,0, 1, 1, 0, 'a', 2, 0, 0}; 282*4902524cSMatthias Ringwald mock_gatt_client_send_notification(ancs_data_source_characteristic, data, sizeof(data)); 283*4902524cSMatthias Ringwald } 284*4902524cSMatthias Ringwald 285*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, data_source_characteristic_no_handler){ 286*4902524cSMatthias Ringwald ancs_client_register_callback(NULL); 287*4902524cSMatthias Ringwald setup_service(true, true); 288*4902524cSMatthias Ringwald connect(); 289*4902524cSMatthias Ringwald mock_gatt_client_run(); 290*4902524cSMatthias Ringwald // simulate notification 291*4902524cSMatthias Ringwald const uint8_t notification_data[] = {0,0,0,0,0,0,0,0}; 292*4902524cSMatthias Ringwald mock_gatt_client_send_notification(ancs_notification_source_characteristic, notification_data, sizeof(notification_data)); 293*4902524cSMatthias Ringwald // command id = 0 / CommandIDGetNotificationAttributes 294*4902524cSMatthias Ringwald // notification uid 0x1111 295*4902524cSMatthias Ringwald // attribute id 1 296*4902524cSMatthias Ringwald // len 1 297*4902524cSMatthias Ringwald // attribute id 2 298*4902524cSMatthias Ringwald // len 0 299*4902524cSMatthias Ringwald const uint8_t data[] = { 0, 0,0,0,0, 1, 1, 0, 'a', 2, 0, 0}; 300*4902524cSMatthias Ringwald mock_gatt_client_send_notification(ancs_data_source_characteristic, data, sizeof(data)); 301*4902524cSMatthias Ringwald } 302*4902524cSMatthias Ringwald 303*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, notifications_other){ 304*4902524cSMatthias Ringwald setup_service(true, true); 305*4902524cSMatthias Ringwald connect(); 306*4902524cSMatthias Ringwald mock_gatt_client_run(); 307*4902524cSMatthias Ringwald const uint8_t data[] = {}; 308*4902524cSMatthias Ringwald mock_gatt_client_send_notification_with_handle(ancs_notification_source_characteristic, 0x0001, data, sizeof(data)); 309*4902524cSMatthias Ringwald } 310*4902524cSMatthias Ringwald 311*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, indications_other){ 312*4902524cSMatthias Ringwald setup_service(true, true); 313*4902524cSMatthias Ringwald connect(); 314*4902524cSMatthias Ringwald mock_gatt_client_run(); 315*4902524cSMatthias Ringwald const uint8_t data[] = {}; 316*4902524cSMatthias Ringwald mock_gatt_client_send_indication_with_handle(ancs_notification_source_characteristic, 0x0001, data, sizeof(data)); 317*4902524cSMatthias Ringwald } 318*4902524cSMatthias Ringwald 319*4902524cSMatthias Ringwald TEST(ANCS_CLIENT, notifications_invalid_parser){ 320*4902524cSMatthias Ringwald setup_service(true, true); 321*4902524cSMatthias Ringwald ancs_client_set_invalid_parser_state(); 322*4902524cSMatthias Ringwald connect(); 323*4902524cSMatthias Ringwald mock_gatt_client_run(); 324*4902524cSMatthias Ringwald const uint8_t data[] = {1,2,3,4,5,6}; 325*4902524cSMatthias Ringwald mock_gatt_client_send_notification(ancs_data_source_characteristic, data, sizeof(data)); 326*4902524cSMatthias Ringwald } 327*4902524cSMatthias Ringwald 328*4902524cSMatthias Ringwald int main (int argc, const char * argv[]){ 329*4902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv); 330*4902524cSMatthias Ringwald } 331