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