Skip to content

Commit d06b805

Browse files
ppryga-nordicnashif
authored andcommitted
tests: Bluetooth: df: add UT for enable CTE for periodic advertising
Adds unit tests for verification of enable/disable CTE for periodic advertiging in controller. Signed-off-by: Piotr Pryga <[email protected]>
1 parent e423349 commit d06b805

File tree

5 files changed

+345
-0
lines changed

5 files changed

+345
-0
lines changed

tests/bluetooth/df/src/common.c

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,20 @@ struct bt_le_adv_param g_param =
2323
BT_GAP_ADV_FAST_INT_MAX_2,
2424
NULL);
2525

26+
/* Example cte length value in allowed range, no particular meaning */
27+
uint8_t g_cte_len = 0x14U;
28+
2629
static struct bt_le_per_adv_param per_param = {
2730
.interval_min = BT_GAP_ADV_SLOW_INT_MIN,
2831
.interval_max = BT_GAP_ADV_SLOW_INT_MAX,
2932
.options = BT_LE_ADV_OPT_USE_TX_POWER,
3033
};
3134

35+
static struct bt_le_ext_adv_start_param ext_adv_start_param = {
36+
.timeout = 0,
37+
.num_events = 0,
38+
};
39+
3240
void common_setup(void)
3341
{
3442
int err;
@@ -53,3 +61,62 @@ void common_delete_adv_set(void)
5361
err = bt_le_ext_adv_delete(g_adv);
5462
zassert_equal(err, 0, "Failed to delete advertiser set");
5563
}
64+
65+
void common_set_cl_cte_tx_params(void)
66+
{
67+
uint8_t ant_ids[] = { 0x1, 0x2, 0x3, 0x4, 0x5};
68+
69+
struct bt_hci_cp_le_set_cl_cte_tx_params *cp;
70+
uint8_t *dest_ant_ids;
71+
struct net_buf *buf;
72+
int err;
73+
74+
buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
75+
sizeof(*cp) + ARRAY_SIZE(ant_ids));
76+
zassert_not_null(buf, "Failed to create HCI cmd object");
77+
78+
cp = net_buf_add(buf, sizeof(*cp));
79+
cp->handle = g_adv->handle;
80+
cp->cte_len = g_cte_len;
81+
cp->cte_type = BT_HCI_LE_AOD_CTE_2US;
82+
cp->cte_count = 5;
83+
84+
dest_ant_ids = net_buf_add(buf, ARRAY_SIZE(ant_ids));
85+
memcpy(dest_ant_ids, ant_ids, ARRAY_SIZE(ant_ids));
86+
87+
cp->switch_pattern_len = ARRAY_SIZE(ant_ids);
88+
89+
err = bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_CL_CTE_TX_PARAMS,
90+
buf, NULL);
91+
zassert_equal(err, 0, "Failed to set CTE parameters");
92+
}
93+
94+
void common_set_adv_params(void)
95+
{
96+
int err;
97+
98+
err = bt_le_per_adv_set_param(g_adv, &per_param);
99+
zassert_equal(err, 0, "Failed to set periodic advertising params");
100+
}
101+
102+
void common_per_adv_enable(void)
103+
{
104+
int err;
105+
106+
err = bt_le_per_adv_start(g_adv);
107+
zassert_equal(err, 0, "Failed to start periodic advertising");
108+
109+
err = bt_le_ext_adv_start(g_adv, &ext_adv_start_param);
110+
zassert_equal(err, 0, "Failed to start extended advertising");
111+
}
112+
113+
void common_per_adv_disable(void)
114+
{
115+
int err;
116+
117+
err = bt_le_per_adv_stop(g_adv);
118+
zassert_equal(err, 0, "Failed to stop periodic advertising");
119+
120+
err = bt_le_ext_adv_stop(g_adv);
121+
zassert_equal(err, 0, "Failed to stop extended advertising");
122+
}

tests/bluetooth/df/src/common.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,14 @@
66

77
extern struct bt_le_ext_adv *g_adv;
88
extern struct bt_le_adv_param g_param;
9+
extern uint8_t g_cte_len;
910

1011
void common_setup(void);
1112
void common_create_adv_set(void);
1213
void common_delete_adv_set(void);
14+
void common_delete_adv_set(void);
15+
void common_set_cte_params(void);
16+
void common_set_cl_cte_tx_params(void);
17+
void common_set_adv_params(void);
18+
void common_per_adv_enable(void);
19+
void common_per_adv_disable(void);

tests/bluetooth/df/src/main.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "common.h"
1010
#include "test_set_cl_cte_tx_params.h"
11+
#include "test_set_cl_cte_tx_enable.h"
1112

1213

