/* * Copyright (c) 2022 Nordic Semiconductor ASA * * SPDX-License-Identifier: Apache-2.0 */ #include "mocks/adv.h" #include "mocks/adv_expects.h" #include "mocks/hci_core.h" #include "mocks/hci_core_expects.h" #include "testing_common_defs.h" #include #include #include #include #include ZTEST_SUITE(bt_id_delete_invalid_inputs, NULL, NULL, NULL, NULL, NULL); /* * Test deleting default ID which shouldn't be allowed * * Constraints: * - BT_ID_DEFAULT value is used for the ID * * Expected behaviour: * - '-EINVAL' error code is returned representing invalid values were used. */ ZTEST(bt_id_delete_invalid_inputs, test_deleting_default_id) { int err; err = bt_id_delete(BT_ID_DEFAULT); zassert_true(err == -EINVAL, "Unexpected error code '%d' was returned", err); } /* * Test deleting ID value that is equal to bt_dev.id_count * * Constraints: * - bt_dev.id_count is greater than 0 * - ID value used is equal to bt_dev.id_count * * Expected behaviour: * - '-EINVAL' error code is returned representing invalid values were used. */ ZTEST(bt_id_delete_invalid_inputs, test_deleting_id_value_equal_to_dev_id_count) { int err; bt_dev.id_count = 1; err = bt_id_delete(bt_dev.id_count); zassert_true(err == -EINVAL, "Unexpected error code '%d' was returned", err); } /* * Test deleting ID that corresponds to a zero-filled item * * Constraints: * - bt_dev.id_count is greater than 1 * - ID value used corresponds to a zero-filled item * * Expected behaviour: * - '-EALREADY' error code is returned representing invalid values were used. */ ZTEST(bt_id_delete_invalid_inputs, test_deleting_id_with_zero_filled_item) { int err; bt_dev.id_count = 2; bt_addr_le_copy(&bt_dev.id_addr[0], BT_STATIC_RANDOM_LE_ADDR_1); bt_addr_le_copy(&bt_dev.id_addr[1], BT_ADDR_LE_ANY); err = bt_id_delete(1); zassert_true(err == -EALREADY, "Unexpected error code '%d' was returned", err); } static void bt_le_ext_adv_foreach_custom_fake(void (*func)(struct bt_le_ext_adv *adv, void *data), void *data) { struct bt_le_ext_adv adv_params = {0}; __ASSERT_NO_MSG(func != NULL); __ASSERT_NO_MSG(data != NULL); if (IS_ENABLED(CONFIG_BT_EXT_ADV)) { /* Only check if the ID is in use, as the advertiser can be * started and stopped without reconfiguring parameters. */ adv_params.id = bt_dev.id_count - 1; } else { atomic_set_bit(adv_params.flags, BT_ADV_ENABLED); adv_params.id = bt_dev.id_count - 1; } func(&adv_params, data); } /* * Test deleting an ID if the 'CONFIG_BT_BROADCASTER' is enabled and the same ID is already * in use with the advertising data. * * Constraints: * - ID value used corresponds to a currently used ID in advertising * - 'CONFIG_BT_BROADCASTER' is enabled * * Expected behaviour: * - '-EBUSY' error code is returned representing invalid values were used. */ ZTEST(bt_id_delete_invalid_inputs, test_deleting_id_used_in_advertising) { int err; Z_TEST_SKIP_IFNDEF(CONFIG_BT_BROADCASTER); bt_dev.id_count = 2; bt_addr_le_copy(&bt_dev.id_addr[0], BT_STATIC_RANDOM_LE_ADDR_1); bt_addr_le_copy(&bt_dev.id_addr[1], BT_STATIC_RANDOM_LE_ADDR_2); /* When bt_le_ext_adv_foreach() is called, this callback will be triggered and causes * adv_id_check_func() to set the advertising enable flag to true. */ bt_le_ext_adv_foreach_fake.custom_fake = bt_le_ext_adv_foreach_custom_fake; err = bt_id_delete(bt_dev.id_count - 1); expect_single_call_bt_le_ext_adv_foreach(); zassert_true(err == -EBUSY, "Unexpected error code '%d' was returned", err); } /* * Test returning error when bt_unpair() fails * * Constraints: * - 'CONFIG_BT_CONN' is enabled * - bt_unpair() fails and returns a negative error code * * Expected behaviour: * - '-EALREADY' error code is returned representing invalid values were used. */ ZTEST(bt_id_delete_invalid_inputs, test_bt_unpair_fails) { int err; uint8_t id; Z_TEST_SKIP_IFNDEF(CONFIG_BT_CONN); bt_dev.id_count = 2; id = bt_dev.id_count - 1; bt_addr_le_copy(&bt_dev.id_addr[0], BT_STATIC_RANDOM_LE_ADDR_1); bt_addr_le_copy(&bt_dev.id_addr[1], BT_STATIC_RANDOM_LE_ADDR_2); bt_unpair_fake.return_val = -1; err = bt_id_delete(id); expect_single_call_bt_unpair(id, NULL); zassert_true(err < 0, "Unexpected error code '%d' was returned", err); }