blob: 1efca19032a0ecb8ec975c69c442b202fc6a2c70 [file] [log] [blame]
/*
* 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 <zephyr/bluetooth/hci.h>
#include <zephyr/kernel.h>
#include <zephyr/ztest.h>
#include <host/hci_core.h>
#include <host/id.h>
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);
}