176181014SMilanka Ringwald
276181014SMilanka Ringwald // *****************************************************************************
376181014SMilanka Ringwald //
476181014SMilanka Ringwald // test battery service
576181014SMilanka Ringwald //
676181014SMilanka Ringwald // *****************************************************************************
776181014SMilanka Ringwald
876181014SMilanka Ringwald
976181014SMilanka Ringwald #include <stdint.h>
1076181014SMilanka Ringwald #include <stdio.h>
1176181014SMilanka Ringwald #include <stdlib.h>
1276181014SMilanka Ringwald #include <string.h>
1376181014SMilanka Ringwald
1476181014SMilanka Ringwald #include "CppUTest/TestHarness.h"
1576181014SMilanka Ringwald #include "CppUTest/CommandLineTestRunner.h"
1676181014SMilanka Ringwald #include "CppUTestExt/MockSupport.h"
1776181014SMilanka Ringwald
1876181014SMilanka Ringwald #include "hci.h"
1976181014SMilanka Ringwald #include "btstack_util.h"
2076181014SMilanka Ringwald #include "bluetooth.h"
2176181014SMilanka Ringwald #include "bluetooth_gatt.h"
2276181014SMilanka Ringwald
2376181014SMilanka Ringwald #include "ble/gatt-service/battery_service_server.h"
2476181014SMilanka Ringwald #include "battery_service_server_test.h"
2576181014SMilanka Ringwald #include "mock_att_server.h"
2676181014SMilanka Ringwald
2776181014SMilanka Ringwald static uint8_t battery_level = 100;
2876181014SMilanka Ringwald
TEST_GROUP(BATTERY_SERVICE_SERVER)2976181014SMilanka Ringwald TEST_GROUP(BATTERY_SERVICE_SERVER){
3076181014SMilanka Ringwald att_service_handler_t * service;
3176181014SMilanka Ringwald uint16_t con_handle;
3276181014SMilanka Ringwald uint16_t battery_value_handle_value;
3376181014SMilanka Ringwald uint16_t battery_value_handle_client_configuration;
3476181014SMilanka Ringwald
3576181014SMilanka Ringwald void setup(void){
3676181014SMilanka Ringwald // setup database
3776181014SMilanka Ringwald att_set_db(profile_data);
3876181014SMilanka Ringwald battery_value_handle_value = gatt_server_get_value_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
3976181014SMilanka Ringwald battery_value_handle_client_configuration = gatt_server_get_client_configuration_handle_for_characteristic_with_uuid16(0, 0xffff, ORG_BLUETOOTH_CHARACTERISTIC_BATTERY_LEVEL);
4076181014SMilanka Ringwald
4176181014SMilanka Ringwald // setup battery service
4276181014SMilanka Ringwald battery_service_server_init(battery_level);
4376181014SMilanka Ringwald
4476181014SMilanka Ringwald service = mock_att_server_get_service();
4576181014SMilanka Ringwald con_handle = 0x00;
4676181014SMilanka Ringwald }
4776181014SMilanka Ringwald
4876181014SMilanka Ringwald void teardown(){
4976181014SMilanka Ringwald mock_deinit();
5076181014SMilanka Ringwald }
5176181014SMilanka Ringwald };
5276181014SMilanka Ringwald
TEST(BATTERY_SERVICE_SERVER,set_battery_value_trigger_can_send_now)5376181014SMilanka Ringwald TEST(BATTERY_SERVICE_SERVER, set_battery_value_trigger_can_send_now){
5476181014SMilanka Ringwald // enable notifications
5576181014SMilanka Ringwald const uint8_t enable_notify[]= { 0x1, 0x0 };
5676181014SMilanka Ringwald mock_att_service_write_callback(con_handle, battery_value_handle_client_configuration, ATT_TRANSACTION_MODE_NONE, 0, enable_notify, sizeof(enable_notify));
5776181014SMilanka Ringwald
5876181014SMilanka Ringwald // set battery to trigger notification
5976181014SMilanka Ringwald mock().expectOneCall("att_server_register_can_send_now_callback");
6076181014SMilanka Ringwald battery_service_server_set_battery_value(60);
6176181014SMilanka Ringwald mock().checkExpectations();
6276181014SMilanka Ringwald mock().expectOneCall("att_server_notify");
6376181014SMilanka Ringwald mock_att_service_trigger_can_send_now();
6476181014SMilanka Ringwald mock().checkExpectations();
6576181014SMilanka Ringwald }
6676181014SMilanka Ringwald
TEST(BATTERY_SERVICE_SERVER,lookup_attribute_handles)6776181014SMilanka Ringwald TEST(BATTERY_SERVICE_SERVER, lookup_attribute_handles){
6876181014SMilanka Ringwald CHECK(battery_value_handle_value != 0);
6976181014SMilanka Ringwald CHECK(battery_value_handle_client_configuration != 0);
7076181014SMilanka Ringwald }
7176181014SMilanka Ringwald
7276181014SMilanka Ringwald
TEST(BATTERY_SERVICE_SERVER,set_battery_value)7376181014SMilanka Ringwald TEST(BATTERY_SERVICE_SERVER, set_battery_value){
7476181014SMilanka Ringwald // battery_value_handle_client_configuration not set
7576181014SMilanka Ringwald mock().expectNCalls(con_handle, "att_server_register_can_send_now_callback");
7676181014SMilanka Ringwald battery_service_server_set_battery_value(60);
7776181014SMilanka Ringwald mock().checkExpectations();
7876181014SMilanka Ringwald
7976181014SMilanka Ringwald // battery_value_handle_client_configuration set
8076181014SMilanka Ringwald mock().expectOneCall("att_server_register_can_send_now_callback");
8176181014SMilanka Ringwald const uint8_t enable_notify[]= { 0x1, 0x0 };
8276181014SMilanka Ringwald mock_att_service_write_callback(con_handle, battery_value_handle_client_configuration, ATT_TRANSACTION_MODE_NONE, 0, enable_notify, sizeof(enable_notify));
8376181014SMilanka Ringwald battery_service_server_set_battery_value(60);
8476181014SMilanka Ringwald mock().checkExpectations();
8576181014SMilanka Ringwald }
8676181014SMilanka Ringwald
TEST(BATTERY_SERVICE_SERVER,set_wrong_handle_battery_value)8776181014SMilanka Ringwald TEST(BATTERY_SERVICE_SERVER, set_wrong_handle_battery_value){
8876181014SMilanka Ringwald // battery_value_handle_client_configuration not set
8976181014SMilanka Ringwald mock().expectNCalls(con_handle, "att_server_register_can_send_now_callback");
9076181014SMilanka Ringwald battery_service_server_set_battery_value(60);
9176181014SMilanka Ringwald mock().checkExpectations();
9276181014SMilanka Ringwald
93*db526b62SMilanka Ringwald // battery_value_handle_client_configuration set
9476181014SMilanka Ringwald const uint8_t enable_notify[]= { 0x1, 0x0 };
95*db526b62SMilanka Ringwald
96*db526b62SMilanka Ringwald mock().expectNoCall("att_server_register_can_send_now_callback");
9776181014SMilanka Ringwald mock_att_service_write_callback(con_handle, battery_value_handle_client_configuration + 10, ATT_TRANSACTION_MODE_NONE, 0, enable_notify, sizeof(enable_notify));
9876181014SMilanka Ringwald battery_service_server_set_battery_value(60);
9976181014SMilanka Ringwald mock().checkExpectations();
100*db526b62SMilanka Ringwald
101*db526b62SMilanka Ringwald mock().expectNoCall("att_server_register_can_send_now_callback");
102*db526b62SMilanka Ringwald mock_att_service_write_callback(con_handle, battery_value_handle_client_configuration + 10, ATT_TRANSACTION_MODE_VALIDATE, 0, enable_notify, sizeof(enable_notify));
103*db526b62SMilanka Ringwald battery_service_server_set_battery_value(60);
104*db526b62SMilanka Ringwald mock().checkExpectations();
10576181014SMilanka Ringwald }
10676181014SMilanka Ringwald
10776181014SMilanka Ringwald
108*db526b62SMilanka Ringwald
TEST(BATTERY_SERVICE_SERVER,read_battery_value)10976181014SMilanka Ringwald TEST(BATTERY_SERVICE_SERVER, read_battery_value){
11076181014SMilanka Ringwald uint8_t response[2];
11176181014SMilanka Ringwald uint16_t response_len;
11276181014SMilanka Ringwald
11376181014SMilanka Ringwald // invalid attribute handle
11476181014SMilanka Ringwald response_len = mock_att_service_read_callback(con_handle, 0xffff, 0xffff, response, sizeof(response));
11576181014SMilanka Ringwald CHECK_EQUAL(0, response_len);
11676181014SMilanka Ringwald
11776181014SMilanka Ringwald response_len = mock_att_service_read_callback(con_handle, battery_value_handle_value, 0, response, sizeof(response));
11876181014SMilanka Ringwald CHECK_EQUAL(1, response_len);
11976181014SMilanka Ringwald
12076181014SMilanka Ringwald response_len = mock_att_service_read_callback(con_handle, battery_value_handle_client_configuration, 0, response, sizeof(response));
12176181014SMilanka Ringwald CHECK_EQUAL(2, response_len);
12276181014SMilanka Ringwald }
12376181014SMilanka Ringwald
12476181014SMilanka Ringwald
main(int argc,const char * argv[])12576181014SMilanka Ringwald int main (int argc, const char * argv[]){
12676181014SMilanka Ringwald return CommandLineTestRunner::RunAllTests(argc, argv);
12776181014SMilanka Ringwald }
128