Bluetooth: Host: Add a test for connection creation timeout
It seemed like there was lacking test coverage for this functionality. Signed-off-by: Rubin Gerritsen <rubin.gerritsen@nordicsemi.no>
This commit is contained in:
parent
e8b500fd22
commit
b30d2d1bf5
6 changed files with 167 additions and 0 deletions
23
tests/bsim/bluetooth/host/central/CMakeLists.txt
Normal file
23
tests/bsim/bluetooth/host/central/CMakeLists.txt
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.20.0)
|
||||||
|
|
||||||
|
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
|
||||||
|
project(central)
|
||||||
|
|
||||||
|
FILE(GLOB app_sources src/*.c)
|
||||||
|
target_sources(app PRIVATE ${app_sources} )
|
||||||
|
|
||||||
|
# This contains babblesim-specific helpers, e.g. device synchronization.
|
||||||
|
add_subdirectory(${ZEPHYR_BASE}/tests/bsim/babblekit babblekit)
|
||||||
|
target_link_libraries(app PRIVATE babblekit)
|
||||||
|
|
||||||
|
zephyr_include_directories(
|
||||||
|
${BSIM_COMPONENTS_PATH}/libUtilv1/src/
|
||||||
|
${BSIM_COMPONENTS_PATH}/libPhyComv1/src/
|
||||||
|
)
|
||||||
|
|
||||||
|
add_subdirectory(${ZEPHYR_BASE}/tests/bluetooth/common/testlib testlib)
|
||||||
|
target_link_libraries(app PRIVATE
|
||||||
|
testlib
|
||||||
|
)
|
3
tests/bsim/bluetooth/host/central/prj.conf
Normal file
3
tests/bsim/bluetooth/host/central/prj.conf
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
CONFIG_ASSERT=y
|
||||||
|
CONFIG_BT=y
|
||||||
|
CONFIG_BT_CENTRAL=y
|
109
tests/bsim/bluetooth/host/central/src/main.c
Normal file
109
tests/bsim/bluetooth/host/central/src/main.c
Normal file
|
@ -0,0 +1,109 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2024 Nordic Semiconductor
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "bstests.h"
|
||||||
|
#include "babblekit/testcase.h"
|
||||||
|
#include <zephyr/bluetooth/conn.h>
|
||||||
|
|
||||||
|
static K_SEM_DEFINE(sem_connected, 0, 1);
|
||||||
|
|
||||||
|
static void connected_cb(struct bt_conn *conn, uint8_t err)
|
||||||
|
{
|
||||||
|
TEST_ASSERT(conn);
|
||||||
|
TEST_ASSERT(err == BT_HCI_ERR_UNKNOWN_CONN_ID, "Expected connection timeout");
|
||||||
|
|
||||||
|
k_sem_give(&sem_connected);
|
||||||
|
bt_conn_unref(conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct bt_conn_cb conn_cb = {
|
||||||
|
.connected = connected_cb,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void test_central_connect_timeout_with_timeout(uint32_t timeout_ms)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
struct bt_conn *conn;
|
||||||
|
|
||||||
|
/* A zero value for `bt_conn_le_create_param.timeout` shall be
|
||||||
|
* interpreted as `CONFIG_BT_CREATE_CONN_TIMEOUT`.
|
||||||
|
*/
|
||||||
|
uint32_t expected_conn_timeout_ms =
|
||||||
|
timeout_ms ? timeout_ms : CONFIG_BT_CREATE_CONN_TIMEOUT * MSEC_PER_SEC;
|
||||||
|
|
||||||
|
bt_addr_le_t peer = {.a.val = {0x01}};
|
||||||
|
const struct bt_conn_le_create_param create_param = {
|
||||||
|
.options = BT_CONN_LE_OPT_NONE,
|
||||||
|
.interval = BT_GAP_SCAN_FAST_INTERVAL,
|
||||||
|
.window = BT_GAP_SCAN_FAST_WINDOW,
|
||||||
|
.interval_coded = 0,
|
||||||
|
.window_coded = 0,
|
||||||
|
.timeout = timeout_ms / 10,
|
||||||
|
};
|
||||||
|
|
||||||
|
k_sem_reset(&sem_connected);
|
||||||
|
|
||||||
|
const uint64_t conn_create_start = k_uptime_get();
|
||||||
|
|
||||||
|
err = bt_conn_le_create(&peer, &create_param, BT_LE_CONN_PARAM_DEFAULT, &conn);
|
||||||
|
TEST_ASSERT(err == 0, "Failed starting initiator (err %d)", err);
|
||||||
|
|
||||||
|
err = k_sem_take(&sem_connected, K_MSEC(2 * expected_conn_timeout_ms));
|
||||||
|
TEST_ASSERT(err == 0, "Failed getting connected timeout within %d s (err %d)",
|
||||||
|
2 * expected_conn_timeout_ms, err);
|
||||||
|
|
||||||
|
const uint64_t conn_create_end = k_uptime_get();
|
||||||
|
|
||||||
|
const int64_t time_diff_ms = conn_create_end - conn_create_start;
|
||||||
|
const int64_t diff_to_expected_ms = abs(time_diff_ms - expected_conn_timeout_ms);
|
||||||
|
|
||||||
|
TEST_PRINT("Connection timeout after %d ms", time_diff_ms);
|
||||||
|
TEST_ASSERT(diff_to_expected_ms < 0.1 * expected_conn_timeout_ms,
|
||||||
|
"Connection timeout not within 10%% of expected timeout. "
|
||||||
|
"Actual timeout: %d", time_diff_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_central_connect_timeout(void)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
|
||||||
|
bt_conn_cb_register(&conn_cb);
|
||||||
|
|
||||||
|
/* Initialize Bluetooth */
|
||||||
|
err = bt_enable(NULL);
|
||||||
|
TEST_ASSERT(err == 0, "Can't enable Bluetooth (err %d)", err);
|
||||||
|
|
||||||
|
test_central_connect_timeout_with_timeout(0);
|
||||||
|
test_central_connect_timeout_with_timeout(1000);
|
||||||
|
|
||||||
|
TEST_PASS("Correct timeout");
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct bst_test_instance test_def[] = {
|
||||||
|
{
|
||||||
|
.test_id = "central_connect_timeout",
|
||||||
|
.test_descr = "Verifies that the default connection timeout is used correctly",
|
||||||
|
.test_tick_f = bst_tick,
|
||||||
|
.test_main_f = test_central_connect_timeout
|
||||||
|
},
|
||||||
|
BSTEST_END_MARKER
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct bst_test_list *test_central_install(struct bst_test_list *tests)
|
||||||
|
{
|
||||||
|
return bst_add_tests(tests, test_def);
|
||||||
|
}
|
||||||
|
|
||||||
|
bst_test_install_t test_installers[] = {
|
||||||
|
test_central_install,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
bst_main();
|
||||||
|
return 0;
|
||||||
|
}
|
13
tests/bsim/bluetooth/host/central/tests_scripts/_compile.sh
Executable file
13
tests/bsim/bluetooth/host/central/tests_scripts/_compile.sh
Executable file
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright 2024 Nordic Semiconductor ASA
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
set -eu
|
||||||
|
: "${ZEPHYR_BASE:?ZEPHYR_BASE must be defined}"
|
||||||
|
|
||||||
|
INCR_BUILD=1
|
||||||
|
|
||||||
|
source ${ZEPHYR_BASE}/tests/bsim/compile.source
|
||||||
|
|
||||||
|
app="$(guess_test_relpath)" compile
|
||||||
|
|
||||||
|
wait_for_background_jobs
|
|
@ -0,0 +1,18 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Copyright (c) 2024 Nordic Semiconductor
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
|
||||||
|
source ${ZEPHYR_BASE}/tests/bsim/sh_common.source
|
||||||
|
|
||||||
|
simulation_id="central_connect_timeout"
|
||||||
|
verbosity_level=2
|
||||||
|
|
||||||
|
cd ${BSIM_OUT_PATH}/bin
|
||||||
|
|
||||||
|
Execute ./bs_${BOARD_TS}_tests_bsim_bluetooth_host_central_prj_conf \
|
||||||
|
-v=${verbosity_level} -s=${simulation_id} -d=0 -testid=central_connect_timeout
|
||||||
|
|
||||||
|
Execute ./bs_2G4_phy_v1 -v=${verbosity_level} -s=${simulation_id} \
|
||||||
|
-D=1 -sim_length=60e6 $@
|
||||||
|
|
||||||
|
wait_for_background_jobs
|
|
@ -12,6 +12,7 @@ set -ue
|
||||||
source ${ZEPHYR_BASE}/tests/bsim/compile.source
|
source ${ZEPHYR_BASE}/tests/bsim/compile.source
|
||||||
|
|
||||||
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/adv/compile.sh
|
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/adv/compile.sh
|
||||||
|
app=tests/bsim/bluetooth/host/central compile
|
||||||
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/att/compile.sh
|
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/att/compile.sh
|
||||||
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/gatt/compile.sh
|
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/gatt/compile.sh
|
||||||
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/l2cap/compile.sh
|
${ZEPHYR_BASE}/tests/bsim/bluetooth/host/l2cap/compile.sh
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue