| /* |
| * Copyright (c) 2022 Nordic Semiconductor ASA |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #include <zephyr/kernel.h> |
| #include <zephyr/bluetooth/buf.h> |
| #include "mocks/net_buf.h" |
| #include "mocks/net_buf_expects.h" |
| #include "mocks/buf_help_utils.h" |
| |
| /* |
| * Return value from bt_buf_get_rx() should be NULL |
| * |
| * This is to test the behaviour when memory allocation request fails |
| * |
| * Constraints: |
| * - Use valid buffer type 'BT_BUF_EVT' |
| * - Timeout value is a positive non-zero value |
| * - net_buf_alloc() returns a NULL value |
| * |
| * Expected behaviour: |
| * - net_buf_alloc() to be called with the correct memory allocation pool |
| * and the same timeout value passed to bt_buf_get_rx() |
| * - bt_buf_get_rx() returns NULL |
| */ |
| void test_returns_null_type_bt_buf_evt(void) |
| { |
| struct net_buf *returned_buf; |
| k_timeout_t timeout = Z_TIMEOUT_TICKS(1000); |
| |
| struct net_buf_pool *memory_pool; |
| |
| if ((IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL))) { |
| memory_pool = bt_buf_get_evt_pool(); |
| } else { |
| memory_pool = bt_buf_get_hci_rx_pool(); |
| } |
| |
| net_buf_alloc_fixed_fake.return_val = NULL; |
| |
| returned_buf = bt_buf_get_rx(BT_BUF_EVT, timeout); |
| |
| expect_single_call_net_buf_alloc(memory_pool, &timeout); |
| expect_not_called_net_buf_reserve(); |
| expect_not_called_net_buf_ref(); |
| |
| zassert_is_null(returned_buf, |
| "bt_buf_get_rx() returned non-NULL value while expecting NULL"); |
| } |
| |
| /* |
| * Return value from bt_buf_get_rx() should be NULL |
| * |
| * This is to test the behaviour when memory allocation request fails |
| * |
| * Constraints: |
| * - Use valid buffer type 'BT_BUF_ACL_IN' |
| * - Timeout value is a positive non-zero value |
| * - net_buf_alloc() returns a NULL value |
| * |
| * Expected behaviour: |
| * - net_buf_alloc() to be called with the correct memory allocation pool |
| * and the same timeout value passed to bt_buf_get_rx() |
| * - bt_buf_get_rx() returns NULL |
| */ |
| void test_returns_null_type_bt_buf_acl_in(void) |
| { |
| struct net_buf *returned_buf; |
| k_timeout_t timeout = Z_TIMEOUT_TICKS(1000); |
| |
| struct net_buf_pool *memory_pool; |
| |
| if ((IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL))) { |
| memory_pool = bt_buf_get_acl_in_pool(); |
| } else { |
| memory_pool = bt_buf_get_hci_rx_pool(); |
| } |
| |
| net_buf_alloc_fixed_fake.return_val = NULL; |
| |
| returned_buf = bt_buf_get_rx(BT_BUF_ACL_IN, timeout); |
| |
| expect_single_call_net_buf_alloc(memory_pool, &timeout); |
| expect_not_called_net_buf_reserve(); |
| expect_not_called_net_buf_ref(); |
| |
| zassert_is_null(returned_buf, |
| "bt_buf_get_rx() returned non-NULL value while expecting NULL"); |
| } |
| |
| /* |
| * Return value from bt_buf_get_rx() should be NULL |
| * |
| * This is to test the behaviour when memory allocation request fails |
| * |
| * Constraints: |
| * - Use valid buffer type 'BT_BUF_ISO_IN' |
| * - Timeout value is a positive non-zero value |
| * - net_buf_alloc() returns a NULL value |
| * |
| * Expected behaviour: |
| * - net_buf_alloc() to be called with the correct memory allocation pool |
| * and the same timeout value passed to bt_buf_get_rx() |
| * - bt_buf_get_rx() returns NULL |
| */ |
| void test_returns_null_type_bt_buf_iso_in(void) |
| { |
| struct net_buf *returned_buf; |
| k_timeout_t timeout = Z_TIMEOUT_TICKS(1000); |
| |
| struct net_buf_pool *memory_pool; |
| |
| if ((IS_ENABLED(CONFIG_BT_ISO_UNICAST) || IS_ENABLED(CONFIG_BT_ISO_SYNC_RECEIVER))) { |
| memory_pool = bt_buf_get_iso_rx_pool(); |
| } else { |
| if ((IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL))) { |
| memory_pool = bt_buf_get_acl_in_pool(); |
| } else { |
| memory_pool = bt_buf_get_hci_rx_pool(); |
| } |
| } |
| |
| net_buf_alloc_fixed_fake.return_val = NULL; |
| |
| returned_buf = bt_buf_get_rx(BT_BUF_ISO_IN, timeout); |
| |
| expect_single_call_net_buf_alloc(memory_pool, &timeout); |
| expect_not_called_net_buf_reserve(); |
| expect_not_called_net_buf_ref(); |
| |
| zassert_is_null(returned_buf, |
| "bt_buf_get_rx() returned non-NULL value while expecting NULL"); |
| } |
| |
| /* |
| * Return value from bt_buf_get_rx() shouldn't be NULL |
| * |
| * Constraints: |
| * - Use valid buffer type 'BT_BUF_EVT' |
| * - Timeout value is a positive non-zero value |
| * - net_buf_alloc() return a not NULL value |
| * |
| * Expected behaviour: |
| * - net_buf_alloc() to be called with the correct memory allocation pool |
| * and the same timeout value passed to bt_buf_get_rx() |
| * - bt_buf_get_rx() returns the same value returned by net_buf_alloc_fixed() |
| * - Return buffer matches the buffer type requested |
| */ |
| void test_returns_not_null_type_bt_buf_evt(void) |
| { |
| static struct net_buf expected_buf; |
| struct net_buf *returned_buf; |
| uint8_t returned_buffer_type; |
| k_timeout_t timeout = Z_TIMEOUT_TICKS(1000); |
| |
| struct net_buf_pool *memory_pool; |
| |
| if ((IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL))) { |
| memory_pool = bt_buf_get_evt_pool(); |
| } else { |
| memory_pool = bt_buf_get_hci_rx_pool(); |
| } |
| |
| net_buf_alloc_fixed_fake.return_val = &expected_buf; |
| |
| returned_buf = bt_buf_get_rx(BT_BUF_EVT, timeout); |
| |
| expect_single_call_net_buf_alloc(memory_pool, &timeout); |
| expect_single_call_net_buf_reserve(&expected_buf); |
| expect_not_called_net_buf_ref(); |
| |
| zassert_equal(returned_buf, &expected_buf, |
| "bt_buf_get_rx() returned incorrect buffer pointer value"); |
| |
| returned_buffer_type = bt_buf_get_type(returned_buf); |
| zassert_equal(returned_buffer_type, BT_BUF_EVT, |
| "bt_buf_get_rx() returned incorrect buffer type %u, expected %u (%s)", |
| returned_buffer_type, BT_BUF_EVT, STRINGIFY(BT_BUF_EVT)); |
| } |
| |
| /* |
| * Return value from bt_buf_get_rx() shouldn't be NULL |
| * |
| * Constraints: |
| * - Use valid buffer type 'BT_BUF_ACL_IN' |
| * - Timeout value is a positive non-zero value |
| * - net_buf_alloc() return a not NULL value |
| * |
| * Expected behaviour: |
| * - net_buf_alloc() to be called with the correct memory allocation pool |
| * and the same timeout value passed to bt_buf_get_rx() |
| * - bt_buf_get_rx() returns the same value returned by net_buf_alloc_fixed() |
| * - Return buffer matches the buffer type requested |
| */ |
| void test_returns_not_null_type_bt_buf_acl_in(void) |
| { |
| static struct net_buf expected_buf; |
| struct net_buf *returned_buf; |
| uint8_t returned_buffer_type; |
| k_timeout_t timeout = Z_TIMEOUT_TICKS(1000); |
| |
| struct net_buf_pool *memory_pool; |
| |
| if ((IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL))) { |
| memory_pool = bt_buf_get_acl_in_pool(); |
| } else { |
| memory_pool = bt_buf_get_hci_rx_pool(); |
| } |
| |
| net_buf_alloc_fixed_fake.return_val = &expected_buf; |
| |
| returned_buf = bt_buf_get_rx(BT_BUF_ACL_IN, timeout); |
| |
| expect_single_call_net_buf_alloc(memory_pool, &timeout); |
| expect_single_call_net_buf_reserve(&expected_buf); |
| expect_not_called_net_buf_ref(); |
| |
| zassert_equal(returned_buf, &expected_buf, |
| "bt_buf_get_rx() returned incorrect buffer pointer value"); |
| |
| returned_buffer_type = bt_buf_get_type(returned_buf); |
| zassert_equal(returned_buffer_type, BT_BUF_ACL_IN, |
| "bt_buf_get_rx() returned incorrect buffer type %u, expected %u (%s)", |
| returned_buffer_type, BT_BUF_ACL_IN, STRINGIFY(BT_BUF_ACL_IN)); |
| } |
| |
| /* |
| * Return value from bt_buf_get_rx() shouldn't be NULL |
| * |
| * Constraints: |
| * - Use valid buffer type 'BT_BUF_ISO_IN' |
| * - Timeout value is a positive non-zero value |
| * - net_buf_alloc() return a not NULL value |
| * |
| * Expected behaviour: |
| * - net_buf_alloc() to be called with the correct memory allocation pool |
| * and the same timeout value passed to bt_buf_get_rx() |
| * - bt_buf_get_rx() returns the same value returned by net_buf_alloc_fixed() |
| * - Return buffer matches the buffer type requested |
| */ |
| void test_returns_not_null_type_bt_buf_iso_in(void) |
| { |
| static struct net_buf expected_buf; |
| struct net_buf *returned_buf; |
| uint8_t returned_buffer_type; |
| k_timeout_t timeout = Z_TIMEOUT_TICKS(1000); |
| |
| struct net_buf_pool *memory_pool; |
| |
| if ((IS_ENABLED(CONFIG_BT_ISO_UNICAST) || IS_ENABLED(CONFIG_BT_ISO_SYNC_RECEIVER))) { |
| memory_pool = bt_buf_get_iso_rx_pool(); |
| } else { |
| if ((IS_ENABLED(CONFIG_BT_HCI_ACL_FLOW_CONTROL))) { |
| memory_pool = bt_buf_get_acl_in_pool(); |
| } else { |
| memory_pool = bt_buf_get_hci_rx_pool(); |
| } |
| } |
| |
| net_buf_alloc_fixed_fake.return_val = &expected_buf; |
| |
| returned_buf = bt_buf_get_rx(BT_BUF_ISO_IN, timeout); |
| |
| expect_single_call_net_buf_alloc(memory_pool, &timeout); |
| expect_single_call_net_buf_reserve(&expected_buf); |
| expect_not_called_net_buf_ref(); |
| |
| zassert_equal(returned_buf, &expected_buf, |
| "bt_buf_get_rx() returned incorrect buffer pointer value"); |
| |
| returned_buffer_type = bt_buf_get_type(returned_buf); |
| zassert_equal(returned_buffer_type, BT_BUF_ISO_IN, |
| "bt_buf_get_rx() returned incorrect buffer type %u, expected %u (%s)", |
| returned_buffer_type, BT_BUF_ISO_IN, STRINGIFY(BT_BUF_ISO_IN)); |
| } |
| |
| /* Setup test variables */ |
| static void unit_test_setup(void) |
| { |
| /* Register resets */ |
| NET_BUF_FFF_FAKES_LIST(RESET_FAKE); |
| } |
| |
| void test_main(void) |
| { |
| ztest_test_suite( |
| test_bt_buf_get_rx_returns_null, |
| ztest_unit_test_setup(test_returns_null_type_bt_buf_evt, unit_test_setup), |
| ztest_unit_test_setup(test_returns_null_type_bt_buf_acl_in, unit_test_setup), |
| ztest_unit_test_setup(test_returns_null_type_bt_buf_iso_in, unit_test_setup) |
| ); |
| |
| ztest_run_test_suite(test_bt_buf_get_rx_returns_null); |
| |
| ztest_test_suite( |
| test_bt_buf_get_rx_returns_not_null, |
| ztest_unit_test_setup(test_returns_not_null_type_bt_buf_evt, unit_test_setup), |
| ztest_unit_test_setup(test_returns_not_null_type_bt_buf_acl_in, unit_test_setup), |
| ztest_unit_test_setup(test_returns_not_null_type_bt_buf_iso_in, unit_test_setup) |
| ); |
| |
| ztest_run_test_suite(test_bt_buf_get_rx_returns_not_null); |
| |
| uint32_t state; |
| |
| ztest_run_registered_test_suites(&state); |
| } |