From f8374102765d25f19be073c59653b49c57201d32 Mon Sep 17 00:00:00 2001 From: Milanka Ringwald Date: Thu, 10 Jun 2021 15:45:59 +0200 Subject: [PATCH] test/gatt-service-client: more tests --- test/gatt-service-client/Makefile | 2 - .../battery_service_client_test.c | 295 ++++++++++++++++-- 2 files changed, 269 insertions(+), 28 deletions(-) diff --git a/test/gatt-service-client/Makefile b/test/gatt-service-client/Makefile index 56e5460be..17e73f0f5 100644 --- a/test/gatt-service-client/Makefile +++ b/test/gatt-service-client/Makefile @@ -20,8 +20,6 @@ VPATH += ${BTSTACK_ROOT}/test/mock COMMON = \ btstack_linked_list.c \ - btstack_memory.c \ - btstack_memory_pool.c \ btstack_util.c \ hci_dump.c \ mock_gatt_client.c \ diff --git a/test/gatt-service-client/battery_service_client_test.c b/test/gatt-service-client/battery_service_client_test.c index 6b61d6a7c..400b37c54 100644 --- a/test/gatt-service-client/battery_service_client_test.c +++ b/test/gatt-service-client/battery_service_client_test.c @@ -15,11 +15,13 @@ #include "CppUTest/CommandLineTestRunner.h" #include "CppUTestExt/MockSupport.h" -#include "hci.h" -#include "btstack_util.h" #include "bluetooth.h" #include "bluetooth_gatt.h" +#include "btstack_debug.h" #include "btstack_event.h" +#include "btstack_memory.h" +#include "btstack_util.h" +#include "hci.h" #include "ble/gatt-service/battery_service_client.h" #include "mock_gatt_client.h" @@ -30,6 +32,8 @@ static uint8_t num_instances = 0; // temp btstack run loop mock static btstack_timer_source_t * btstack_timer = NULL; +static uint8_t battery_level[10]; +static uint16_t battery_level_size; void btstack_run_lopo_deinit(void){ btstack_timer = NULL; @@ -39,10 +43,6 @@ void btstack_run_loop_add_timer(btstack_timer_source_t * timer){ btstack_timer = timer; } -void * btstack_run_loop_get_timer_context(btstack_timer_source_t * timer){ - return btstack_timer; -} - int btstack_run_loop_remove_timer(btstack_timer_source_t * timer){ btstack_timer = NULL; return 1; @@ -51,14 +51,55 @@ int btstack_run_loop_remove_timer(btstack_timer_source_t * timer){ void btstack_run_loop_set_timer(btstack_timer_source_t * timer, uint32_t timeout_in_ms){ } -void btstack_run_loop_set_timer_context(btstack_timer_source_t * timer, void * context){ +void btstack_run_loop_set_timer_handler(btstack_timer_source_t * timer, void (*process)(btstack_timer_source_t * _timer)){ + timer->process = process; } -void btstack_run_loop_set_timer_handler(btstack_timer_source_t * timer, void (*process)(btstack_timer_source_t * _timer)){ +void btstack_run_loop_set_timer_context(btstack_timer_source_t * timer, void * context){ + timer->context = context; +} + +void * btstack_run_loop_get_timer_context(btstack_timer_source_t * timer){ + return timer->context; +} + +void mock_btstack_run_loop_trigger_timer(void){ + btstack_assert(btstack_timer != NULL); + (*btstack_timer->process)(btstack_timer); } // simulate btstack_memory_battery_service_client_get +static bool mock_btstack_memory_battery_service_client_no_memory; +static battery_service_client_t * mock_btstack_memory_battery_service_client_last_alloc; + +void btstack_memory_init(void){ + mock_btstack_memory_battery_service_client_no_memory = false; + mock_btstack_memory_battery_service_client_last_alloc = NULL; +} + +void mock_btstack_memory_battery_service_client_simulate_no_memory(void){ + mock_btstack_memory_battery_service_client_no_memory = true; +} + +battery_service_client_t * mock_btstack_memory_battery_service_client_get_last_alloc(void){ + btstack_assert(mock_btstack_memory_battery_service_client_last_alloc != NULL); + return mock_btstack_memory_battery_service_client_last_alloc; +} + +battery_service_client_t * btstack_memory_battery_service_client_get(void){ + if (mock_btstack_memory_battery_service_client_no_memory){ + return NULL; + } + mock_btstack_memory_battery_service_client_last_alloc = (battery_service_client_t *) malloc(sizeof(battery_service_client_t)); + memset(mock_btstack_memory_battery_service_client_last_alloc, 0, sizeof(battery_service_client_t)); + return mock_btstack_memory_battery_service_client_last_alloc; +} + +void btstack_memory_battery_service_client_free(battery_service_client_t *battery_service_client){ + free(battery_service_client); +} + static void gatt_client_event_handler(uint8_t packet_type, uint16_t channel, uint8_t *packet, uint16_t size){ UNUSED(packet_type); UNUSED(channel); @@ -76,15 +117,11 @@ static void gatt_client_event_handler(uint8_t packet_type, uint16_t channel, uin status = gattservice_subevent_battery_service_connected_get_status(packet); switch (status){ case ERROR_CODE_SUCCESS: - printf("Battery service client connected, found %d services, poll bitmap 0x%02x\n", - gattservice_subevent_battery_service_connected_get_num_instances(packet), - gattservice_subevent_battery_service_connected_get_poll_bitmap(packet)); - num_instances = gattservice_subevent_battery_service_connected_get_num_instances(packet); connected = true; break; default: - printf("Battery service client connection failed, err 0x%02x.\n", status); + connected = false; break; } break; @@ -93,12 +130,12 @@ static void gatt_client_event_handler(uint8_t packet_type, uint16_t channel, uin att_status = gattservice_subevent_battery_service_level_get_att_status(packet); if (att_status != ATT_ERROR_SUCCESS){ printf("Battery level read failed, ATT Error 0x%02x\n", att_status); - } else { - printf("Service index: %d, Battery level: %d\n", - gattservice_subevent_battery_service_level_get_sevice_index(packet), - gattservice_subevent_battery_service_level_get_level(packet)); - - } + break; + } + + printf("Battery level 0x%02x\n", gattservice_subevent_battery_service_level_get_level(packet)); + CHECK_EQUAL(battery_level[0], gattservice_subevent_battery_service_level_get_level(packet)); + CHECK_EQUAL(0, gattservice_subevent_battery_service_level_get_sevice_index(packet)); break; default: @@ -122,13 +159,23 @@ TEST_GROUP(BATTERY_SERVICE_CLIENT){ uint16_t i; for (i = 0; i < sizeof(value_buffer); i++){ - value_buffer[i] = (i+1)*10 + i + 1; + value_buffer[i] = (i+1)*11; } + btstack_memory_init(); mock_gatt_client_reset(); battery_service_client_init(); } + void set_battery_level_of_size(uint16_t value_length){ + battery_level_size = btstack_min(value_length, sizeof(battery_level)); + uint8_t i; + for (i=0; istate = BATTERY_SERVICE_CLIENT_STATE_IDLE; + mock_gatt_client_emit_complete(ERROR_CODE_SUCCESS); +} + TEST(BATTERY_SERVICE_CLIENT, read_battery_level_wrong_service_index){ setup_service(true, true); connect(); @@ -278,15 +433,103 @@ TEST(BATTERY_SERVICE_CLIENT, read_battery_level_wrong_service_index){ CHECK_EQUAL(ERROR_CODE_UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE, status); } -TEST(BATTERY_SERVICE_CLIENT, read_battery_level){ +TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_invalid){ setup_service(true, true); + mock_gatt_client_enable_notification(characteristic, false); + set_battery_level_of_size(5); + + connect(); CHECK_EQUAL(true, connected); - + uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 0); CHECK_EQUAL(ERROR_CODE_SUCCESS, status); } +TEST(BATTERY_SERVICE_CLIENT, poll_battery_value){ + setup_service(true, true); + set_battery_level_of_size(1); + + mock_gatt_client_enable_notification(characteristic, false); + + connect(); + CHECK_EQUAL(true, connected); + + uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 0); + CHECK_EQUAL(ERROR_CODE_SUCCESS, status); +} + +TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_with_error){ + setup_service(true, true); + set_battery_level_of_size(1); + + mock_gatt_client_enable_notification(characteristic, false); + + connect(); + CHECK_EQUAL(true, connected); + + uint8_t status = battery_service_client_read_battery_level(battery_service_cid, 0); + CHECK_EQUAL(ERROR_CODE_SUCCESS, status); + mock_gatt_client_emit_complete(1); +} + +TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_zero_poll_interval){ + setup_service(true, true); + set_battery_level_of_size(1); + + mock_gatt_client_enable_notification(characteristic, false); + + uint8_t status = battery_service_client_connect(con_handle, &gatt_client_event_handler, 0, &battery_service_cid); + CHECK_EQUAL(ERROR_CODE_SUCCESS, status); + mock_gatt_client_run(); + CHECK_EQUAL(true, connected); + + status = battery_service_client_read_battery_level(battery_service_cid, 0); + CHECK_EQUAL(ERROR_CODE_SUCCESS, status); +} + + +TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_trigger_timer){ + setup_service(true, true); + set_battery_level_of_size(1); + + mock_gatt_client_enable_notification(characteristic, false); + + connect(); + CHECK_EQUAL(true, connected); + mock_btstack_run_loop_trigger_timer(); + mock_gatt_client_run(); +} + +TEST(BATTERY_SERVICE_CLIENT, poll_battery_value_trigger_timer_unxpected_complete){ + setup_service(true, true); + set_battery_level_of_size(1); + + mock_gatt_client_enable_notification(characteristic, false); + + connect(); + CHECK_EQUAL(true, connected); + mock_btstack_run_loop_trigger_timer(); + mock_gatt_client_run(); + + // polling done, emit another complete event + mock_gatt_client_emit_complete(0); +} + + +TEST(BATTERY_SERVICE_CLIENT, mixed_poll_and_notify_battery_value){ + setup_service(true, true); + mock_gatt_client_enable_notification(characteristic, true); + + setup_service(true, true); + mock_gatt_client_enable_notification(characteristic, false); + + setup_service(true, true); + mock_gatt_client_enable_notification(characteristic, true); + + connect(); + CHECK_EQUAL(true, connected); +} int main (int argc, const char * argv[]){ return CommandLineTestRunner::RunAllTests(argc, argv);