diff --git a/tests/bluetooth/buf/CMakeLists.txt b/tests/bluetooth/buf/CMakeLists.txt new file mode 100644 index 00000000000..3da24b0b551 --- /dev/null +++ b/tests/bluetooth/buf/CMakeLists.txt @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: Apache-2.0 + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) +project(buf) + +target_sources(app PRIVATE src/main.c) diff --git a/tests/bluetooth/buf/prj.conf b/tests/bluetooth/buf/prj.conf new file mode 100644 index 00000000000..697529ffb9d --- /dev/null +++ b/tests/bluetooth/buf/prj.conf @@ -0,0 +1,10 @@ +CONFIG_TEST=y +CONFIG_ZTEST=y + +CONFIG_BT=y +CONFIG_BT_CTLR=n +CONFIG_BT_H4=n + +# Needed to enable and test the iso rx pool +CONFIG_BT_OBSERVER=y +CONFIG_BT_ISO_SYNC_RECEIVER=y diff --git a/tests/bluetooth/buf/src/main.c b/tests/bluetooth/buf/src/main.c new file mode 100644 index 00000000000..36b57a0e3f9 --- /dev/null +++ b/tests/bluetooth/buf/src/main.c @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2024 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include +#include +#include + +#include +#include +#include +#include +#include + +static enum bt_buf_type freed_buf_type; +static K_SEM_DEFINE(rx_sem, 0, 1); + +void bt_buf_rx_freed_cb(enum bt_buf_type type) +{ + freed_buf_type = type; + k_sem_give(&rx_sem); +} + +ZTEST_SUITE(test_buf_data_api, NULL, NULL, NULL, NULL, NULL); + +ZTEST(test_buf_data_api, test_buf_freed_cb) +{ + struct net_buf *buf; + int err; + + bt_buf_rx_freed_cb_set(bt_buf_rx_freed_cb); + + /* Test that the callback is called for the BT_BUF_EVT type */ + buf = bt_buf_get_rx(BT_BUF_EVT, K_NO_WAIT); + zassert_not_null(buf, "Failed to get event buffer"); + + net_buf_unref(buf); + /* The freed buf cb is called from net_buf_unref, therefore the semaphore should + * already by given. + */ + err = k_sem_take(&rx_sem, K_NO_WAIT); + zassert_equal(err, 0, "Timeout while waiting for event buffer to be freed"); + zassert_equal(BT_BUF_EVT, BT_BUF_EVT & freed_buf_type, "Event buffer wasn't freed"); + + /* Test that the callback is called for the BT_BUF_ACL_IN type */ + buf = bt_buf_get_rx(BT_BUF_ACL_IN, K_NO_WAIT); + zassert_not_null(buf, "Failed to get ACL buffer"); + + net_buf_unref(buf); + /* The freed buf cb is called from net_buf_unref, therefore the semaphore should + * already by given. + */ + err = k_sem_take(&rx_sem, K_NO_WAIT); + zassert_equal(err, 0, "Timeout while waiting for ACL buffer to be freed"); + zassert_equal(BT_BUF_ACL_IN, BT_BUF_ACL_IN & freed_buf_type, "ACL buffer wasn't freed"); + + /* Test that the callback is called for the BT_BUF_ISO_IN type */ + buf = bt_buf_get_rx(BT_BUF_ISO_IN, K_NO_WAIT); + zassert_not_null(buf, "Failed to get ISO buffer"); + + net_buf_unref(buf); + /* The freed buf cb is called from net_buf_unref, therefore the semaphore should + * already by given. + */ + err = k_sem_take(&rx_sem, K_NO_WAIT); + zassert_equal(err, 0, "Timeout while waiting for ISO buffer to be freed"); + zassert_equal(BT_BUF_ISO_IN, BT_BUF_ISO_IN & freed_buf_type, "ISO buffer wasn't freed"); +} diff --git a/tests/bluetooth/buf/testcase.yaml b/tests/bluetooth/buf/testcase.yaml new file mode 100644 index 00000000000..418d357d4fb --- /dev/null +++ b/tests/bluetooth/buf/testcase.yaml @@ -0,0 +1,30 @@ +common: + tags: + - bluetooth + - host + +tests: + bluetooth.buf: + platform_allow: + - native_sim + - native_sim/native/64 + integration_platforms: + - native_sim + extra_configs: + - CONFIG_BT_HCI_ACL_FLOW_CONTROL=y + bluetooth.buf.no_acl_flow_control: + platform_allow: + - native_sim + - native_sim/native/64 + integration_platforms: + - native_sim + extra_configs: + - CONFIG_BT_HCI_ACL_FLOW_CONTROL=n + bluetooth.buf.hci_raw: + platform_allow: + - native_sim + - native_sim/native/64 + integration_platforms: + - native_sim + extra_configs: + - CONFIG_BT_HCI_RAW=y