1 /*
2 * Copyright (c) 2022 Nordic Semiconductor ASA
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include "mocks/adv.h"
8 #include "mocks/adv_expects.h"
9
10 #include <zephyr/bluetooth/hci.h>
11 #include <zephyr/fff.h>
12 #include <zephyr/kernel.h>
13
14 #include <host/hci_core.h>
15 #include <host/id.h>
16
17 DEFINE_FFF_GLOBALS;
18
fff_reset_rule_before(const struct ztest_unit_test * test,void * fixture)19 static void fff_reset_rule_before(const struct ztest_unit_test *test, void *fixture)
20 {
21 memset(&bt_dev, 0x00, sizeof(struct bt_dev));
22
23 ADV_FFF_FAKES_LIST(RESET_FAKE);
24 }
25
26 ZTEST_RULE(fff_reset_rule, fff_reset_rule_before, NULL);
27
28 ZTEST_SUITE(bt_id_adv_random_addr_check, NULL, NULL, NULL, NULL, NULL);
29
30 /*
31 * Test checking advertising random address if observer role isn't enabled
32 *
33 * Constraints:
34 * - 'CONFIG_BT_OBSERVER' isn't enabled
35 *
36 * Expected behaviour:
37 * - bt_id_adv_random_addr_check() returns true
38 */
ZTEST(bt_id_adv_random_addr_check,test_check_returns_true_observer_role_not_supported)39 ZTEST(bt_id_adv_random_addr_check, test_check_returns_true_observer_role_not_supported)
40 {
41 bool result;
42 struct bt_le_adv_param adv_param = {0};
43
44 Z_TEST_SKIP_IFDEF(CONFIG_BT_OBSERVER);
45
46 result = bt_id_adv_random_addr_check(&adv_param);
47
48 zassert_true(result, "Incorrect result was returned");
49 }
50
51 /*
52 * Test checking scan random address if extended advertising is enabled
53 *
54 * Constraints:
55 * - 'CONFIG_BT_EXT_ADV' is enabled
56 *
57 * Expected behaviour:
58 * - bt_id_scan_random_addr_check() returns true
59 */
ZTEST(bt_id_adv_random_addr_check,test_check_returns_true_ext_adv_enabled)60 ZTEST(bt_id_adv_random_addr_check, test_check_returns_true_ext_adv_enabled)
61 {
62 bool result;
63 struct bt_le_adv_param adv_param = {0};
64
65 Z_TEST_SKIP_IFNDEF(CONFIG_BT_EXT_ADV);
66
67 result = bt_id_adv_random_addr_check(&adv_param);
68
69 zassert_true(result, "Incorrect result was returned");
70 }
71
72 /*
73 * Test checking advertising random address when scanner roles aren't active so that
74 * 'BT_DEV_INITIATING' and 'BT_DEV_SCANNING' aren't set in bt_dev.flags
75 *
76 * Constraints:
77 * - 'CONFIG_BT_OBSERVER' is enabled
78 * - 'CONFIG_BT_EXT_ADV' isn't enabled
79 * - 'BT_DEV_INITIATING' and 'BT_DEV_SCANNING' aren't set in bt_dev.flags
80 *
81 * Expected behaviour:
82 * - bt_id_scan_random_addr_check() returns true
83 */
ZTEST(bt_id_adv_random_addr_check,test_scanner_roles_not_active)84 ZTEST(bt_id_adv_random_addr_check, test_scanner_roles_not_active)
85 {
86 bool result;
87 struct bt_le_adv_param adv_param;
88
89 Z_TEST_SKIP_IFNDEF(CONFIG_BT_OBSERVER);
90 Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
91
92 atomic_clear_bit(bt_dev.flags, BT_DEV_INITIATING);
93 atomic_clear_bit(bt_dev.flags, BT_DEV_SCANNING);
94
95 result = bt_id_adv_random_addr_check(&adv_param);
96
97 zassert_true(result, "Incorrect result was returned");
98 }
99
100 /*
101 * Test that advertiser cannot start with random static identity or
102 * using an RPA generated for a different identity than scanner roles when privacy is enabled
103 *
104 * Constraints:
105 * - 'CONFIG_BT_PRIVACY' is enabled
106 * - 'CONFIG_BT_OBSERVER' is enabled
107 * - 'CONFIG_BT_EXT_ADV' isn't enabled
108 *
109 * Expected behaviour:
110 * - bt_id_scan_random_addr_check() returns false
111 */
ZTEST(bt_id_adv_random_addr_check,test_check_returns_false_scanner_uses_random_identity)112 ZTEST(bt_id_adv_random_addr_check, test_check_returns_false_scanner_uses_random_identity)
113 {
114 bool result;
115 struct bt_le_adv_param adv_param = {0};
116
117 Z_TEST_SKIP_IFNDEF(CONFIG_BT_PRIVACY);
118 Z_TEST_SKIP_IFNDEF(CONFIG_BT_OBSERVER);
119 Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
120
121 atomic_set_bit(bt_dev.flags, BT_DEV_INITIATING);
122 atomic_set_bit(bt_dev.flags, BT_DEV_SCANNING);
123
124 adv_param.options |= BT_LE_ADV_OPT_USE_IDENTITY;
125 bt_dev.id_addr[adv_param.id].type = BT_ADDR_LE_RANDOM;
126
127 result = bt_id_adv_random_addr_check(&adv_param);
128
129 zassert_false(result, "Incorrect result was returned");
130 }
131
132 /*
133 * Test that advertiser cannot start with random static identity or using an RPA generated for
134 * a different identity than scanner roles while 'CONFIG_BT_PRIVACY' isn't enabled and
135 * 'CONFIG_BT_SCAN_WITH_IDENTITY' is enabled
136 *
137 * Constraints:
138 * - 'CONFIG_BT_SCAN_WITH_IDENTITY' is enabled
139 * - 'CONFIG_BT_PRIVACY' isn't enabled
140 * - 'CONFIG_BT_OBSERVER' is enabled
141 * - 'CONFIG_BT_EXT_ADV' isn't enabled
142 *
143 * Expected behaviour:
144 * - bt_id_scan_random_addr_check() returns false
145 */
ZTEST(bt_id_adv_random_addr_check,test_check_returns_false_advertise_with_local_identity)146 ZTEST(bt_id_adv_random_addr_check, test_check_returns_false_advertise_with_local_identity)
147 {
148 bool result;
149 struct bt_le_adv_param adv_param = {0};
150
151 Z_TEST_SKIP_IFNDEF(CONFIG_BT_SCAN_WITH_IDENTITY);
152 Z_TEST_SKIP_IFNDEF(CONFIG_BT_OBSERVER);
153 Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
154
155 atomic_set_bit(bt_dev.flags, BT_DEV_SCANNING);
156
157 adv_param.options &= ~BT_LE_ADV_OPT_CONN;
158 adv_param.options |= BT_LE_ADV_OPT_USE_IDENTITY;
159 bt_dev.id_addr[BT_ID_DEFAULT].type = BT_ADDR_LE_RANDOM;
160
161 result = bt_id_adv_random_addr_check(&adv_param);
162
163 zassert_false(result, "Incorrect result was returned");
164 }
165
166 /*
167 * Test that advertiser cannot start with random static identity or using an RPA generated for
168 * a different identity than scanner roles while 'CONFIG_BT_PRIVACY' isn't enabled and
169 * 'CONFIG_BT_SCAN_WITH_IDENTITY' is enabled
170 *
171 * Constraints:
172 * - 'CONFIG_BT_SCAN_WITH_IDENTITY' is enabled
173 * - 'CONFIG_BT_PRIVACY' isn't enabled
174 * - 'CONFIG_BT_OBSERVER' is enabled
175 * - 'CONFIG_BT_EXT_ADV' isn't enabled
176 *
177 * Expected behaviour:
178 * - bt_id_scan_random_addr_check() returns false
179 */
ZTEST(bt_id_adv_random_addr_check,test_check_returns_false_advertise_with_different_identity)180 ZTEST(bt_id_adv_random_addr_check, test_check_returns_false_advertise_with_different_identity)
181 {
182 bool result;
183 struct bt_le_adv_param adv_param = {0};
184
185 Z_TEST_SKIP_IFNDEF(CONFIG_BT_SCAN_WITH_IDENTITY);
186 Z_TEST_SKIP_IFNDEF(CONFIG_BT_OBSERVER);
187 Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
188
189 atomic_set_bit(bt_dev.flags, BT_DEV_SCANNING);
190
191 adv_param.id = 1;
192 bt_dev.id_addr[adv_param.id].type = BT_ADDR_LE_RANDOM;
193 bt_dev.id_addr[BT_ID_DEFAULT].type = BT_ADDR_LE_RANDOM;
194
195 result = bt_id_adv_random_addr_check(&adv_param);
196
197 zassert_false(result, "Incorrect result was returned");
198 }
199
200 /*
201 * Test checking advertising random address returns 'true' as a default value
202 *
203 * Constraints:
204 * - 'CONFIG_BT_OBSERVER' is enabled
205 * - 'CONFIG_BT_EXT_ADV' isn't enabled
206 * - 'BT_DEV_INITIATING' and 'BT_DEV_SCANNING' are set in bt_dev.flags
207 * - 'CONFIG_BT_SCAN_WITH_IDENTITY' isn't enabled
208 * - 'CONFIG_BT_PRIVACY' isn't enabled
209 *
210 * Expected behaviour:
211 * - bt_id_scan_random_addr_check() returns true
212 */
ZTEST(bt_id_adv_random_addr_check,test_default_return_value)213 ZTEST(bt_id_adv_random_addr_check, test_default_return_value)
214 {
215 bool result;
216 struct bt_le_adv_param adv_param;
217
218 Z_TEST_SKIP_IFNDEF(CONFIG_BT_OBSERVER);
219 Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
220 Z_TEST_SKIP_IFDEF(CONFIG_BT_SCAN_WITH_IDENTITY);
221 Z_TEST_SKIP_IFDEF(CONFIG_BT_PRIVACY);
222
223 atomic_set_bit(bt_dev.flags, BT_DEV_INITIATING);
224 atomic_set_bit(bt_dev.flags, BT_DEV_SCANNING);
225
226 result = bt_id_adv_random_addr_check(&adv_param);
227
228 zassert_true(result, "Incorrect result was returned");
229 }
230