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