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_scan_random_addr_check, NULL, NULL, NULL, NULL, NULL);
29 
30 /*
31  *  Test checking scan random address if broadcaster role isn't enabled
32  *
33  *  Constraints:
34  *   - 'CONFIG_BT_BROADCASTER' isn't enabled
35  *
36  *  Expected behaviour:
37  *   - bt_id_scan_random_addr_check() returns true
38  */
ZTEST(bt_id_scan_random_addr_check,test_scan_returns_true_broadcaster_role_not_supported)39 ZTEST(bt_id_scan_random_addr_check, test_scan_returns_true_broadcaster_role_not_supported)
40 {
41 	bool result;
42 
43 	Z_TEST_SKIP_IFDEF(CONFIG_BT_BROADCASTER);
44 
45 	result = bt_id_scan_random_addr_check();
46 
47 	zassert_true(result, "Incorrect result was returned");
48 	expect_not_called_bt_le_adv_lookup_legacy();
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_scan_random_addr_check,test_scan_returns_true_ext_adv_enabled)60 ZTEST(bt_id_scan_random_addr_check, test_scan_returns_true_ext_adv_enabled)
61 {
62 	bool result;
63 
64 	Z_TEST_SKIP_IFNDEF(CONFIG_BT_EXT_ADV);
65 
66 	result = bt_id_scan_random_addr_check();
67 
68 	zassert_true(result, "Incorrect result was returned");
69 	expect_not_called_bt_le_adv_lookup_legacy();
70 }
71 
72 /*
73  *  Test checking scan random address when broadcaster role is enabled, but
74  *  bt_le_adv_lookup_legacy() fails
75  *
76  *  Constraints:
77  *   - 'CONFIG_BT_BROADCASTER' is enabled
78  *   - 'CONFIG_BT_EXT_ADV' isn't enabled
79  *   - bt_le_adv_lookup_legacy() returns NULL
80  *
81  *  Expected behaviour:
82  *   - bt_id_scan_random_addr_check() returns true
83  */
ZTEST(bt_id_scan_random_addr_check,test_scan_returns_true_bt_le_adv_lookup_legacy_fails)84 ZTEST(bt_id_scan_random_addr_check, test_scan_returns_true_bt_le_adv_lookup_legacy_fails)
85 {
86 	bool result;
87 
88 	Z_TEST_SKIP_IFNDEF(CONFIG_BT_BROADCASTER);
89 	Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
90 
91 	bt_le_adv_lookup_legacy_fake.return_val = NULL;
92 
93 	result = bt_id_scan_random_addr_check();
94 
95 	zassert_true(result, "Incorrect result was returned");
96 	expect_single_call_bt_le_adv_lookup_legacy();
97 }
98 
99 /*
100  *  Test checking scan random address when broadcaster role is enabled.
101  *  bt_le_adv_lookup_legacy() returns a valid reference with 'BT_ADV_ENABLED' flag not set
102  *
103  *  Constraints:
104  *   - 'CONFIG_BT_BROADCASTER' is enabled
105  *   - 'CONFIG_BT_EXT_ADV' isn't enabled
106  *   - bt_le_adv_lookup_legacy() returns a valid reference with 'BT_ADV_ENABLED' flag not set
107  *
108  *  Expected behaviour:
109  *   - bt_id_scan_random_addr_check() returns true
110  */
ZTEST(bt_id_scan_random_addr_check,test_scan_returns_true_advertiser_not_active)111 ZTEST(bt_id_scan_random_addr_check, test_scan_returns_true_advertiser_not_active)
112 {
113 	bool result;
114 	struct bt_le_ext_adv adv = {0};
115 
116 	Z_TEST_SKIP_IFNDEF(CONFIG_BT_BROADCASTER);
117 	Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
118 
119 	atomic_clear_bit(adv.flags, BT_ADV_ENABLED);
120 	bt_le_adv_lookup_legacy_fake.return_val = &adv;
121 
122 	result = bt_id_scan_random_addr_check();
123 
124 	zassert_true(result, "Incorrect result was returned");
125 	expect_single_call_bt_le_adv_lookup_legacy();
126 }
127 
128 /*
129  *  Test when privacy is not enabled then the random address will be attempted to be set.
130  *
131  *  Constraints:
132  *   - 'CONFIG_BT_PRIVACY' isn't enabled
133  *   - 'CONFIG_BT_BROADCASTER' is enabled
134  *   - 'CONFIG_BT_EXT_ADV' isn't enabled
135  *   - bt_le_adv_lookup_legacy() returns a valid reference with 'BT_ADV_ENABLED' flag not set
136  *
137  *  Expected behaviour:
138  *   - bt_id_scan_random_addr_check() returns false
139  */
ZTEST(bt_id_scan_random_addr_check,test_scan_returns_true_advertiser_active_no_privacy)140 ZTEST(bt_id_scan_random_addr_check, test_scan_returns_true_advertiser_active_no_privacy)
141 {
142 	bool result;
143 	struct bt_le_ext_adv adv = {0};
144 
145 	Z_TEST_SKIP_IFDEF(CONFIG_BT_PRIVACY);
146 	Z_TEST_SKIP_IFNDEF(CONFIG_BT_BROADCASTER);
147 	Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
148 
149 	atomic_set_bit(adv.flags, BT_ADV_ENABLED);
150 	bt_le_adv_lookup_legacy_fake.return_val = &adv;
151 
152 	result = bt_id_scan_random_addr_check();
153 
154 	zassert_true(result, "Incorrect result was returned");
155 	expect_single_call_bt_le_adv_lookup_legacy();
156 }
157 
158 /*
159  *  Test that scanner or initiator cannot start if the random address is used by the advertiser for
160  *  an RPA with a different identity or for a random static identity address.
161  *
162  *  Constraints:
163  *   - 'CONFIG_BT_PRIVACY' is enabled
164  *   - 'CONFIG_BT_BROADCASTER' is enabled
165  *   - 'CONFIG_BT_EXT_ADV' isn't enabled
166  *   - bt_le_adv_lookup_legacy() returns a valid reference with 'BT_ADV_ENABLED' and
167  *     'BT_ADV_USE_IDENTITY' flags set
168  *
169  *  Expected behaviour:
170  *   - bt_id_scan_random_addr_check() returns false
171  */
ZTEST(bt_id_scan_random_addr_check,test_scan_returns_false_advertiser_active_privacy_enabled)172 ZTEST(bt_id_scan_random_addr_check, test_scan_returns_false_advertiser_active_privacy_enabled)
173 {
174 	bool result;
175 	struct bt_le_ext_adv adv = {0};
176 
177 	Z_TEST_SKIP_IFNDEF(CONFIG_BT_PRIVACY);
178 	Z_TEST_SKIP_IFNDEF(CONFIG_BT_BROADCASTER);
179 	Z_TEST_SKIP_IFDEF(CONFIG_BT_EXT_ADV);
180 
181 	atomic_set_bit(adv.flags, BT_ADV_ENABLED);
182 	atomic_set_bit(adv.flags, BT_ADV_USE_IDENTITY);
183 	bt_dev.id_addr[adv.id].type = BT_ADDR_LE_RANDOM;
184 	bt_le_adv_lookup_legacy_fake.return_val = &adv;
185 
186 	result = bt_id_scan_random_addr_check();
187 
188 	zassert_false(result, "Incorrect result was returned");
189 	expect_single_call_bt_le_adv_lookup_legacy();
190 }
191