1314
/*test case main entry*/
@@ -16,4 +17,6 @@ void test_main(void)
1617
common_setup();
1718
common_create_adv_set();
1819
run_set_cl_cte_tx_params_tests();
20+
common_delete_adv_set();
21+
run_set_cl_cte_tx_enable_tests();
1922
}
Lines changed: 260 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,260 @@
1+
/*
2+
* Copyright (c) 2021 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <zephyr.h>
8+
#include <stddef.h>
9+
#include <ztest.h>
10+
11+
#include <bluetooth/bluetooth.h>
12+
#include <bluetooth/hci.h>
13+
#include <sys/byteorder.h>
14+
#include <host/hci_core.h>
15+
16+
#include "common.h"
17+
#include "test_set_cl_cte_tx_enable.h"
18+
19+
/* Macros delivering common values for unit tests */
20+
#define ADV_HANDLE_INVALID (CONFIG_BT_CTLR_ADV_AUX_SET + 1)
21+
22+
/* @brief Function sends HCI_LE_Set_Connectionless_CTE_Transmit_Enable
23+
* to controller.
24+
*
25+
* @param[in]adv_handle Handle of advertising set.
26+
* @param[in]adv_flags Flags related with advertising set.
27+
* @param[in] enable Enable or disable CTE TX
28+
*
29+
* @return Zero if success, non-zero value in case of failure.
30+
*/
31+
int send_set_cl_cte_tx_enable(uint8_t adv_handle, atomic_t *adv_flags,
32+
bool enable)
33+
{
34+
struct bt_hci_cp_le_set_cl_cte_tx_enable *cp;
35+
struct bt_hci_cmd_state_set state;
36+
struct net_buf *buf;
37+
38+
buf = bt_hci_cmd_create(BT_HCI_OP_LE_SET_CL_CTE_TX_ENABLE, sizeof(*cp));
39+
if (!buf) {
40+
return -ENOBUFS;
41+
}
42+
43+
cp = net_buf_add(buf, sizeof(*cp));
44+
(void)memset(cp, 0, sizeof(*cp));
45+
46+
cp->handle = adv_handle;
47+
cp->cte_enable = enable ? 1 : 0;
48+
49+
bt_hci_cmd_state_set_init(&state, adv_flags, BT_PER_ADV_CTE_ENABLED,
50+
enable);
51+
bt_hci_cmd_data_state_set(buf, &state);
52+
53+
return bt_hci_cmd_send_sync(BT_HCI_OP_LE_SET_CL_CTE_TX_ENABLE,
54+
buf, NULL);
55+
}
56+
57+
void test_set_cl_cte_tx_enable_invalid_adv_set_handle(void)
58+
{
59+
int err;
60+
61+
err = send_set_cl_cte_tx_enable(ADV_HANDLE_INVALID, g_adv->flags, true);
62+
zassert_equal(err, -EIO, "Unexpected error value for enable CTE with "
63+
"wrong advertising set handle");
64+
}
65+
66+
void test_set_cl_cte_tx_enable_cte_params_not_set(void)
67+
{
68+
int err;
69+
70+
/* setup */
71+
common_create_adv_set();
72+
73+
/* test logic */
74+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
75+
zassert_equal(err, -EIO, "Unexpected error value for enable CTE before "
76+
"CTE params set");
77+
78+
/* clean up */
79+
common_delete_adv_set();
80+
}
81+
82+
void test_set_cl_cte_tx_enable_per_adv_coded_phy(void)
83+
{
84+
int err;
85+
86+
/* setup */
87+
g_param.options = g_param.options | BT_LE_ADV_OPT_CODED;
88+
89+
common_create_adv_set();
90+
common_set_cl_cte_tx_params();
91+
92+
/* test logic */
93+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
94+
zassert_equal(err, -EIO, "Unexpected error value for enable CTE for "
95+
"coded PHY");
96+
97+
/* clean up */
98+
common_delete_adv_set();
99+
100+
g_param.options = g_param.options & (~BT_LE_ADV_OPT_CODED);
101+
}
102+
103+
void test_set_cl_cte_tx_enable(void)
104+
{
105+
int err;
106+
107+
/* setup */
108+
common_create_adv_set();
109+
common_set_cl_cte_tx_params();
110+
common_set_adv_params();
111+
112+
/* test logic */
113+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
114+
zassert_equal(err, 0, "Unexpected error value for enable CTE");
115+
116+
/* clean up */
117+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
118+
zassert_equal(err, 0, "Unexpected error value for disable CTE ");
119+
120+
common_delete_adv_set();
121+
}
122+
123+
void test_set_cl_cte_tx_enable_after_per_adv_enabled(void)
124+
{
125+
int err;
126+
127+
/* setup */
128+
common_create_adv_set();
129+
common_set_cl_cte_tx_params();
130+
common_set_adv_params();
131+
common_per_adv_enable();
132+
133+
/* test logic */
134+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
135+
zassert_equal(err, 0, "Unexpected error value for enable CTE after"
136+
" per. adv. is enabled");
137+
138+
/* clean up */
139+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
140+
zassert_equal(err, 0, "Unexpected error value for disable CTE ");
141+
142+
common_per_adv_disable();
143+
common_delete_adv_set();
144+
}
145+
146+
void test_set_cl_cte_tx_disable_when_no_CTE_enabled(void)
147+
{
148+
int err;
149+
150+
/* setup */
151+
common_create_adv_set();
152+
153+
/* test logic */
154+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
155+
zassert_equal(err, -EIO, "Unexpected error value for disable CTE "
156+
"before CTE enable");
157+
158+
/* clean up */
159+
common_delete_adv_set();
160+
}
161+
162+
void test_set_cl_cte_tx_disable_before_per_adv_enable(void)
163+
{
164+
int err;
165+
166+
/* setup */
167+
common_create_adv_set();
168+
common_set_cl_cte_tx_params();
169+
common_set_adv_params();
170+
171+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
172+
zassert_equal(err, 0, "Unexpected error value for enable");
173+
174+
/* test logic */
175+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
176+
zassert_equal(err, 0, "Unexpected error value for disable CTE ");
177+
178+
/* clean up */
179+
common_delete_adv_set();
180+
}
181+
182+
void test_set_cl_cte_tx_disable_during_per_adv_enable(void)
183+
{
184+
int err;
185+
186+
/* setup */
187+
common_create_adv_set();
188+
common_set_cl_cte_tx_params();
189+
common_set_adv_params();
190+
191+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
192+
zassert_equal(err, 0, "Unexpected error value for enable");
193+
194+
common_per_adv_enable();
195+
196+
/* test logic */
197+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
198+
zassert_equal(err, 0, "Unexpected error value for disable CTE ");
199+
200+
/* clean up */
201+
common_per_adv_disable();
202+
common_delete_adv_set();
203+
}
204+
205+
void test_set_cl_cte_tx_enable_and_update_cte_params(void)
206+
{
207+
uint8_t cte_len_prev;
208+
int err;
209+
210+
/* setup */
211+
common_create_adv_set();
212+
common_set_cl_cte_tx_params();
213+
common_set_adv_params();
214+
215+
printk("en cte\n");
216+
/* test logic */
217+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
218+
zassert_equal(err, 0, "Unexpected error value for enable CTE after"
219+
" per. adv. is enabled");
220+
221+
printk("en adv\n");
222+
common_per_adv_enable();
223+
224+
printk("disable cte\n");
225+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
226+
zassert_equal(err, 0, "Unexpected error value for disable CTE ");
227+
228+
printk("params to update\n");
229+
cte_len_prev = g_cte_len;
230+
g_cte_len = 0x5U;
231+
common_set_cl_cte_tx_params();
232+
233+
printk("params updated\n");
234+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, true);
235+
zassert_equal(err, 0, "Unexpected error value for enable CTE after"
236+
" per. adv. is enabled");
237+
238+
printk("cleanup\n");
239+
/* clean up */
240+
err = send_set_cl_cte_tx_enable(g_adv->handle, g_adv->flags, false);
241+
zassert_equal(err, 0, "Unexpected error value for disable CTE ");
242+
243+
g_cte_len = cte_len_prev;
244+
common_per_adv_disable();
245+
common_delete_adv_set();
246+
}
247+
248+
void run_set_cl_cte_tx_enable_tests(void)
249+
{
250+
ztest_test_suite(test_hci_df_info,
251+
ztest_unit_test(test_set_cl_cte_tx_enable_invalid_adv_set_handle),
252+
ztest_unit_test(test_set_cl_cte_tx_enable_cte_params_not_set),
253+
ztest_unit_test(test_set_cl_cte_tx_enable_per_adv_coded_phy),
254+
ztest_unit_test(test_set_cl_cte_tx_enable),
255+
ztest_unit_test(test_set_cl_cte_tx_enable_after_per_adv_enabled),
256+
ztest_unit_test(test_set_cl_cte_tx_disable_before_per_adv_enable),
257+
ztest_unit_test(test_set_cl_cte_tx_enable_and_update_cte_params),
258+
ztest_unit_test(test_set_cl_cte_tx_disable_during_per_adv_enable));
259+
ztest_run_test_suite(test_hci_df_info);
260+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
/*
2+
* Copyright (c) 2021 Nordic Semiconductor ASA
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
/* Runs tests for HCI_LE_Set_Connectionless_CTE_Transmit_Enable command */
8+
void run_set_cl_cte_tx_enable_tests(void);

0 commit comments

Comments
 (0)