14902524cSMatthias Ringwald
24902524cSMatthias Ringwald // *****************************************************************************
34902524cSMatthias Ringwald //
44902524cSMatthias Ringwald // test Battery Service Client
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 #include "CppUTestExt/MockSupport.h"
174902524cSMatthias Ringwald
184902524cSMatthias Ringwald #include "bluetooth.h"
194902524cSMatthias Ringwald #include "bluetooth_gatt.h"
204902524cSMatthias Ringwald #include "btstack_debug.h"
214902524cSMatthias Ringwald #include "btstack_event.h"
224902524cSMatthias Ringwald #include "btstack_memory.h"
234902524cSMatthias Ringwald #include "btstack_util.h"
244902524cSMatthias Ringwald #include "hci.h"
254902524cSMatthias Ringwald
264902524cSMatthias Ringwald #include "ble/gatt-service/battery_service_client.h"
274902524cSMatthias Ringwald #include "mock_gatt_client.h"
284902524cSMatthias Ringwald
294902524cSMatthias Ringwald static const hci_con_handle_t con_handle = 0x01;
304902524cSMatthias Ringwald static bool connected;
314902524cSMatthias Ringwald static uint8_t num_instances = 0;
324902524cSMatthias Ringwald // temp btstack run loop mock
334902524cSMatthias Ringwald
344902524cSMatthias Ringwald static btstack_timer_source_t * btstack_timer = NULL;
354902524cSMatthias Ringwald static uint8_t battery_level[10];
364902524cSMatthias Ringwald static uint16_t battery_level_size;
374902524cSMatthias Ringwald
btstack_run_lopo_deinit(void)384902524cSMatthias Ringwald void btstack_run_lopo_deinit(void){
394902524cSMatthias Ringwald btstack_timer = NULL;
404902524cSMatthias Ringwald }
414902524cSMatthias Ringwald
btstack_run_loop_add_timer(btstack_timer_source_t * timer)424902524cSMatthias Ringwald void btstack_run_loop_add_timer(btstack_timer_source_t * timer){
434902524cSMatthias Ringwald btstack_timer = timer;
444902524cSMatthias Ringwald }
454902524cSMatthias Ringwald
btstack_run_loop_remove_timer(btstack_timer_source_t * timer)464902524cSMatthias Ringwald int btstack_run_loop_remove_timer(btstack_timer_source_t * timer){
474902524cSMatthias Ringwald btstack_timer = NULL;
484902524cSMatthias Ringwald return 1;
494902524cSMatthias Ringwald }
504902524cSMatthias Ringwald
btstack_run_loop_set_timer(btstack_timer_source_t * timer,uint32_t timeout_in_ms)514902524cSMatthias Ringwald void btstack_run_loop_set_timer(btstack_timer_source_t * timer, uint32_t timeout_in_ms){
524902524cSMatthias Ringwald }
534902524cSMatthias Ringwald
btstack_run_loop_set_timer_handler(btstack_timer_source_t * timer,void (* process)(btstack_timer_source_t * _timer))544902524cSMatthias Ringwald void btstack_run_loop_set_timer_handler(btstack_timer_source_t * timer, void (*process)(btstack_timer_source_t * _timer)){
554902524cSMatthias Ringwald timer->process = process;
564902524cSMatthias Ringwald }
574902524cSMatthias Ringwald
btstack_run_loop_set_timer_context(btstack_timer_source_t * timer,void * context)584902524cSMatthias Ringwald void btstack_run_loop_set_timer_context(btstack_timer_source_t * timer, void * context){
594902524cSMatthias Ringwald timer->context = context;
604902524cSMatthias Ringwald }
614902524cSMatthias Ringwald
btstack_run_loop_get_timer_context(btstack_timer_source_t * timer)624902524cSMatthias Ringwald void * btstack_run_loop_get_timer_context(btstack_timer_source_t * timer){
634902524cSMatthias Ringwald return timer->context;
644902524cSMatthias Ringwald }
654902524cSMatthias Ringwald
mock_btstack_run_loop_trigger_timer(void)664902524cSMatthias Ringwald void mock_btstack_run_loop_trigger_timer(void){
674902524cSMatthias Ringwald btstack_assert(btstack_timer != NULL);
684902524cSMatthias Ringwald (*btstack_timer->process)(btstack_timer);
694902524cSMatthias Ringwald }
704902524cSMatthias Ringwald
714902524cSMatthias Ringwald // simulate btstack_memory_battery_service_client_get
724902524cSMatthias Ringwald
734902524cSMatthias Ringwald static bool mock_btstack_memory_battery_service_client_no_memory;
744902524cSMatthias Ringwald static battery_service_client_t * mock_btstack_memory_battery_service_client_last_alloc;
754902524cSMatthias Ringwald
btstack_memory_init(void)764902524cSMatthias Ringwald void btstack_memory_init(void){
774902524cSMatthias Ringwald mock_btstack_memory_battery_service_client_no_memory = false;
784902524cSMatthias Ringwald mock_btstack_memory_battery_service_client_last_alloc = NULL;
794902524cSMatthias Ringwald }
804902524cSMatthias Ringwald
mock_btstack_memory_battery_service_client_simulate_no_memory(void)814902524cSMatthias Ringwald void mock_btstack_memory_battery_service_client_simulate_no_memory(void){
824902524cSMatthias Ringwald mock_btstack_memory_battery_service_client_no_memory = true;
834902524cSMatthias Ringwald }
844902524cSMatthias Ringwald
mock_btstack_memory_battery_service_client_get_last_alloc(void)854902524cSMatthias Ringwald battery_service_client_t * mock_btstack_memory_battery_service_client_get_last_alloc(void){
864902524cSMatthias Ringwald btstack_assert(mock_btstack_memory_battery_service_client_last_alloc != NULL);
874902524cSMatthias Ringwald return mock_btstack_memory_battery_service_client_last_alloc;
884902524cSMatthias Ringwald }
894902524cSMatthias Ringwald
btstack_memory_battery_service_client_get(void)904902524cSMatthias Ringwald battery_service_client_t * btstack_memory_battery_service_client_get(void){
914902524cSMatthias Ringwald if (mock_btstack_memory_battery_service_client_no_memory){
924902524cSMatthias Ringwald return NULL;
934902524cSMatthias Ringwald }
944902524cSMatthias Ringwald mock_btstack_memory_battery_service_client_last_alloc = (battery_service_client_t *) malloc(sizeof(battery_service_client_t));
954902524cSMatthias Ringwald memset(mock_btstack_memory_battery_service_client_last_alloc, 0, sizeof(battery_service_client_t));
964902524cSMatthias Ringwald return mock_btstack_memory_battery_service_client_last_alloc;
974902524cSMatthias Ringwald }
984902524cSMatthias Ringwald
btstack_memory_battery_service_client_free(battery_service_client_t * battery_service_client)994902524cSMatthias Ringwald void btstack_memory_battery_service_client_free(battery_service_client_t *battery_service_client){
1004902524cSMatthias Ringwald free(battery_service_client);
1014902524cSMatthias Ringwald }
1024902524cSMatthias Ringwald
gatt_client_event_handler(uint8_t packet_type,uint16_t channel,uint8_t * packet,uint16_t size)1034902524cSMatthias Ringwald static void gatt_client_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){
1044902524cSMatthias Ringwald UNUSED(packet_type);
1054902524cSMatthias Ringwald UNUSED(channel);
1064902524cSMatthias Ringwald UNUSED(size);
1074902524cSMatthias Ringwald
1084902524cSMatthias Ringwald uint8_t status;
1094902524cSMatthias Ringwald uint8_t att_status;
1104902524cSMatthias Ringwald
1114902524cSMatthias Ringwald if (hci_event_packet_get_type(packet) != HCI_EVENT_GATTSERVICE_META){
1124902524cSMatthias Ringwald return;
1134902524cSMatthias Ringwald }
1144902524cSMatthias Ringwald
1154902524cSMatthias Ringwald switch (hci_event_gattservice_meta_get_subevent_code(packet)){
1164902524cSMatthias Ringwald case GATTSERVICE_SUBEVENT_BATTERY_SERVICE_CONNECTED:
1174902524cSMatthias Ringwald status = gattservice_subevent_battery_service_connected_get_status(packet);
1184902524cSMatthias Ringwald switch (status){
1194902524cSMatthias Ringwald case ERROR_CODE_SUCCESS:
1204902524cSMatthias Ringwald num_instances = gattservice_subevent_battery_service_connected_get_num_instances(packet);
1214902524cSMatthias Ringwald connected = true;
1224902524cSMatthias Ringwald break;
1234902524cSMatthias Ringwald default:
1244902524cSMatthias Ringwald connected = false;
1254902524cSMatthias Ringwald break;
1264902524cSMatthias Ringwald }
1274902524cSMatthias Ringwald break;
1284902524cSMatthias Ringwald
1294902524cSMatthias Ringwald case GATTSERVICE_SUBEVENT_BATTERY_SERVICE_LEVEL:
1304902524cSMatthias Ringwald att_status = gattservice_subevent_battery_service_level_get_att_status(packet);
1314902524cSMatthias Ringwald if (att_status != ATT_ERROR_SUCCESS){
1324902524cSMatthias Ringwald // printf("Battery level read failed, ATT Error 0x%02x\n", att_status);
1334902524cSMatthias Ringwald break;
1344902524cSMatthias Ringwald }
1354902524cSMatthias Ringwald // printf("Battery level 0x%02x\n", gattservice_subevent_battery_service_level_get_level(packet));
1364902524cSMatthias Ringwald CHECK_EQUAL(battery_level[0], gattservice_subevent_battery_service_level_get_level(packet));
137*3d138b90SMatthias Ringwald CHECK_EQUAL(0, gattservice_subevent_battery_service_level_get_service_index(packet));
1384902524cSMatthias Ringwald break;
1394902524cSMatthias Ringwald
1404902524cSMatthias Ringwald default:
1414902524cSMatthias Ringwald break;
1424902524cSMatthias Ringwald }
1434902524cSMatthias Ringwald }
1444902524cSMatthias Ringwald
TEST_GROUP(BATTERY_SERVICE_CLIENT)1454902524cSMatthias Ringwald TEST_GROUP(BATTERY_SERVICE_CLIENT){
1464902524cSMatthias Ringwald uint16_t battery_service_cid;
1474902524cSMatthias Ringwald uint32_t poll_interval_ms;
1484902524cSMatthias Ringwald mock_gatt_client_service_t * service;
1494902524cSMatthias Ringwald mock_gatt_client_characteristic_t * characteristic;
1504902524cSMatthias Ringwald mock_gatt_client_characteristic_descriptor_t * descriptor;
1514902524cSMatthias Ringwald
1524902524cSMatthias Ringwald uint8_t value_buffer[3];
1534902524cSMatthias Ringwald
1544902524cSMatthias Ringwald void setup(void){
1554902524cSMatthias Ringwald battery_service_cid = 1;
1564902524cSMatthias Ringwald connected = false;
1574902524cSMatthias Ringwald poll_interval_ms = 2000;
1584902524cSMatthias Ringwald
1594902524cSMatthias Ringwald uint16_t i;
1604902524cSMatthias Ringwald for (i = 0; i < sizeof(value_buffer); i++){
1614902524cSMatthias Ringwald value_buffer[i] = (i+1)*11;
1624902524cSMatthias Ringwald }
1634902524cSMatthias Ringwald
1644902524cSMatthias Ringwald btstack_memory_init();
1654902524cSMatthias Ringwald mock_gatt_client_reset();
1664902524cSMatthias Ringwald battery_service_client_init();
1674902524cSMatthias Ringwald }
1684902524cSMatthias Ringwald
1694902524cSMatthias Ringwald void set_battery_level_of_size(uint16_t value_length){
1704902524cSMatthias Ringwald battery_level_size = btstack_min(value_length, sizeof(battery_level));
1714902524cSMatthias Ringwald uint8_t i;
1724902524cSMatthias Ringwald for (i=0; i<battery_level_size; i++){
1734902524cSMatthias Ringwald battery_level[i] = i+1;
1744902524cSMatthias Ringwald }
1754902524cSMatthias Ringwald mock_gatt_client_set_characteristic_value(characteristic, battery_level, battery_level_size);
1764902524cSMatthias Ringwald }
1774902524cSMatthias Ringwald
1784902524cSMatthias Ringwald void setup_service(bool add_characteristics, bool add_descriptors){
1794902524cSMatthias Ringwald service = mock_gatt_client_add_primary_service_uuid16(ORG_BLUETOOTH_SERVICE_BATTERY_SERVICE);
1804902524cSMatthias Ringwald if (!add_characteristics) return;
1814902524cSMatthias Ringwald
1824902524cSMatthias Ringwald characteristic = mock_gatt_client_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL, ATT_PROPERTY_NOTIFY);
1834902524cSMatthias Ringwald
1844902524cSMatthias Ringwald if (!add_descriptors) return;
1854902524cSMatthias Ringwald descriptor = mock_gatt_client_add_characteristic_descriptor_uuid16(ORG_BLUETOOTH_DESCRIPTOR_GATT_CLIENT_CHARACTERISTIC_CONFIGURATION);
1864902524cSMatthias Ringwald mock_gatt_client_set_descriptor_characteristic_value(descriptor, value_buffer, sizeof(value_buffer));
1874902524cSMatthias Ringwald
1884902524cSMatthias Ringwald // mock_gatt_client_dump_services();
1894902524cSMatthias Ringwald }
1904902524cSMatthias Ringwald
1914902524cSMatthias Ringwald void setup_service_without_notify_capabality(bool add_characteristics, bool add_descriptors){
1924902524cSMatthias Ringwald service = mock_gatt_client_add_primary_service_uuid16(ORG_BLUETOOTH_SERVICE_BATTERY_SERVICE);
1934902524cSMatthias Ringwald if (!add_characteristics) return;
1944902524cSMatthias Ringwald
1954902524cSMatthias Ringwald characteristic = mock_gatt_client_add_characteristic_uuid16(ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL, ATT_PROPERTY_READ);
1964902524cSMatthias Ringwald
1974902524cSMatthias Ringwald if (!add_descriptors) return;
1984902524cSMatthias Ringwald descriptor = mock_gatt_client_add_characteristic_descriptor_uuid16(ORG_BLUETOOTH_DESCRIPTOR_GATT_CLIENT_CHARACTERISTIC_CONFIGURATION);
1994902524cSMatthias Ringwald mock_gatt_client_set_descriptor_characteristic_value(descriptor, value_buffer, sizeof(value_buffer));
2004902524cSMatthias Ringwald
2014902524cSMatthias Ringwald // mock_gatt_client_dump_services();
2024902524cSMatthias Ringwald }
2034902524cSMatthias Ringwald
2044902524cSMatthias Ringwald void connect(void){
2054902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, &battery_service_cid);
2064902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
2074902524cSMatthias Ringwald mock_gatt_client_run();
2084902524cSMatthias Ringwald }
2094902524cSMatthias Ringwald
2104902524cSMatthias Ringwald void teardown(void){
2114902524cSMatthias Ringwald battery_service_client_deinit();
2124902524cSMatthias Ringwald }
2134902524cSMatthias Ringwald };
2144902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,unhandled_gatt_event)2154902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, unhandled_gatt_event){
2164902524cSMatthias Ringwald mock_gatt_client_emit_dummy_event();
2174902524cSMatthias Ringwald }
2184902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,gatt_event_in_wrong_state)2194902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, gatt_event_in_wrong_state){
2204902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, NULL);
2214902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
2224902524cSMatthias Ringwald // mock_gatt_client_run_once();
2234902524cSMatthias Ringwald // mock_gatt_client_emit_complete(ERROR_CODE_SUCCESS);
2244902524cSMatthias Ringwald }
2254902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_no_memory)2264902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_no_memory){
2274902524cSMatthias Ringwald mock_btstack_memory_battery_service_client_simulate_no_memory();
2284902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, NULL);
2294902524cSMatthias Ringwald CHECK_EQUAL(BTSTACK_MEMORY_ALLOC_FAILED, status);
2304902524cSMatthias Ringwald }
2314902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_no_cid)2324902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_no_cid){
2334902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, NULL);
2344902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
2354902524cSMatthias Ringwald
2364902524cSMatthias Ringwald mock_gatt_client_run();
2374902524cSMatthias Ringwald CHECK_EQUAL(false, connected);
2384902524cSMatthias Ringwald }
2394902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_no_service)2404902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_no_service){
2414902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, &battery_service_cid);
2424902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
2434902524cSMatthias Ringwald
2444902524cSMatthias Ringwald mock_gatt_client_run();
2454902524cSMatthias Ringwald CHECK_EQUAL(false, connected);
2464902524cSMatthias Ringwald }
2474902524cSMatthias Ringwald
2484902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_with_service_no_chr_no_desc)2494902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_with_service_no_chr_no_desc){
2504902524cSMatthias Ringwald setup_service(false, false);
2514902524cSMatthias Ringwald connect();
2524902524cSMatthias Ringwald CHECK_EQUAL(false, connected);
2534902524cSMatthias Ringwald }
2544902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_with_service_and_chr_no_desc)2554902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_with_service_and_chr_no_desc){
2564902524cSMatthias Ringwald setup_service(true, false);
2574902524cSMatthias Ringwald connect();
2584902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
2594902524cSMatthias Ringwald }
2604902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_with_service_and_chr_and_desc)2614902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_with_service_and_chr_and_desc){
2624902524cSMatthias Ringwald setup_service(true, true);
2634902524cSMatthias Ringwald connect();
2644902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
2654902524cSMatthias Ringwald }
2664902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_with_one_invalid_and_one_valid_service)2674902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_with_one_invalid_and_one_valid_service){
2684902524cSMatthias Ringwald setup_service(false, false);
2694902524cSMatthias Ringwald setup_service(true, true);
2704902524cSMatthias Ringwald connect();
2714902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
2724902524cSMatthias Ringwald }
2734902524cSMatthias Ringwald
2744902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,double_connect)2754902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, double_connect){
2764902524cSMatthias Ringwald setup_service(true, true);
2774902524cSMatthias Ringwald connect();
2784902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
2794902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, &battery_service_cid);
2804902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_COMMAND_DISALLOWED, status);
2814902524cSMatthias Ringwald }
2824902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_discover_primary_service_error)2834902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_discover_primary_service_error){
2844902524cSMatthias Ringwald mock_gatt_client_set_att_error_discover_primary_services();
2854902524cSMatthias Ringwald setup_service(true, true);
2864902524cSMatthias Ringwald connect();
2874902524cSMatthias Ringwald CHECK_EQUAL(false, connected);
2884902524cSMatthias Ringwald }
2894902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_discover_characteristics_error)2904902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_discover_characteristics_error){
2914902524cSMatthias Ringwald mock_gatt_client_set_att_error_discover_characteristics();
2924902524cSMatthias Ringwald setup_service(true, true);
2934902524cSMatthias Ringwald connect();
2944902524cSMatthias Ringwald CHECK_EQUAL(false, connected);
2954902524cSMatthias Ringwald }
2964902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_discover_characteristic_descriptors_error)2974902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_discover_characteristic_descriptors_error){
2984902524cSMatthias Ringwald mock_gatt_client_set_att_error_discover_characteristic_descriptors();
2994902524cSMatthias Ringwald setup_service(true, true);
3004902524cSMatthias Ringwald connect();
3014902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3024902524cSMatthias Ringwald }
3034902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,connect_ignore_too_many_service)3044902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, connect_ignore_too_many_service){
3054902524cSMatthias Ringwald uint8_t i;
3064902524cSMatthias Ringwald for (i = 0; i < MAX_NUM_BATTERY_SERVICES + 2; i++){
3074902524cSMatthias Ringwald setup_service(true, true);
3084902524cSMatthias Ringwald }
3094902524cSMatthias Ringwald setup_service(true, true);
3104902524cSMatthias Ringwald connect();
3114902524cSMatthias Ringwald
3124902524cSMatthias Ringwald CHECK_EQUAL(num_instances, MAX_NUM_BATTERY_SERVICES);
3134902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3144902524cSMatthias Ringwald }
3154902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,disconnect_not_connected)3164902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, disconnect_not_connected){
3174902524cSMatthias Ringwald uint8_t status;
3184902524cSMatthias Ringwald
3194902524cSMatthias Ringwald status = battery_service_client_disconnect(battery_service_cid);
3204902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
3214902524cSMatthias Ringwald }
3224902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,double_disconnect)3234902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, double_disconnect){
3244902524cSMatthias Ringwald uint8_t status;
3254902524cSMatthias Ringwald
3264902524cSMatthias Ringwald setup_service(true, true);
3274902524cSMatthias Ringwald connect();
3284902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3294902524cSMatthias Ringwald
3304902524cSMatthias Ringwald status = battery_service_client_disconnect(battery_service_cid);
3314902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
3324902524cSMatthias Ringwald
3334902524cSMatthias Ringwald status = battery_service_client_disconnect(battery_service_cid);
3344902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
3354902524cSMatthias Ringwald }
3364902524cSMatthias Ringwald
3374902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,notify_battery_value_invalid_0)3384902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, notify_battery_value_invalid_0){
3394902524cSMatthias Ringwald setup_service(true, true);
3404902524cSMatthias Ringwald connect();
3414902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3424902524cSMatthias Ringwald
3434902524cSMatthias Ringwald set_battery_level_of_size(0);
3444902524cSMatthias Ringwald mock_gatt_client_send_notification(characteristic, battery_level, battery_level_size);
3454902524cSMatthias Ringwald // TODO: check battery level was not received
3464902524cSMatthias Ringwald }
3474902524cSMatthias Ringwald
3484902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,notify_battery_value_invalid_5)3494902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, notify_battery_value_invalid_5){
3504902524cSMatthias Ringwald setup_service(true, true);
3514902524cSMatthias Ringwald connect();
3524902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3534902524cSMatthias Ringwald
3544902524cSMatthias Ringwald set_battery_level_of_size(5);
3554902524cSMatthias Ringwald mock_gatt_client_send_notification(characteristic, battery_level, battery_level_size);
3564902524cSMatthias Ringwald // TODO: check battery level was not received
3574902524cSMatthias Ringwald }
3584902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,notify_battery_value_wrong_handle)3594902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, notify_battery_value_wrong_handle){
3604902524cSMatthias Ringwald setup_service(true, true);
3614902524cSMatthias Ringwald connect();
3624902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3634902524cSMatthias Ringwald
3644902524cSMatthias Ringwald set_battery_level_of_size(1);
3654902524cSMatthias Ringwald mock_gatt_client_send_notification_with_handle(characteristic, 0x1234, battery_level, battery_level_size);
3664902524cSMatthias Ringwald // TODO: check battery level was not received
3674902524cSMatthias Ringwald }
3684902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,notify_battery_value_wrong_handle_multiple)3694902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, notify_battery_value_wrong_handle_multiple){
3704902524cSMatthias Ringwald setup_service(true, true);
3714902524cSMatthias Ringwald setup_service(true, true);
3724902524cSMatthias Ringwald connect();
3734902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3744902524cSMatthias Ringwald
3754902524cSMatthias Ringwald set_battery_level_of_size(1);
3764902524cSMatthias Ringwald mock_gatt_client_send_notification_with_handle(characteristic, 0x1234, battery_level, battery_level_size);
3774902524cSMatthias Ringwald // TODO: check battery level was not received
3784902524cSMatthias Ringwald }
3794902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,notify_battery_value_valid)3804902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, notify_battery_value_valid){
3814902524cSMatthias Ringwald setup_service(true, true);
3824902524cSMatthias Ringwald connect();
3834902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
3844902524cSMatthias Ringwald
3854902524cSMatthias Ringwald set_battery_level_of_size(1);
3864902524cSMatthias Ringwald mock_gatt_client_send_notification(characteristic, battery_level, battery_level_size);
3874902524cSMatthias Ringwald // TODO: check battery level was received
3884902524cSMatthias Ringwald }
3894902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,multiple_connection)3904902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, multiple_connection){
3914902524cSMatthias Ringwald battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, &battery_service_cid);
3924902524cSMatthias Ringwald battery_service_client_connect(con_handle+1, &gatt_client_event_handler, poll_interval_ms, &battery_service_cid);
3934902524cSMatthias Ringwald battery_service_client_read_battery_level(10, 0);
3944902524cSMatthias Ringwald }
3954902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,read_battery_level_wrong_cid)3964902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, read_battery_level_wrong_cid){
3974902524cSMatthias Ringwald uint8_t status = battery_service_client_read_battery_level(10, 0);
3984902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
3994902524cSMatthias Ringwald }
4004902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,read_battery_level_wrong_state)4014902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, read_battery_level_wrong_state){
4024902524cSMatthias Ringwald // without calling mock_gatt_client_run(), state remains in BATTERY_SERVICE_CLIENT_STATE_W2_QUERY_SERVICE
4034902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, poll_interval_ms, &battery_service_cid);
4044902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
4054902524cSMatthias Ringwald CHECK_EQUAL(false, connected);
4064902524cSMatthias Ringwald
4074902524cSMatthias Ringwald status = battery_service_client_read_battery_level(battery_service_cid, 0);
4084902524cSMatthias Ringwald CHECK_EQUAL(GATT_CLIENT_IN_WRONG_STATE, status);
4094902524cSMatthias Ringwald }
4104902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,read_battery_level_wrong_state_in_packet_handler)4114902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, read_battery_level_wrong_state_in_packet_handler){
4124902524cSMatthias Ringwald setup_service(true, true);
4134902524cSMatthias Ringwald connect();
4144902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4154902524cSMatthias Ringwald mock_btstack_memory_battery_service_client_get_last_alloc()->state = BATTERY_SERVICE_CLIENT_STATE_IDLE;
4164902524cSMatthias Ringwald mock_gatt_client_emit_complete(ERROR_CODE_SUCCESS);
4174902524cSMatthias Ringwald }
4184902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,read_battery_level_wrong_service_index)4194902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, read_battery_level_wrong_service_index){
4204902524cSMatthias Ringwald setup_service(true, true);
4214902524cSMatthias Ringwald connect();
4224902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4234902524cSMatthias Ringwald
4244902524cSMatthias Ringwald uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 10);
4254902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE, status);
4264902524cSMatthias Ringwald }
4274902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,poll_battery_value_invalid)4284902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_invalid){
4294902524cSMatthias Ringwald setup_service(true, true);
4304902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
4314902524cSMatthias Ringwald set_battery_level_of_size(5);
4324902524cSMatthias Ringwald
4334902524cSMatthias Ringwald
4344902524cSMatthias Ringwald connect();
4354902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4364902524cSMatthias Ringwald
4374902524cSMatthias Ringwald uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 0);
4384902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
4394902524cSMatthias Ringwald }
4404902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,poll_battery_value)4414902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, poll_battery_value){
4424902524cSMatthias Ringwald setup_service(true, true);
4434902524cSMatthias Ringwald set_battery_level_of_size(1);
4444902524cSMatthias Ringwald
4454902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
4464902524cSMatthias Ringwald
4474902524cSMatthias Ringwald connect();
4484902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4494902524cSMatthias Ringwald
4504902524cSMatthias Ringwald uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 0);
4514902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
4524902524cSMatthias Ringwald }
4534902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,poll_battery_value_with_error)4544902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_with_error){
4554902524cSMatthias Ringwald setup_service(true, true);
4564902524cSMatthias Ringwald set_battery_level_of_size(1);
4574902524cSMatthias Ringwald
4584902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
4594902524cSMatthias Ringwald
4604902524cSMatthias Ringwald connect();
4614902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4624902524cSMatthias Ringwald
4634902524cSMatthias Ringwald uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 0);
4644902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
4654902524cSMatthias Ringwald mock_gatt_client_emit_complete(1);
4664902524cSMatthias Ringwald }
4674902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,poll_battery_value_zero_poll_interval)4684902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_zero_poll_interval){
4694902524cSMatthias Ringwald setup_service(true, true);
4704902524cSMatthias Ringwald set_battery_level_of_size(1);
4714902524cSMatthias Ringwald
4724902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
4734902524cSMatthias Ringwald
4744902524cSMatthias Ringwald uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, 0, &battery_service_cid);
4754902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
4764902524cSMatthias Ringwald mock_gatt_client_run();
4774902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4784902524cSMatthias Ringwald
4794902524cSMatthias Ringwald status = battery_service_client_read_battery_level(battery_service_cid, 0);
4804902524cSMatthias Ringwald CHECK_EQUAL(ERROR_CODE_SUCCESS, status);
4814902524cSMatthias Ringwald }
4824902524cSMatthias Ringwald
4834902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,poll_battery_value_trigger_timer)4844902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_trigger_timer){
4854902524cSMatthias Ringwald setup_service(true, true);
4864902524cSMatthias Ringwald set_battery_level_of_size(1);
4874902524cSMatthias Ringwald
4884902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
4894902524cSMatthias Ringwald
4904902524cSMatthias Ringwald connect();
4914902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
4924902524cSMatthias Ringwald mock_btstack_run_loop_trigger_timer();
4934902524cSMatthias Ringwald mock_gatt_client_run();
4944902524cSMatthias Ringwald }
4954902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,poll_battery_value_trigger_timer_unxpected_complete)4964902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_trigger_timer_unxpected_complete){
4974902524cSMatthias Ringwald setup_service(true, true);
4984902524cSMatthias Ringwald set_battery_level_of_size(1);
4994902524cSMatthias Ringwald
5004902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
5014902524cSMatthias Ringwald
5024902524cSMatthias Ringwald connect();
5034902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
5044902524cSMatthias Ringwald mock_btstack_run_loop_trigger_timer();
5054902524cSMatthias Ringwald mock_gatt_client_run();
5064902524cSMatthias Ringwald
5074902524cSMatthias Ringwald // polling done, emit another complete event
5084902524cSMatthias Ringwald mock_gatt_client_emit_complete(0);
5094902524cSMatthias Ringwald }
5104902524cSMatthias Ringwald
5114902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,mixed_poll_and_notify_battery_value)5124902524cSMatthias Ringwald TEST(BATTERY_SERVICE_CLIENT, mixed_poll_and_notify_battery_value){
5134902524cSMatthias Ringwald setup_service(true, true);
5144902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, true);
5154902524cSMatthias Ringwald
5164902524cSMatthias Ringwald setup_service(true, true);
5174902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, false);
5184902524cSMatthias Ringwald
5194902524cSMatthias Ringwald setup_service(true, true);
5204902524cSMatthias Ringwald mock_gatt_client_enable_notification(characteristic, true);
5214902524cSMatthias Ringwald
5224902524cSMatthias Ringwald connect();
5234902524cSMatthias Ringwald CHECK_EQUAL(true, connected);
5244902524cSMatthias Ringwald }
5254902524cSMatthias Ringwald
TEST(BATTERY_SERVICE_CLIENT,hci_disconnect_event)5268182555fSMilanka Ringwald TEST(BATTERY_SERVICE_CLIENT, hci_disconnect_event){
527500d8180SMilanka Ringwald setup_service(true, true);
528500d8180SMilanka Ringwald connect();
529500d8180SMilanka Ringwald CHECK_EQUAL(true, connected);
530500d8180SMilanka Ringwald
531500d8180SMilanka Ringwald mock_hci_emit_disconnection_complete(con_handle, 0);
5328182555fSMilanka Ringwald uint8_t status = battery_service_client_disconnect(battery_service_cid);
533500d8180SMilanka Ringwald CHECK_EQUAL(ERROR_CODE_UNKNOWN_CONNECTION_IDENTIFIER, status);
534500d8180SMilanka Ringwald
535500d8180SMilanka Ringwald mock_hci_emit_disconnection_complete(HCI_CON_HANDLE_INVALID, 0);
536500d8180SMilanka Ringwald }
537500d8180SMilanka Ringwald
TEST(BATTERY_SERVICE_CLIENT,ignored_events)5388182555fSMilanka Ringwald TEST(BATTERY_SERVICE_CLIENT, ignored_events){
5398182555fSMilanka Ringwald setup_service(true, true);
5408182555fSMilanka Ringwald connect();
5418182555fSMilanka Ringwald CHECK_EQUAL(true, connected);
5428182555fSMilanka Ringwald
5438182555fSMilanka Ringwald // unexpected event
5448182555fSMilanka Ringwald mock_hci_emit_connection_encrypted(con_handle, 0);
5458182555fSMilanka Ringwald // event with wrong con handle
5468182555fSMilanka Ringwald mock_hci_emit_disconnection_complete(HCI_CON_HANDLE_INVALID, 0);
5478182555fSMilanka Ringwald }
548500d8180SMilanka Ringwald
main(int argc,const char * argv[])5494902524cSMatthias Ringwald int main (int argc, const char * argv[]){
5504902524cSMatthias Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
5514902524cSMatthias Ringwald }
552