blob: e539730f964176a51922e53f06af900fbce864eb [file] [log] [blame]
/*
* Copyright (c) 2020 Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <stddef.h>
#include <zephyr/ztest.h>
#include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/bluetooth/hci.h>
#include <zephyr/sys/byteorder.h>
#include <host/hci_core.h>
#include <bt_common.h>
#include "common.h"
/* Macros delivering common values for unit tests */
#define CTE_LEN_VALID (BT_HCI_LE_CTE_LEN_MIN + 5)
#define CTE_LEN_INVALID (BT_HCI_LE_CTE_LEN_MAX + 1)
#define CTE_COUNT_VALID (BT_HCI_LE_CTE_COUNT_MIN + 5)
#define CTE_COUNT_INVALID (BT_HCI_LE_CTE_COUNT_MAX + 1)
#define ADV_HANDLE_INVALID (CONFIG_BT_CTLR_ADV_AUX_SET + 1)
#define CTE_TYPE_INVALID 0xFF
#define ANT_SW_PATTERN_LEN_INVALID \
(CONFIG_BT_CTLR_DF_MAX_ANT_SW_PATTERN_LEN + 1)
/* Antenna identifiers */
static uint8_t g_ant_ids[] = { 0x1, 0x2, 0x3, 0x4, 0x5 };
/* @brief Function sends HCI_LE_Set_Connectionless_CTE_Transmit_Parameters
* to controller.
*
* @param[in]adv_handle Handle of advertising set.
* @param[in]cte_len Length of CTE in 8us units.
* @param[in]cte_type Type of CTE to be used for transmission.
* @param[in]cte_count Number of CTE that should be transmitted
* during each periodic advertising
* interval.
* @param[in]num_ant_ids Number of antenna IDs in switching
* pattern. May be zero if CTE type is
* AoA.
* @param[in]ant_ids Array of antenna IDs in a switching
* pattern. May be NULL if CTE type is AoA.
*
* @return Zero if success, non-zero value in case of failure.
*/
int send_set_cl_cte_tx_params(uint8_t adv_handle, uint8_t cte_len,
uint8_t cte_type, uint8_t cte_count,
uint8_t switch_pattern_len,
uint8_t *ant_ids)
{
struct bt_hci_cp_le_set_cl_cte_tx_params *cp;
struct net_buf *buf;
buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
sizeof(*cp) + switch_pattern_len);
zassert_not_null(buf, "Failed to create HCI cmd object");
cp = net_buf_add(buf, sizeof(*cp));
cp->handle = adv_handle;
cp->cte_len = cte_len;
cp->cte_type = cte_type;
cp->cte_count = cte_count;
uint8_t *dest_ant_ids = net_buf_add(buf, switch_pattern_len);
if (switch_pattern_len > 0) {
memcpy(dest_ant_ids, ant_ids, switch_pattern_len);
}
cp->switch_pattern_len = switch_pattern_len;
return bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
buf, NULL);
}
ZTEST(test_set_cl_cte_tx_param, test_set_cl_cte_tx_params_with_correct_aod_2us)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
BT_HCI_LE_AOD_CTE_2US,
CTE_COUNT_VALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, 0, "Set AoD 2us CTE parameters failed");
}
ZTEST(test_set_cl_cte_tx_param, test_set_cl_cte_tx_params_with_correct_aod_1us)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
BT_HCI_LE_AOD_CTE_1US,
CTE_COUNT_VALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, 0, "Set AoD 1us CTE parameters failed");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_correct_aoa)
{
int err;
err = send_set_cl_cte_tx_params(ADV_HANDLE_INVALID,
CTE_LEN_VALID,
BT_HCI_LE_AOA_CTE,
CTE_COUNT_VALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, -EIO, "Set AoA CTE parameters failed");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_correct_aoa_without_ant_pattern)
{
int err;
err = send_set_cl_cte_tx_params(ADV_HANDLE_INVALID,
CTE_LEN_VALID,
BT_HCI_LE_AOA_CTE,
CTE_COUNT_VALID,
0,
NULL);
zassert_equal(err, -EIO, "Set AoA CTE parameters failed");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_wrong_adv_handle)
{
int err;
err = send_set_cl_cte_tx_params(ADV_HANDLE_INVALID,
CTE_LEN_VALID,
BT_HCI_LE_AOD_CTE_2US,
CTE_COUNT_VALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, -EIO,
"Unexpected error value for invalid adv handle");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_invalid_cte_len)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_INVALID,
BT_HCI_LE_AOD_CTE_2US,
CTE_COUNT_VALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, -EIO,
"Unexpected error value for invalid CTE length");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_invalid_cte_type)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
CTE_TYPE_INVALID,
CTE_COUNT_VALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, -EIO,
"Unexpected error value for invalid CTE type");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_invalid_cte_count)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
BT_HCI_LE_AOD_CTE_2US,
CTE_COUNT_INVALID,
ARRAY_SIZE(g_ant_ids),
g_ant_ids);
zassert_equal(err, -EIO,
"Unexpected error value for invalid CTE count");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_aod_2us_invalid_pattern_len)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
BT_HCI_LE_AOD_CTE_2US,
CTE_COUNT_VALID,
ANT_SW_PATTERN_LEN_INVALID,
g_ant_ids);
zassert_equal(err, -EIO,
"Unexpected error value for invalid switch pattern len");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_aod_1us_invalid_pattern_len)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
BT_HCI_LE_AOD_CTE_1US,
CTE_COUNT_VALID,
ANT_SW_PATTERN_LEN_INVALID,
g_ant_ids);
zassert_equal(err, -EIO,
"Unexpected error value for invalid switch pattern len");
}
ZTEST(test_set_cl_cte_tx_param, test_set_ct_cte_tx_params_aoa_invalid_pattern_len)
{
int err;
err = send_set_cl_cte_tx_params(g_adv->handle,
CTE_LEN_VALID,
BT_HCI_LE_AOA_CTE,
CTE_COUNT_VALID,
ANT_SW_PATTERN_LEN_INVALID,
g_ant_ids);
zassert_equal(err, 0, "Unexpected error value for AoA");
}
static void *common_adv_set_setup(void)
{
ut_bt_setup();
common_create_adv_set();
return NULL;
}
static void common_adv_set_teardown(void *data)
{
common_delete_adv_set();
ut_bt_teardown(data);
}
ZTEST_SUITE(test_set_cl_cte_tx_param, NULL, common_adv_set_setup, NULL, NULL,
common_adv_set_teardown);