xref: /btstack/test/gatt-service-client/ancs_client_test.cpp (revision 4902524cc6a45a01cfead054f48b6584dbb1f1cc)
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