blob: 47176645ffa4fa33bc59c953498fab97a0b14f3e [file]
/******************************************************************************
*
* Copyright (C) 2022 Google, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
#include "device/include/device_iot_config.h"
#include <com_android_bluetooth_flags.h>
#include <flag_macros.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include <sys/mman.h>
#include "btcore/include/module.h"
#include "btif/include/btif_common.h"
#include "device/src/device_iot_config_int.h"
#include "test/common/mock_functions.h"
#include "test/mock/mock_osi_alarm.h"
#include "test/mock/mock_osi_allocator.h"
#include "test/mock/mock_osi_config.h"
#include "test/mock/mock_osi_future.h"
#include "test/mock/mock_osi_properties.h"
#define TEST_BT com::android::bluetooth::flags
using namespace bluetooth;
using namespace testing;
extern module_t device_iot_config_module;
bt_status_t btif_transfer_context(tBTIF_CBACK* p_cback, uint16_t event,
char* p_params, int param_len,
tBTIF_COPY_CBACK* p_copy_cback) {
inc_func_call_count(__func__);
return BT_STATUS_SUCCESS;
}
struct alarm_t {
alarm_t(const char* name){};
int any_value;
};
struct future_t {
future_t(void* value){};
void* value;
};
struct alarm_t placeholder_alarm("");
struct future_t placeholder_future(NULL);
std::string true_val = "true";
class DeviceIotConfigModuleTest : public testing::Test {
protected:
void SetUp() override {
test::mock::osi_alarm::alarm_new.body = [&](const char* name) -> alarm_t* {
return &placeholder_alarm;
};
test::mock::osi_properties::osi_property_get_bool.body =
[&](const char* key, bool default_value) -> int { return false; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) { return; };
test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) {};
test::mock::osi_alarm::alarm_is_scheduled.body =
[&](const alarm_t* alarm) -> bool { return false; };
test::mock::osi_future::future_new_immediate.body =
[&](void* value) -> future_t* { return &placeholder_future; };
test::mock::osi_config::config_new_empty.body =
[&]() -> std::unique_ptr<config_t> {
return std::make_unique<config_t>();
};
test::mock::osi_config::config_new.body =
[&](const char* filename) -> std::unique_ptr<config_t> {
return std::make_unique<config_t>();
};
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) { return def_value; };
test::mock::osi_config::config_set_int.body =
[&](config_t* config, const std::string& section,
const std::string& key, int value) { return; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
const std::string* def_value) { return def_value; };
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section,
const std::string& key, const std::string& value) { return; };
test::mock::osi_allocator::osi_free.body = [&](void* ptr) {};
reset_mock_function_count_map();
}
void TearDown() override {
test::mock::osi_alarm::alarm_new = {};
test::mock::osi_alarm::alarm_set = {};
test::mock::osi_alarm::alarm_free = {};
test::mock::osi_alarm::alarm_is_scheduled = {};
test::mock::osi_future::future_new_immediate = {};
test::mock::osi_properties::osi_property_get = {};
test::mock::osi_config::config_new_empty = {};
test::mock::osi_config::config_new = {};
test::mock::osi_config::config_get_int = {};
test::mock::osi_config::config_set_int = {};
test::mock::osi_config::config_get_string = {};
test::mock::osi_config::config_set_string = {};
test::mock::osi_allocator::osi_free = {};
}
};
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest,
test_device_iot_config_module_init_is_factory_reset,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
bool is_factory_reset = false;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_properties::osi_property_get_bool.body =
[&](const char* key, bool default_value) -> int {
return is_factory_reset;
};
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
is_factory_reset = true;
config_new_return_value = NULL;
config_new_empty_return_value = NULL;
errno = 0;
int file_fd = -1;
int backup_fd = -1;
file_fd = open(IOT_CONFIG_FILE_PATH, O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC,
S_IRUSR | S_IWUSR);
EXPECT_TRUE(file_fd > 0);
EXPECT_EQ(errno, 0);
backup_fd = open(IOT_CONFIG_BACKUP_PATH,
O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC, S_IRUSR | S_IWUSR);
EXPECT_TRUE(backup_fd > 0);
EXPECT_EQ(errno, 0);
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), 0);
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), 0);
device_iot_config_module_init();
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
EXPECT_EQ(get_func_call_count("config_new"), 2);
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_init_no_config,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(nullptr);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(nullptr);
};
{
reset_mock_function_count_map();
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 2);
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_init_original,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = new config_t();
config_new_empty_return_value = NULL;
int config_get_int_return_value = DEVICE_IOT_INFO_CURRENT_VERSION;
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 1);
EXPECT_EQ(get_func_call_count("config_new_empty"), 0);
EXPECT_EQ(get_func_call_count("config_set_int"), 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_init_backup,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
if (strcmp(filename, IOT_CONFIG_BACKUP_PATH) == 0) {
return std::unique_ptr<config_t>(config_new_return_value);
}
return std::unique_ptr<config_t>(nullptr);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = new config_t();
config_new_empty_return_value = NULL;
int config_get_int_return_value = DEVICE_IOT_INFO_CURRENT_VERSION;
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 2);
EXPECT_EQ(get_func_call_count("config_new_empty"), 0);
EXPECT_EQ(get_func_call_count("config_set_int"), 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_init_new_file,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = NULL;
config_new_empty_return_value = new config_t();
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 2);
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest,
test_device_iot_config_module_init_version_invalid,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = new config_t();
config_new_empty_return_value = NULL;
int config_get_int_return_value = -1;
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 1);
EXPECT_EQ(get_func_call_count("config_new_empty"), 0);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest,
test_device_iot_config_module_init_version_new_config_new_empty_success,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "true";
config_new_return_value = new config_t();
config_new_empty_return_value = new config_t();
int config_get_int_return_value = 2;
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
int file_fd = -1;
int backup_fd = -1;
errno = 0;
file_fd = open(IOT_CONFIG_FILE_PATH, O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC,
S_IRUSR | S_IWUSR);
EXPECT_TRUE(file_fd > 0);
EXPECT_EQ(errno, 0);
errno = 0;
backup_fd = open(IOT_CONFIG_BACKUP_PATH,
O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC, S_IRUSR | S_IWUSR);
EXPECT_TRUE(backup_fd > 0);
EXPECT_EQ(errno, 0);
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), 0);
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), 0);
device_iot_config_module_init();
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
EXPECT_EQ(get_func_call_count("config_new"), 1);
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest,
test_device_iot_config_module_init_version_new_config_new_empty_fail,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = new config_t();
config_new_empty_return_value = NULL;
int config_get_int_return_value = 2;
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
int file_fd = -1;
int backup_fd = -1;
errno = 0;
file_fd = open(IOT_CONFIG_FILE_PATH, O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC,
S_IRUSR | S_IWUSR);
EXPECT_TRUE(file_fd > 0);
EXPECT_EQ(errno, 0);
errno = 0;
backup_fd = open(IOT_CONFIG_BACKUP_PATH,
O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC, S_IRUSR | S_IWUSR);
EXPECT_TRUE(backup_fd > 0);
EXPECT_EQ(errno, 0);
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), 0);
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), 0);
device_iot_config_module_init();
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
EXPECT_EQ(get_func_call_count("config_new"), 1);
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 0);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 0);
EXPECT_EQ(get_func_call_count("alarm_free"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest,
test_device_iot_config_module_init_original_timestamp_null,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = new config_t();
config_new_empty_return_value = NULL;
int config_get_int_return_value = DEVICE_IOT_INFO_CURRENT_VERSION;
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
const std::string* def_value) { return nullptr; };
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 1);
EXPECT_EQ(get_func_call_count("config_new_empty"), 0);
EXPECT_EQ(get_func_call_count("config_set_int"), 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest,
test_device_iot_config_module_init_alarm_new_fail,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
config_t* config_new_return_value = NULL;
config_t* config_new_empty_return_value = NULL;
test::mock::osi_config::config_new.body = [&](const char* filename) {
return std::unique_ptr<config_t>(config_new_return_value);
};
test::mock::osi_config::config_new_empty.body = [&](void) {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
{
reset_mock_function_count_map();
enable_logging_property_get_value = "true";
factory_reset_property_get_value = "false";
config_new_return_value = new config_t();
config_new_empty_return_value = NULL;
int config_get_int_return_value = DEVICE_IOT_INFO_CURRENT_VERSION;
std::string config_get_string_return_value(TIME_STRING_FORMAT);
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
int def_value) { return config_get_int_return_value; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
return &config_get_string_return_value;
};
test::mock::osi_alarm::alarm_new.body = [&](const char* name) {
return nullptr;
};
device_iot_config_module_init();
EXPECT_EQ(get_func_call_count("config_new"), 1);
EXPECT_EQ(get_func_call_count("config_new_empty"), 0);
EXPECT_EQ(get_func_call_count("config_set_int"), 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_new"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_start_up,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
enable_logging_property_get_value = "true";
device_iot_config_module_init();
{
reset_mock_function_count_map();
device_iot_config_module_start_up();
EXPECT_EQ(get_func_call_count("config_new"), 0);
EXPECT_EQ(get_func_call_count("config_new_empty"), 0);
EXPECT_EQ(get_func_call_count("alarm_free"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_shutdown,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
bool return_value;
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
test::mock::osi_alarm::alarm_is_scheduled.body =
[&](const alarm_t* alarm) -> bool { return return_value; };
enable_logging_property_get_value = "true";
device_iot_config_module_init();
{
reset_mock_function_count_map();
return_value = false;
device_iot_config_module_shut_down();
EXPECT_EQ(get_func_call_count("alarm_is_scheduled"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("config_save"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
{
reset_mock_function_count_map();
return_value = true;
device_iot_config_module_shut_down();
EXPECT_EQ(get_func_call_count("alarm_is_scheduled"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
test::mock::osi_alarm::alarm_is_scheduled.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigModuleTest, test_device_iot_config_module_clean_up,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
bool return_value;
std::string enable_logging_property_get_value;
std::string factory_reset_property_get_value;
test::mock::osi_alarm::alarm_is_scheduled.body =
[&](const alarm_t* alarm) -> bool { return return_value; };
enable_logging_property_get_value = "true";
device_iot_config_module_init();
{
reset_mock_function_count_map();
return_value = false;
device_iot_config_module_clean_up();
EXPECT_EQ(get_func_call_count("alarm_is_scheduled"), 1);
EXPECT_EQ(get_func_call_count("alarm_free"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 0);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("config_save"), 0);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
device_iot_config_module_init();
{
reset_mock_function_count_map();
return_value = true;
device_iot_config_module_clean_up();
EXPECT_EQ(get_func_call_count("alarm_is_scheduled"), 2);
EXPECT_EQ(get_func_call_count("alarm_free"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
EXPECT_EQ(get_func_call_count("future_new_immediate"), 1);
}
test::mock::osi_config::config_new.body = {};
test::mock::osi_config::config_new_empty.body = {};
test::mock::osi_alarm::alarm_is_scheduled.body = {};
}
class DeviceIotConfigTest : public testing::Test {
protected:
void SetUp() override {
test::mock::osi_alarm::alarm_new.body = [&](const char* name) -> alarm_t* {
return &placeholder_alarm;
};
test::mock::osi_properties::osi_property_get_bool.body =
[&](const char* key, bool default_value) -> int { return false; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) { return; };
test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) {};
test::mock::osi_alarm::alarm_is_scheduled.body =
[&](const alarm_t* alarm) -> bool { return false; };
test::mock::osi_future::future_new_immediate.body =
[&](void* value) -> future_t* { return &placeholder_future; };
test::mock::osi_config::config_new_empty.body =
[&]() -> std::unique_ptr<config_t> {
return std::make_unique<config_t>();
};
test::mock::osi_config::config_new.body =
[&](const char* filename) -> std::unique_ptr<config_t> {
return std::make_unique<config_t>();
};
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) { return def_value; };
test::mock::osi_config::config_set_int.body =
[&](config_t* config, const std::string& section,
const std::string& key, int value) { return; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
const std::string* def_value) { return def_value; };
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section,
const std::string& key, const std::string& value) { return; };
test::mock::osi_allocator::osi_free.body = [&](void* ptr) {};
device_iot_config_module_init();
device_iot_config_module_start_up();
reset_mock_function_count_map();
}
void TearDown() override {
test::mock::osi_alarm::alarm_new = {};
test::mock::osi_alarm::alarm_set = {};
test::mock::osi_alarm::alarm_free = {};
test::mock::osi_alarm::alarm_is_scheduled = {};
test::mock::osi_future::future_new_immediate = {};
test::mock::osi_properties::osi_property_get = {};
test::mock::osi_config::config_new_empty = {};
test::mock::osi_config::config_new = {};
test::mock::osi_config::config_get_int = {};
test::mock::osi_config::config_set_int = {};
test::mock::osi_config::config_get_string = {};
test::mock::osi_config::config_set_string = {};
test::mock::osi_allocator::osi_free = {};
}
};
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_sections_sort_by_entry_key,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
config_t conf;
device_iot_config_sections_sort_by_entry_key(conf, NULL);
}
{
config_t conf;
conf.sections = {
section_t{.entries =
{
entry_t{
.key = "a",
},
entry_t{
.key = "b",
},
entry_t{
.key = "c",
},
entry_t{
.key = "d",
},
}},
section_t{.entries =
{
entry_t{
.key = "d",
},
entry_t{
.key = "c",
},
entry_t{
.key = "b",
},
entry_t{
.key = "a",
},
}},
};
device_iot_config_sections_sort_by_entry_key(
conf, [](const entry_t& first, const entry_t& second) {
return first.key.compare(second.key) >= 0;
});
auto& sec1 = conf.sections.front();
auto& sec2 = conf.sections.back();
for (auto i = 0; i < 4; ++i) {
EXPECT_EQ(sec1.entries.front().key, sec2.entries.front().key);
sec1.entries.pop_front();
sec2.entries.pop_front();
}
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_has_section,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, expected_section = "abc";
bool return_value = false;
test::mock::osi_config::config_has_section.body =
[&](const config_t& config, const std::string& section) {
actual_section = section;
return return_value;
};
{
reset_mock_function_count_map();
EXPECT_EQ(device_iot_config_has_section(expected_section), return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(get_func_call_count("config_has_section"), 1);
}
{
reset_mock_function_count_map();
return_value = true;
EXPECT_EQ(device_iot_config_has_section(expected_section), return_value);
EXPECT_EQ(get_func_call_count("config_has_section"), 1);
}
test::mock::osi_config::config_has_section.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_exist,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
bool return_value = false;
test::mock::osi_config::config_has_key.body = [&](const config_t& config,
const std::string& section,
const std::string& key) {
actual_section = section;
actual_key = key;
return return_value;
};
{
reset_mock_function_count_map();
EXPECT_EQ(device_iot_config_exist(expected_section, expected_key),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_has_key"), 1);
}
{
reset_mock_function_count_map();
return_value = true;
EXPECT_EQ(device_iot_config_exist(expected_section, expected_key),
return_value);
EXPECT_EQ(get_func_call_count("config_has_key"), 1);
}
test::mock::osi_config::config_has_key.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_has_key_value,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
std::string expected_value_str = "xyz", actual_value_str;
const std::string* actual_def_value = NULL;
const std::string* return_value = NULL;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
actual_def_value = def_value;
return return_value;
};
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_has_key_value(expected_section, expected_key,
expected_value_str));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "xyy";
return_value = &actual_value_str;
EXPECT_FALSE(device_iot_config_has_key_value(expected_section, expected_key,
expected_value_str));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "xy";
return_value = &actual_value_str;
EXPECT_FALSE(device_iot_config_has_key_value(expected_section, expected_key,
expected_value_str));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "xyyy";
return_value = &actual_value_str;
EXPECT_FALSE(device_iot_config_has_key_value(expected_section, expected_key,
expected_value_str));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "xyz";
return_value = &actual_value_str;
EXPECT_TRUE(device_iot_config_has_key_value(expected_section, expected_key,
expected_value_str));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
test::mock::osi_config::config_get_string.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_get_int,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
bool return_value = false;
int int_value = 0, new_value = 0xff;
test::mock::osi_config::config_has_key.body = [&](const config_t& config,
const std::string& section,
const std::string& key) {
actual_section = section;
actual_key = key;
return return_value;
};
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) { return new_value; };
{
reset_mock_function_count_map();
EXPECT_EQ(
device_iot_config_get_int(expected_section, expected_key, int_value),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_has_key"), 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 0);
}
{
reset_mock_function_count_map();
return_value = true;
EXPECT_EQ(
device_iot_config_get_int(expected_section, expected_key, int_value),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, new_value);
EXPECT_EQ(get_func_call_count("config_has_key"), 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
}
test::mock::osi_config::config_has_key.body = {};
test::mock::osi_config::config_get_int.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_get_int,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_section, actual_key,
expected_section = "00:00:00:00:00:00", expected_key = "def";
bool return_value = false;
int int_value = 0, new_value = 0xff;
test::mock::osi_config::config_has_key.body = [&](const config_t& config,
const std::string& section,
const std::string& key) {
actual_section = section;
actual_key = key;
return return_value;
};
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) { return new_value; };
{
reset_mock_function_count_map();
EXPECT_EQ(
DEVICE_IOT_CONFIG_ADDR_GET_INT(peer_addr, expected_key, int_value),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_has_key"), 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 0);
}
{
reset_mock_function_count_map();
return_value = true;
EXPECT_EQ(
DEVICE_IOT_CONFIG_ADDR_GET_INT(peer_addr, expected_key, int_value),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, new_value);
EXPECT_EQ(get_func_call_count("config_has_key"), 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
}
test::mock::osi_config::config_has_key.body = {};
test::mock::osi_config::config_get_int.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_set_int,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
std::string string_return_value = "123456789";
std::string old_string_value = string_return_value;
std::string new_string_value;
int int_value = 123456789;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return &string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
EXPECT_TRUE(
device_iot_config_set_int(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "123";
EXPECT_TRUE(
device_iot_config_set_int(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(new_string_value, old_string_value);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_set_int,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string string_return_value = "123456789";
std::string old_string_value = string_return_value;
std::string new_string_value;
int int_value = 123456789;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return &string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_SET_INT(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "123";
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_SET_INT(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(new_string_value, old_string_value);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_int_add_one,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
int int_value = 0, get_default_value, set_value;
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) {
actual_section = section;
actual_key = key;
get_default_value = def_value;
return int_value;
};
test::mock::osi_config::config_set_int.body =
[&](config_t* config, const std::string& section, const std::string& key,
int val) { set_value = val; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
int_value = -1;
EXPECT_TRUE(device_iot_config_int_add_one(expected_section, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, 0);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = 0;
EXPECT_TRUE(device_iot_config_int_add_one(expected_section, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, int_value + 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = 1;
EXPECT_TRUE(device_iot_config_int_add_one(expected_section, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, int_value + 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = INT_MAX;
EXPECT_TRUE(device_iot_config_int_add_one(expected_section, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, int_value + 1);
EXPECT_EQ(set_value, INT_MIN);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = INT_MIN;
EXPECT_TRUE(device_iot_config_int_add_one(expected_section, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, 0);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_int.body = {};
test::mock::osi_config::config_set_int.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_int_add_one,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_section, actual_key,
expected_section = "00:00:00:00:00:00", expected_key = "def";
int int_value = 0, get_default_value, set_value;
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) {
actual_section = section;
actual_key = key;
get_default_value = def_value;
return int_value;
};
test::mock::osi_config::config_set_int.body =
[&](config_t* config, const std::string& section, const std::string& key,
int val) { set_value = val; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
int_value = -1;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_addr, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, 0);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = 0;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_addr, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, int_value + 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = 1;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_addr, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, int_value + 1);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = INT_MAX;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_addr, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, int_value + 1);
EXPECT_EQ(set_value, INT_MIN);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
int_value = INT_MIN;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_addr, expected_key));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_default_value, 0);
EXPECT_EQ(set_value, 0);
EXPECT_EQ(get_func_call_count("config_get_int"), 1);
EXPECT_EQ(get_func_call_count("config_set_int"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_int.body = {};
test::mock::osi_config::config_set_int.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_get_hex,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key,
expected_section = "00:00:00:00:00:00", expected_key = "def";
int int_value = 0;
std::string string_value;
std::string* get_string_return_value = NULL;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
{
reset_mock_function_count_map();
EXPECT_FALSE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "g";
get_string_return_value = &string_value;
EXPECT_FALSE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "abcg";
get_string_return_value = &string_value;
EXPECT_FALSE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "f";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 15);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "0";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "1";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "-e";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, -14);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "-f";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, -15);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "0x7fffffff";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, INT_MAX);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "-0x80000000";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, INT_MIN);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "0xffffffff";
get_string_return_value = &string_value;
EXPECT_TRUE(
device_iot_config_get_hex(expected_section, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, -1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
test::mock::osi_config::config_get_string.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_get_hex,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_section, actual_key,
expected_section = "00:00:00:00:00:00", expected_key = "def";
int int_value = 0;
std::string string_value;
std::string* get_string_return_value = NULL;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
{
reset_mock_function_count_map();
EXPECT_FALSE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "g";
get_string_return_value = &string_value;
EXPECT_FALSE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "f";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 15);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "0";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "1";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "-e";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, -14);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "-f";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, -15);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "0x7fffffff";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, INT_MAX);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "-0x80000000";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, INT_MIN);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
string_value = "0xffffffff";
get_string_return_value = &string_value;
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, expected_key, int_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(int_value, -1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
test::mock::osi_config::config_get_string.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_set_hex,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
int int_value, byte_num;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
string_return_value = "01";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "0001";
int_value = 1;
byte_num = 2;
get_string_return_value = &string_return_value;
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "000001";
int_value = 1;
byte_num = 3;
get_string_return_value = &string_return_value;
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "00000001";
int_value = 1;
byte_num = 4;
get_string_return_value = &string_return_value;
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "";
int_value = 1;
byte_num = 0;
get_string_return_value = &string_return_value;
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "";
int_value = 1;
byte_num = 5;
get_string_return_value = &string_return_value;
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "ff";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
std::string expected_string_value = "01";
EXPECT_TRUE(device_iot_config_set_hex(expected_section, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(new_string_value, expected_string_value);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_set_hex,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string string_return_value;
std::string old_string_value = string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
int int_value = 123456789;
int byte_num = 1;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
string_return_value = "01";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "0001";
int_value = 1;
byte_num = 2;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "000001";
int_value = 1;
byte_num = 3;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "00000001";
int_value = 1;
byte_num = 4;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "";
int_value = 1;
byte_num = 0;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "";
int_value = 1;
byte_num = 5;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "ff";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
std::string expected_string_value = "01";
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, expected_key,
int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(new_string_value, expected_string_value);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_set_hex_if_greater,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string string_return_value;
std::string old_string_value = string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
int int_value = 123456789;
int byte_num = 1;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
string_return_value = "00";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(
peer_addr, expected_key, int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 2);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
{
reset_mock_function_count_map();
string_return_value = "01";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(
peer_addr, expected_key, int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "02";
int_value = 1;
byte_num = 1;
get_string_return_value = &string_return_value;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(
peer_addr, expected_key, int_value, byte_num));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_get_str,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
std::string actual_value_str;
const std::string* actual_def_value = NULL;
const std::string* return_value = NULL;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
actual_def_value = def_value;
return return_value;
};
{
reset_mock_function_count_map();
int initial_size_bytes = 30;
int size_bytes = initial_size_bytes;
char get_value_str[size_bytes];
EXPECT_FALSE(device_iot_config_get_str(expected_section, expected_key,
get_value_str, &size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, initial_size_bytes);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
int initial_size_bytes = 30;
int size_bytes = initial_size_bytes;
char get_value_str[size_bytes];
actual_value_str = "abc";
return_value = &actual_value_str;
EXPECT_TRUE(device_iot_config_get_str(expected_section, expected_key,
get_value_str, &size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, (int)actual_value_str.length() + 1);
EXPECT_TRUE(strncmp(get_value_str, actual_value_str.c_str(), size_bytes) ==
0);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
test::mock::osi_config::config_get_string.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_set_str,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string input_value;
std::string string_return_value;
std::string old_string_value = string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
std::string str_value;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
string_return_value = "01";
get_string_return_value = &string_return_value;
input_value = "01";
EXPECT_TRUE(
device_iot_config_set_str(expected_section, expected_key, input_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "02";
get_string_return_value = &string_return_value;
input_value = "01";
EXPECT_TRUE(
device_iot_config_set_str(expected_section, expected_key, input_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(new_string_value, input_value);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_set_str,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string input_value;
std::string string_return_value;
std::string old_string_value = string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
std::string str_value;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
{
reset_mock_function_count_map();
string_return_value = "01";
get_string_return_value = &string_return_value;
input_value = "01";
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_SET_STR(peer_addr, expected_key, input_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
}
{
reset_mock_function_count_map();
string_return_value = "02";
get_string_return_value = &string_return_value;
input_value = "01";
EXPECT_TRUE(
DEVICE_IOT_CONFIG_ADDR_SET_STR(peer_addr, expected_key, input_value));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(new_string_value, input_value);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_get_bin,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
std::string actual_value_str;
const std::string* actual_def_value = NULL;
const std::string* return_value = NULL;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
actual_def_value = def_value;
return return_value;
};
{
reset_mock_function_count_map();
size_t initial_size_bytes = 3;
size_t size_bytes = initial_size_bytes;
uint8_t value[size_bytes];
EXPECT_FALSE(device_iot_config_get_bin(expected_section, expected_key,
value, &size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, initial_size_bytes);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
size_t initial_size_bytes = 3;
size_t size_bytes = initial_size_bytes;
uint8_t value[size_bytes];
actual_value_str = "abc";
return_value = &actual_value_str;
EXPECT_FALSE(device_iot_config_get_bin(expected_section, expected_key,
value, &size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, initial_size_bytes);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
size_t initial_size_bytes = 3;
size_t size_bytes = initial_size_bytes;
uint8_t value[size_bytes];
actual_value_str = "aabbccdd";
return_value = &actual_value_str;
EXPECT_FALSE(device_iot_config_get_bin(expected_section, expected_key,
value, &size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, initial_size_bytes);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
size_t initial_size_bytes = 3;
size_t size_bytes = initial_size_bytes;
uint8_t value[size_bytes];
actual_value_str = "abcdefgh";
return_value = &actual_value_str;
EXPECT_FALSE(device_iot_config_get_bin(expected_section, expected_key,
value, &size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, initial_size_bytes);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
size_t initial_size_bytes = 3;
size_t size_bytes = initial_size_bytes;
uint8_t value[size_bytes];
actual_value_str = "abcdef";
return_value = &actual_value_str;
EXPECT_TRUE(device_iot_config_get_bin(expected_section, expected_key, value,
&size_bytes));
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(size_bytes, actual_value_str.length() / 2);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
test::mock::osi_config::config_get_string.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_get_bin_length,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_section, actual_key, expected_section = "abc",
expected_key = "def";
std::string actual_value_str;
const std::string* actual_def_value = NULL;
const std::string* return_value = NULL;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
actual_def_value = def_value;
return return_value;
};
{
reset_mock_function_count_map();
EXPECT_EQ(device_iot_config_get_bin_length(expected_section, expected_key),
0u);
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "abc";
return_value = &actual_value_str;
EXPECT_EQ(device_iot_config_get_bin_length(expected_section, expected_key),
0u);
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "aabbccdd";
return_value = &actual_value_str;
EXPECT_EQ(device_iot_config_get_bin_length(expected_section, expected_key),
4u);
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
/* does not check if characters are correct*/
actual_value_str = "abcdefgh";
return_value = &actual_value_str;
EXPECT_EQ(device_iot_config_get_bin_length(expected_section, expected_key),
4u);
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
{
reset_mock_function_count_map();
actual_value_str = "abcdef";
return_value = &actual_value_str;
EXPECT_EQ(device_iot_config_get_bin_length(expected_section, expected_key),
3u);
EXPECT_TRUE(actual_def_value == NULL);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
}
test::mock::osi_config::config_get_string.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_set_bin,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string string_return_value;
std::string old_string_value = string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
std::string str_value;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
test::mock::osi_allocator::osi_calloc.body = [&](size_t size) {
return new char[size];
};
{
reset_mock_function_count_map();
string_return_value = "010203";
get_string_return_value = &string_return_value;
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = sizeof(input_value);
EXPECT_TRUE(device_iot_config_set_bin(expected_section, expected_key,
input_value, length));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
EXPECT_EQ(get_func_call_count("osi_free"), 1);
}
{
reset_mock_function_count_map();
string_return_value = "\0";
get_string_return_value = &string_return_value;
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = 0;
EXPECT_TRUE(device_iot_config_set_bin(expected_section, expected_key,
input_value, length));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
EXPECT_EQ(get_func_call_count("osi_free"), 1);
}
{
reset_mock_function_count_map();
string_return_value = "010101";
get_string_return_value = &string_return_value;
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = sizeof(input_value);
EXPECT_TRUE(device_iot_config_set_bin(expected_section, expected_key,
input_value, length));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
EXPECT_EQ(get_func_call_count("osi_free"), 1);
}
{
reset_mock_function_count_map();
test::mock::osi_allocator::osi_calloc.body = [&](size_t size) {
return nullptr;
};
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = sizeof(input_value);
EXPECT_FALSE(device_iot_config_set_bin(expected_section, expected_key,
input_value, length));
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 0);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
EXPECT_EQ(get_func_call_count("osi_free"), 0);
}
test::mock::osi_allocator::osi_calloc.body = {};
test::mock::osi_allocator::osi_free.body = {};
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_addr_set_bin,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
std::string string_return_value;
std::string old_string_value = string_return_value;
std::string new_string_value;
std::string* get_string_return_value = NULL;
std::string str_value;
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key, const std::string* def_value) {
actual_section = section;
actual_key = key;
return get_string_return_value;
};
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section, const std::string& key,
const std::string& value) { new_string_value = value; };
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) {};
test::mock::osi_allocator::osi_calloc.body = [&](size_t size) {
return new char[size];
};
{
reset_mock_function_count_map();
string_return_value = "010203";
get_string_return_value = &string_return_value;
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = sizeof(input_value);
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_BIN(peer_addr, expected_key,
input_value, length));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
EXPECT_EQ(get_func_call_count("osi_free"), 1);
}
{
reset_mock_function_count_map();
string_return_value = "\0";
get_string_return_value = &string_return_value;
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = 0;
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_BIN(peer_addr, expected_key,
input_value, length));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
EXPECT_EQ(get_func_call_count("osi_free"), 1);
}
{
reset_mock_function_count_map();
string_return_value = "010101";
get_string_return_value = &string_return_value;
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = sizeof(input_value);
EXPECT_TRUE(DEVICE_IOT_CONFIG_ADDR_SET_BIN(peer_addr, expected_key,
input_value, length));
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 1);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
EXPECT_EQ(get_func_call_count("osi_free"), 1);
}
{
reset_mock_function_count_map();
test::mock::osi_allocator::osi_calloc.body = [&](size_t size) {
return nullptr;
};
uint8_t input_value[] = {0x01, 0x02, 0x03};
size_t length = sizeof(input_value);
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_SET_BIN(peer_addr, expected_key,
input_value, length));
EXPECT_EQ(get_func_call_count("osi_calloc"), 1);
EXPECT_EQ(get_func_call_count("config_get_string"), 0);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_set"), 0);
EXPECT_EQ(get_func_call_count("osi_free"), 0);
}
test::mock::osi_allocator::osi_calloc.body = {};
test::mock::osi_allocator::osi_free.body = {};
test::mock::osi_config::config_get_string.body = {};
test::mock::osi_config::config_set_string.body = {};
test::mock::osi_alarm::alarm_set.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_remove,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
std::string actual_key, expected_key = "def";
std::string actual_section, expected_section = "00:00:00:00:00:00";
bool return_value;
test::mock::osi_config::config_remove_key.body =
[&](config_t* config, const std::string& section,
const std::string& key) {
actual_section = section;
actual_key = key;
return return_value;
};
{
reset_mock_function_count_map();
return_value = false;
EXPECT_EQ(device_iot_config_remove(expected_section, expected_key),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_remove_key"), 1);
}
{
reset_mock_function_count_map();
return_value = true;
EXPECT_EQ(device_iot_config_remove(expected_section, expected_key),
return_value);
EXPECT_EQ(actual_section, expected_section);
EXPECT_EQ(actual_key, expected_key);
EXPECT_EQ(get_func_call_count("config_remove_key"), 1);
}
test::mock::osi_config::config_remove_key.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_save_async,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
reset_mock_function_count_map();
device_iot_config_save_async();
EXPECT_EQ(get_func_call_count("alarm_set"), 1);
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_flush,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
bool return_value;
test::mock::osi_alarm::alarm_is_scheduled.body =
[&](const alarm_t* alarm) -> bool { return return_value; };
{
reset_mock_function_count_map();
return_value = false;
device_iot_config_flush();
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("alarm_is_scheduled"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
}
{
reset_mock_function_count_map();
return_value = true;
device_iot_config_flush();
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("alarm_is_scheduled"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
}
test::mock::osi_alarm::alarm_is_scheduled.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_clear,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
config_t* config_new_empty_return_value;
bool config_save_return_value;
test::mock::osi_alarm::alarm_cancel.body = [&](alarm_t* alarm) {};
test::mock::osi_config::config_new_empty.body = [&]() {
return std::unique_ptr<config_t>(config_new_empty_return_value);
};
test::mock::osi_config::config_save.body =
[&](const config_t& config, const std::string& filename) -> bool {
return config_save_return_value;
};
{
reset_mock_function_count_map();
config_new_empty_return_value = new config_t();
config_save_return_value = false;
EXPECT_FALSE(device_iot_config_clear());
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
}
{
reset_mock_function_count_map();
config_new_empty_return_value = new config_t();
config_save_return_value = true;
EXPECT_TRUE(device_iot_config_clear());
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
}
{
reset_mock_function_count_map();
config_new_empty_return_value = NULL;
EXPECT_FALSE(device_iot_config_clear());
EXPECT_EQ(get_func_call_count("config_new_empty"), 1);
EXPECT_EQ(get_func_call_count("alarm_cancel"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 0);
}
test::mock::osi_alarm::alarm_cancel.body = {};
test::mock::osi_config::config_new_empty.body = {};
test::mock::osi_config::config_save.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_timer_save_cb,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
reset_mock_function_count_map();
device_iot_config_timer_save_cb(NULL);
EXPECT_EQ(get_func_call_count("btif_transfer_context"), 1);
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_set_modified_time,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
reset_mock_function_count_map();
device_iot_config_set_modified_time();
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_get_device_num,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
config_t config;
auto num = device_iot_config_get_device_num(config);
EXPECT_EQ(num, 0);
}
{
section_t section1 = {.name = "00:01:02:03:04:05"};
section_t section2 = {.name = "01:01:01:01:01:01"};
section_t section3 = {.name = "00:00:00:00:00:00"};
section_t section4 = {.name = ""};
config_t config;
config.sections.push_back(section1);
config.sections.push_back(section2);
config.sections.push_back(section3);
config.sections.push_back(section4);
auto num = device_iot_config_get_device_num(config);
EXPECT_EQ(num, 3);
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_restrict_device_num,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
section_t section = {.name = "00:01:02:03:04:05"};
{
config_t config;
EXPECT_EQ(device_iot_config_get_device_num(config), 0);
device_iot_config_restrict_device_num(config);
EXPECT_EQ(device_iot_config_get_device_num(config), 0);
}
{
int section_count = DEVICES_MAX_NUM_IN_IOT_INFO_FILE;
int expected_count = section_count;
config_t config;
for (int i = 0; i < section_count; ++i) {
config.sections.push_back(section);
}
EXPECT_EQ(device_iot_config_get_device_num(config), section_count);
device_iot_config_restrict_device_num(config);
EXPECT_EQ(device_iot_config_get_device_num(config), expected_count);
}
{
int section_count = DEVICES_MAX_NUM_IN_IOT_INFO_FILE + 1;
int expected_count = DEVICES_MAX_NUM_IN_IOT_INFO_FILE - DEVICES_NUM_MARGIN;
config_t config;
for (int i = 0; i < section_count; ++i) {
config.sections.push_back(section);
}
EXPECT_EQ(device_iot_config_get_device_num(config), section_count);
device_iot_config_restrict_device_num(config);
EXPECT_EQ(device_iot_config_get_device_num(config), expected_count);
}
{
int section_count = 2 * DEVICES_MAX_NUM_IN_IOT_INFO_FILE;
int expected_count = DEVICES_MAX_NUM_IN_IOT_INFO_FILE - DEVICES_NUM_MARGIN;
config_t config;
for (int i = 0; i < section_count; ++i) {
config.sections.push_back(section);
}
EXPECT_EQ(device_iot_config_get_device_num(config), section_count);
device_iot_config_restrict_device_num(config);
EXPECT_EQ(device_iot_config_get_device_num(config), expected_count);
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_compare_key,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
entry_t first =
{
.key = "NotProfile/a",
},
second = {
.key = "NotProfile/b",
};
EXPECT_TRUE(device_iot_config_compare_key(first, second));
}
{
entry_t first =
{
.key = "Profile/a",
},
second = {
.key = "Profile/b",
};
EXPECT_TRUE(device_iot_config_compare_key(first, second));
}
{
entry_t first =
{
.key = "Profile/b",
},
second = {
.key = "Profile/a",
};
EXPECT_FALSE(device_iot_config_compare_key(first, second));
}
{
entry_t first =
{
.key = "Profile/b",
},
second = {
.key = "NotProfile/a",
};
EXPECT_FALSE(device_iot_config_compare_key(first, second));
}
{
entry_t first =
{
.key = "NotProfile/b",
},
second = {
.key = "Profile/a",
};
EXPECT_TRUE(device_iot_config_compare_key(first, second));
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_write,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
test::mock::osi_config::config_save.body =
[&](const config_t& config, const std::string& filename) -> bool {
return true;
};
{
reset_mock_function_count_map();
int event = IOT_CONFIG_FLUSH_EVT;
device_iot_config_write(event, NULL);
EXPECT_EQ(get_func_call_count("config_set_string"), 0);
EXPECT_EQ(get_func_call_count("config_save"), 1);
}
{
reset_mock_function_count_map();
int event = IOT_CONFIG_SAVE_TIMER_FIRED_EVT;
device_iot_config_write(event, NULL);
EXPECT_EQ(get_func_call_count("config_set_string"), 1);
EXPECT_EQ(get_func_call_count("config_save"), 1);
}
test::mock::osi_config::config_save.body = {};
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_debug_iot_config_dump,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
errno = 0;
int fd = -1;
const int BUF_SIZE = 100;
char buf[BUF_SIZE] = {0};
fd = open(IOT_CONFIG_FILE_PATH, O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC,
S_IRUSR | S_IWUSR);
EXPECT_TRUE(fd > 0);
EXPECT_EQ(errno, 0);
lseek(fd, 0, SEEK_SET);
auto bytes_read = read(fd, buf, BUF_SIZE);
EXPECT_EQ(bytes_read, 0);
EXPECT_EQ(errno, 0);
lseek(fd, 0, SEEK_SET);
device_debug_iot_config_dump(fd);
lseek(fd, 0, SEEK_SET);
bytes_read = read(fd, buf, BUF_SIZE);
EXPECT_TRUE(bytes_read > 0);
EXPECT_EQ(errno, 0);
lseek(fd, 0, SEEK_SET);
close(fd);
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_iot_config_is_factory_reset,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
bool return_value;
test::mock::osi_properties::osi_property_get_bool.body =
[&](const char* key, bool default_value) -> bool { return return_value; };
{
return_value = false;
EXPECT_FALSE(device_iot_config_is_factory_reset());
}
{
return_value = true;
EXPECT_TRUE(device_iot_config_is_factory_reset());
}
}
TEST_F_WITH_FLAGS(
DeviceIotConfigTest, test_device_debug_iot_config_delete_files,
REQUIRES_FLAGS_ENABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
{
errno = 0;
int file_fd = -1;
int backup_fd = -1;
file_fd = open(IOT_CONFIG_FILE_PATH, O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC,
S_IRUSR | S_IWUSR);
EXPECT_TRUE(file_fd > 0);
EXPECT_EQ(errno, 0);
backup_fd = open(IOT_CONFIG_BACKUP_PATH,
O_CREAT | O_RDWR | O_TRUNC | O_CLOEXEC, S_IRUSR | S_IWUSR);
EXPECT_TRUE(backup_fd > 0);
EXPECT_EQ(errno, 0);
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), 0);
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), 0);
device_iot_config_delete_files();
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_FILE_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
errno = 0;
EXPECT_EQ(access(IOT_CONFIG_BACKUP_PATH, F_OK), -1);
EXPECT_EQ(errno, ENOENT);
}
}
class DeviceIotConfigDisabledTest : public testing::Test {
protected:
void SetUp() override {
test::mock::osi_alarm::alarm_new.body = [&](const char* name) -> alarm_t* {
return &placeholder_alarm;
};
test::mock::osi_alarm::alarm_set.body =
[&](alarm_t* alarm, uint64_t interval_ms, alarm_callback_t cb,
void* data) { return; };
test::mock::osi_alarm::alarm_free.body = [](alarm_t* alarm) {};
test::mock::osi_alarm::alarm_is_scheduled.body =
[&](const alarm_t* alarm) -> bool { return false; };
test::mock::osi_future::future_new_immediate.body =
[&](void* value) -> future_t* { return &placeholder_future; };
test::mock::osi_config::config_new_empty.body =
[&]() -> std::unique_ptr<config_t> {
return std::make_unique<config_t>();
};
test::mock::osi_config::config_new.body =
[&](const char* filename) -> std::unique_ptr<config_t> {
return std::make_unique<config_t>();
};
test::mock::osi_config::config_get_int.body =
[&](const config_t& config, const std::string& section,
const std::string& key, int def_value) { return def_value; };
test::mock::osi_config::config_set_int.body =
[&](config_t* config, const std::string& section,
const std::string& key, int value) { return; };
test::mock::osi_config::config_get_string.body =
[&](const config_t& config, const std::string& section,
const std::string& key,
const std::string* def_value) { return def_value; };
test::mock::osi_config::config_set_string.body =
[&](config_t* config, const std::string& section,
const std::string& key, const std::string& value) { return; };
test::mock::osi_allocator::osi_free.body = [&](void* ptr) {};
device_iot_config_module_init();
device_iot_config_module_start_up();
reset_mock_function_count_map();
}
void TearDown() override {
test::mock::osi_alarm::alarm_new = {};
test::mock::osi_alarm::alarm_set = {};
test::mock::osi_alarm::alarm_free = {};
test::mock::osi_alarm::alarm_is_scheduled = {};
test::mock::osi_future::future_new_immediate = {};
test::mock::osi_properties::osi_property_get = {};
test::mock::osi_config::config_new_empty = {};
test::mock::osi_config::config_new = {};
test::mock::osi_config::config_get_int = {};
test::mock::osi_config::config_set_int = {};
test::mock::osi_config::config_get_string = {};
test::mock::osi_config::config_set_string = {};
test::mock::osi_allocator::osi_free = {};
}
};
TEST_F_WITH_FLAGS(
DeviceIotConfigDisabledTest, test_device_iot_config_disabled,
REQUIRES_FLAGS_DISABLED(ACONFIG_FLAG(TEST_BT, device_iot_config_logging))) {
const RawAddress peer_addr{};
std::string section, key, value_str;
int value_int{};
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_has_section(section));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_exist(section, key));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_get_int(section, key, value_int));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_GET_INT(peer_addr, key, value_int));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_set_int(section, key, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_SET_INT(peer_addr, key, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_int_add_one(section, key));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_INT_ADD_ONE(peer_addr, key));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_get_hex(section, key, value_int));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_GET_HEX(peer_addr, key, value_int));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_set_hex(section, key, 0, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_SET_HEX(peer_addr, key, 0, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(
DEVICE_IOT_CONFIG_ADDR_SET_HEX_IF_GREATER(peer_addr, key, 0, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_get_str(section, key, NULL, NULL));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_set_str(section, key, value_str));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_SET_STR(peer_addr, key, value_str));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_get_bin(section, key, NULL, NULL));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_set_bin(section, key, NULL, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(DEVICE_IOT_CONFIG_ADDR_SET_BIN(peer_addr, key, NULL, 0));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_FALSE(device_iot_config_remove(section, key));
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_EQ(device_iot_config_get_bin_length(section, key), 0u);
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
device_iot_config_flush();
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
EXPECT_TRUE(device_iot_config_clear());
EXPECT_EQ(get_func_call_size(), 0);
}
{
reset_mock_function_count_map();
device_debug_iot_config_dump(0);
EXPECT_EQ(get_func_call_size(), 0);
}
}