-
Notifications
You must be signed in to change notification settings - Fork 6.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Bluetooth: Tests: Add test for new
bt_settings_cleanup
Add a test for the new `bt_settings_cleanup` function. The test write artificially write settings then call `bt_settings_cleanup` and check that the settings that should not have been deleted have not been. Signed-off-by: Théo Battrel <[email protected]>
- Loading branch information
Showing
8 changed files
with
393 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
cmake_minimum_required(VERSION 3.20.0) | ||
|
||
find_package(Zephyr HINTS $ENV{ZEPHYR_BASE}) | ||
project(bsim_test_bt_host_settings_cleanup) | ||
|
||
target_sources(app PRIVATE | ||
src/main.c | ||
src/test.c | ||
) | ||
|
||
zephyr_include_directories( | ||
$ENV{BSIM_COMPONENTS_PATH}/libUtilv1/src/ | ||
$ENV{BSIM_COMPONENTS_PATH}/libPhyComv1/src/ | ||
|
||
$ENV{ZEPHYR_BASE}/subsys/bluetooth/host/ | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
CONFIG_BT=y | ||
CONFIG_BT_CENTRAL=y | ||
CONFIG_BT_PERIPHERAL=y | ||
CONFIG_BT_DEVICE_NAME="Settings Cleanup Test" | ||
|
||
CONFIG_LOG=y | ||
CONFIG_BT_SETTINGS_LOG_LEVEL_DBG=y | ||
|
||
CONFIG_BT_ID_MAX=3 | ||
|
||
CONFIG_BT_EXT_ADV=y | ||
CONFIG_BT_SMP=y | ||
|
||
CONFIG_FLASH=y | ||
CONFIG_FLASH_PAGE_LAYOUT=y | ||
CONFIG_FLASH_MAP=y | ||
CONFIG_NVS=y | ||
CONFIG_SETTINGS=y | ||
CONFIG_BT_SETTINGS=y | ||
|
||
# Increased stack due to settings API usage | ||
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 | ||
|
||
CONFIG_HEAP_MEM_POOL_SIZE=1024 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
/* Copyright (c) 2023 Nordic Semiconductor ASA | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include "bs_tracing.h" | ||
#include "bstests.h" | ||
|
||
#define FAIL(...) \ | ||
do { \ | ||
bst_result = Failed; \ | ||
bs_trace_error_time_line(__VA_ARGS__); \ | ||
} while (0) | ||
|
||
#define PASS(...) \ | ||
do { \ | ||
bst_result = Passed; \ | ||
bs_trace_info_time(1, __VA_ARGS__); \ | ||
} while (0) | ||
|
||
extern enum bst_result_t bst_result; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
/* Copyright (c) 2023 Nordic Semiconductor ASA | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include <zephyr/kernel.h> | ||
|
||
#include "bs_types.h" | ||
#include "bs_tracing.h" | ||
#include "bstests.h" | ||
#include <string.h> | ||
|
||
#include <zephyr/logging/log.h> | ||
|
||
#include "common.h" | ||
|
||
#define WAIT_TIME_S 60 | ||
#define WAIT_TIME (WAIT_TIME_S * 1e6) | ||
|
||
LOG_MODULE_REGISTER(bsim_bt_settings_cleanup, LOG_LEVEL_DBG); | ||
|
||
extern void run_tester(void); | ||
extern void run_dut(void); | ||
|
||
void test_tick(bs_time_t HW_device_time) | ||
{ | ||
if (bst_result != Passed) { | ||
FAIL("Test failed (not passed after %d seconds)\n", WAIT_TIME_S); | ||
} | ||
} | ||
|
||
static void test_settings_cleanup_init(void) | ||
{ | ||
bst_ticker_set_next_tick_absolute(WAIT_TIME); | ||
} | ||
|
||
static const struct bst_test_instance test_def[] = { | ||
{ | ||
.test_id = "tester", | ||
.test_descr = "Tester", | ||
.test_post_init_f = test_settings_cleanup_init, | ||
.test_tick_f = test_tick, | ||
.test_main_f = run_tester, | ||
}, | ||
{ | ||
.test_id = "dut", | ||
.test_descr = "DUT", | ||
.test_post_init_f = test_settings_cleanup_init, | ||
.test_tick_f = test_tick, | ||
.test_main_f = run_dut, | ||
}, | ||
BSTEST_END_MARKER}; | ||
|
||
struct bst_test_list *test_settings_cleanup_install(struct bst_test_list *tests) | ||
{ | ||
return bst_add_tests(tests, test_def); | ||
} | ||
|
||
bst_test_install_t test_installers[] = {test_settings_cleanup_install, NULL}; | ||
|
||
void main(void) | ||
{ | ||
bst_main(); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,217 @@ | ||
/* Copyright (c) 2023 Nordic Semiconductor ASA | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
#include <zephyr/kernel.h> | ||
|
||
#include <zephyr/logging/log.h> | ||
#include <zephyr/settings/settings.h> | ||
|
||
#include <zephyr/bluetooth/bluetooth.h> | ||
#include <zephyr/bluetooth/addr.h> | ||
#include <zephyr/bluetooth/settings.h> | ||
|
||
#include "settings.h" | ||
|
||
#include "common.h" | ||
#include "zephyr/sys/__assert.h" | ||
#include "zephyr/sys/util.h" | ||
#include <stddef.h> | ||
#include <string.h> | ||
|
||
LOG_MODULE_DECLARE(bsim_bt_settings_cleanup, LOG_LEVEL_DBG); | ||
|
||
const char *expected_settings_key[] = { | ||
"hash", | ||
"id", | ||
"sc/0000000000000", | ||
"cf/0000000000000", | ||
"ccc/0000000000000", | ||
"sc/0000000000000/2", | ||
"cf/0000000000000/2", | ||
"ccc/0000000000000/2", | ||
"mesh/dummy/key", | ||
}; | ||
|
||
static int print_all_settings_cb(const char *key, size_t len, settings_read_cb read_cb, | ||
void *cb_arg, void *param) | ||
{ | ||
ssize_t err; | ||
uint8_t *data = k_malloc(len); | ||
|
||
err = read_cb(cb_arg, data, len); | ||
if (err != len) { | ||
FAIL("Failed to read data (err %d)\n", err); | ||
} | ||
|
||
LOG_INF("key: 'bt/%s'", key); | ||
LOG_HEXDUMP_INF(data, len, "value:"); | ||
|
||
k_free(data); | ||
|
||
return 0; | ||
} | ||
|
||
static void print_all_settings(void) | ||
{ | ||
int err; | ||
|
||
err = settings_load_subtree_direct("bt", print_all_settings_cb, NULL); | ||
if (err) { | ||
FAIL("Failed to load 'bt' subtree (err %s)\n", err); | ||
} | ||
} | ||
|
||
static int check_settings_cb(const char *key, size_t len, settings_read_cb read_cb, void *cb_arg, | ||
void *param) | ||
{ | ||
bool key_is_expected = false; | ||
uint8_t *key_not_deleted = (uint8_t *)param; | ||
|
||
for (size_t i = 0; i < ARRAY_SIZE(expected_settings_key); i++) { | ||
if (strcmp(expected_settings_key[i], key) == 0 && key_not_deleted[i] == 0) { | ||
key_not_deleted[i] = 1; | ||
key_is_expected = true; | ||
} | ||
} | ||
|
||
if (!key_is_expected) { | ||
FAIL("Key 'bt/%s' should have been deleted\n", key); | ||
} | ||
|
||
return 0; | ||
} | ||
|
||
static void check_settings(void) | ||
{ | ||
int err; | ||
uint8_t key_not_deleted[ARRAY_SIZE(expected_settings_key)] = {0}; | ||
|
||
err = settings_load_subtree_direct("bt", check_settings_cb, key_not_deleted); | ||
if (err) { | ||
FAIL("Failed to load 'bt' subtree (err %d)\n", err); | ||
} | ||
|
||
for (size_t i = 0; i < ARRAY_SIZE(expected_settings_key); i++) { | ||
if (key_not_deleted[i] == 0) { | ||
FAIL("Key '%s' should not have been deleted\n", expected_settings_key[i]); | ||
} | ||
} | ||
} | ||
|
||
static void populate_settings(void) | ||
{ | ||
int err; | ||
uint8_t dummy_value = 0; | ||
bt_addr_le_t dummy_addr; | ||
bt_addr_le_t ids_addr[CONFIG_BT_ID_MAX] = {0}; | ||
|
||
__ASSERT_NO_MSG(CONFIG_BT_ID_MAX >= 3); | ||
|
||
bt_addr_le_copy(&dummy_addr, BT_ADDR_LE_ANY); | ||
|
||
err = bt_addr_le_create_static(&ids_addr[0]); | ||
if (err) { | ||
FAIL("Failed to create static address (err %d)\n", err); | ||
} | ||
|
||
err = bt_addr_le_create_static(&ids_addr[2]); | ||
if (err) { | ||
FAIL("Failed to create static address (err %d)\n", err); | ||
} | ||
|
||
err = settings_save_one("bt/id", ids_addr, sizeof(ids_addr)); | ||
if (err) { | ||
FAIL("Failed to save ID (err %d)\n", err); | ||
} | ||
|
||
bt_settings_store_sc(0, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
bt_settings_store_cf(0, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
bt_settings_store_ccc(0, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
|
||
bt_settings_store_sc(1, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
bt_settings_store_cf(1, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
bt_settings_store_ccc(1, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
|
||
settings_save_one("bt/dummy/key", &dummy_value, sizeof(dummy_value)); | ||
|
||
settings_save_one("bt/i", &dummy_value, sizeof(dummy_value)); | ||
|
||
bt_settings_store_sc(2, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
bt_settings_store_cf(2, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
bt_settings_store_ccc(2, &dummy_addr, &dummy_value, sizeof(dummy_value)); | ||
|
||
settings_save_one("bt/mesh/dummy/key", &dummy_value, sizeof(dummy_value)); | ||
} | ||
|
||
void run_tester(void) | ||
{ | ||
int id; | ||
int err; | ||
char addr_str[BT_ADDR_STR_LEN]; | ||
size_t id_count = CONFIG_BT_ID_MAX; | ||
bt_addr_le_t addrs[CONFIG_BT_ID_MAX] = {0}; | ||
|
||
LOG_DBG("Starting test... (tester)"); | ||
|
||
err = bt_enable(NULL); | ||
if (err) { | ||
FAIL("Bluetooth init failed (err %d)\n", err); | ||
} | ||
|
||
LOG_DBG("Bluetooth initialised"); | ||
|
||
err = settings_load(); | ||
if (err) { | ||
FAIL("Failed to load settings (err %d)\n", err); | ||
} | ||
|
||
err = bt_id_create(NULL, NULL); | ||
if (err < 0) { | ||
FAIL("Failed to create new identity (err %d)\n", err); | ||
} | ||
id = err; | ||
|
||
err = bt_id_create(NULL, NULL); | ||
if (err < 0) { | ||
FAIL("Failed to create new identity (err %d)\n", err); | ||
} | ||
|
||
err = bt_id_delete(id); | ||
if (err) { | ||
FAIL("Failed to delete identity %d (err %d)\n", id, err); | ||
} | ||
|
||
bt_id_get(addrs, &id_count); | ||
|
||
for (size_t i = 0; i < CONFIG_BT_ID_MAX; i++) { | ||
bt_addr_le_to_str(&addrs[i], addr_str, BT_ADDR_STR_LEN); | ||
LOG_DBG("ID[%d]: %s", i, addr_str); | ||
} | ||
|
||
populate_settings(); | ||
|
||
print_all_settings(); | ||
|
||
PASS("Test passed (tester)\n"); | ||
} | ||
|
||
void run_dut(void) | ||
{ | ||
int err; | ||
|
||
LOG_DBG("Starting test... (dut)"); | ||
|
||
err = settings_subsys_init(); | ||
if (err) { | ||
FAIL("settings_subsys_init failed (err %d)\n", err); | ||
} | ||
|
||
bt_settings_cleanup(); | ||
|
||
print_all_settings(); | ||
|
||
check_settings(); | ||
|
||
PASS("Test passed (dut)\n"); | ||
} |
13 changes: 13 additions & 0 deletions
13
tests/bsim/bluetooth/host/settings/cleanup/test_scripts/_compile.sh
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
#!/usr/bin/env bash | ||
# Copyright 2023 Nordic Semiconductor ASA | ||
# SPDX-License-Identifier: Apache-2.0 | ||
|
||
set -eu | ||
bash_source_dir="$(realpath "$(dirname "${BASH_SOURCE[0]}")")" | ||
|
||
bsim_bin="${BSIM_OUT_PATH}/bin" | ||
BOARD="${BOARD:-nrf52_bsim}" | ||
test_exe="${bsim_bin}/bs_${BOARD}_tests_bsim_bluetooth_host_settings_cleanup_prj_conf" | ||
|
||
west build -b nrf52_bsim -d build && \ | ||
cp -v build/zephyr/zephyr.exe "${test_exe}" |
Oops, something went wrong.