1 /*
2 * Copyright 2022 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <gtest/gtest.h>
18
19 #include "model/controller/link_layer_controller.h"
20 #include "test_helpers.h"
21
22 namespace rootcanal {
23
24 using namespace bluetooth::hci;
25
26 class LeSetExtendedAdvertisingEnableTest : public ::testing::Test {
27 public:
LeSetExtendedAdvertisingEnableTest()28 LeSetExtendedAdvertisingEnableTest() {
29 // Reduce the number of advertising sets to simplify testing.
30 properties_.le_num_supported_advertising_sets = 2;
31 properties_.le_max_advertising_data_length = 2000;
32 };
33 ~LeSetExtendedAdvertisingEnableTest() override = default;
34
35 protected:
36 Address address_{0};
37 ControllerProperties properties_{};
38 LinkLayerController controller_{address_, properties_};
39 };
40
TEST_F(LeSetExtendedAdvertisingEnableTest,DisableAll)41 TEST_F(LeSetExtendedAdvertisingEnableTest, DisableAll) {
42 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(false, {}),
43 ErrorCode::SUCCESS);
44 }
45
TEST_F(LeSetExtendedAdvertisingEnableTest,DisableSelected)46 TEST_F(LeSetExtendedAdvertisingEnableTest, DisableSelected) {
47 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
48 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
49 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
50 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
51 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
52 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
53 ErrorCode::SUCCESS);
54
55 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
56 false, {MakeEnabledSet(0, 0, 0)}),
57 ErrorCode::SUCCESS);
58 }
59
TEST_F(LeSetExtendedAdvertisingEnableTest,EnableUsingPublicAddress)60 TEST_F(LeSetExtendedAdvertisingEnableTest, EnableUsingPublicAddress) {
61 ASSERT_EQ(
62 controller_.LeSetExtendedAdvertisingParameters(
63 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
64 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
65 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
66 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
67 SecondaryPhyType::LE_2M, 0x0, false),
68 ErrorCode::SUCCESS);
69
70 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
71 true, {MakeEnabledSet(0, 0, 0)}),
72 ErrorCode::SUCCESS);
73 }
74
TEST_F(LeSetExtendedAdvertisingEnableTest,EnableUsingTimeout)75 TEST_F(LeSetExtendedAdvertisingEnableTest, EnableUsingTimeout) {
76 ASSERT_EQ(
77 controller_.LeSetExtendedAdvertisingParameters(
78 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
79 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
80 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
81 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
82 SecondaryPhyType::LE_2M, 0x0, false),
83 ErrorCode::SUCCESS);
84
85 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
86 true, {MakeEnabledSet(0, 0x40, 0)}),
87 ErrorCode::SUCCESS);
88 }
89
TEST_F(LeSetExtendedAdvertisingEnableTest,EnableUsingRandomAddress)90 TEST_F(LeSetExtendedAdvertisingEnableTest, EnableUsingRandomAddress) {
91 ASSERT_EQ(
92 controller_.LeSetExtendedAdvertisingParameters(
93 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
94 0x0800, 0x0800, 0x7, OwnAddressType::RANDOM_DEVICE_ADDRESS,
95 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
96 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
97 SecondaryPhyType::LE_2M, 0x0, false),
98 ErrorCode::SUCCESS);
99
100 ASSERT_EQ(controller_.LeSetAdvertisingSetRandomAddress(0, Address{1}),
101 ErrorCode::SUCCESS);
102
103 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
104 true, {MakeEnabledSet(0, 0x40, 0)}),
105 ErrorCode::SUCCESS);
106 }
107
TEST_F(LeSetExtendedAdvertisingEnableTest,EnableUsingResolvableAddress)108 TEST_F(LeSetExtendedAdvertisingEnableTest, EnableUsingResolvableAddress) {
109 ASSERT_EQ(
110 controller_.LeSetExtendedAdvertisingParameters(
111 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
112 0x0800, 0x0800, 0x7, OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS,
113 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address{1},
114 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
115 SecondaryPhyType::LE_2M, 0x0, false),
116 ErrorCode::SUCCESS);
117 ASSERT_EQ(controller_.LeAddDeviceToResolvingList(
118 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address{1},
119 std::array<uint8_t, 16>{1}, std::array<uint8_t, 16>{1}),
120 ErrorCode::SUCCESS);
121 ASSERT_EQ(controller_.LeSetAddressResolutionEnable(true), ErrorCode::SUCCESS);
122 // Note: the command will fail if the peer address is not in the resolvable
123 // address list and the random address is not set.
124 // Success here signifies that the RPA was successfully generated.
125 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
126 true, {MakeEnabledSet(0, 0x40, 0)}),
127 ErrorCode::SUCCESS);
128 }
129
TEST_F(LeSetExtendedAdvertisingEnableTest,DuplicateAdvertisingHandle)130 TEST_F(LeSetExtendedAdvertisingEnableTest, DuplicateAdvertisingHandle) {
131 ASSERT_EQ(
132 controller_.LeSetExtendedAdvertisingParameters(
133 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
134 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
135 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
136 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
137 SecondaryPhyType::LE_2M, 0x0, false),
138 ErrorCode::SUCCESS);
139
140 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
141 true, {MakeEnabledSet(0, 0, 0), MakeEnabledSet(0, 0, 0)}),
142 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
143 }
144
TEST_F(LeSetExtendedAdvertisingEnableTest,UnknownAdvertisingHandle)145 TEST_F(LeSetExtendedAdvertisingEnableTest, UnknownAdvertisingHandle) {
146 ASSERT_EQ(
147 controller_.LeSetExtendedAdvertisingParameters(
148 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
149 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
150 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
151 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
152 SecondaryPhyType::LE_2M, 0x0, false),
153 ErrorCode::SUCCESS);
154
155 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
156 true, {MakeEnabledSet(0, 0, 0), MakeEnabledSet(1, 0, 0)}),
157 ErrorCode::UNKNOWN_ADVERTISING_IDENTIFIER);
158 }
159
TEST_F(LeSetExtendedAdvertisingEnableTest,MissingAdvertisingHandle)160 TEST_F(LeSetExtendedAdvertisingEnableTest, MissingAdvertisingHandle) {
161 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(true, {}),
162 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
163 }
164
TEST_F(LeSetExtendedAdvertisingEnableTest,InvalidDuration)165 TEST_F(LeSetExtendedAdvertisingEnableTest, InvalidDuration) {
166 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
167 0,
168 MakeAdvertisingEventProperties(LEGACY | DIRECTED | CONNECTABLE |
169 HIGH_DUTY_CYCLE),
170 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
171 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
172 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
173 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
174 ErrorCode::SUCCESS);
175
176 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
177 true, {MakeEnabledSet(0, 0, 0)}),
178 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
179
180 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
181 true, {MakeEnabledSet(0, 0x801, 0)}),
182 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
183 }
184
TEST_F(LeSetExtendedAdvertisingEnableTest,PartialAdvertisingData)185 TEST_F(LeSetExtendedAdvertisingEnableTest, PartialAdvertisingData) {
186 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
187 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
188 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
189 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
190 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
191 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
192 ErrorCode::SUCCESS);
193
194 std::vector<uint8_t> first_advertising_data_fragment = {1, 2, 3};
195 ASSERT_EQ(controller_.LeSetExtendedAdvertisingData(
196 0, Operation::FIRST_FRAGMENT,
197 FragmentPreference::CONTROLLER_MAY_FRAGMENT,
198 first_advertising_data_fragment),
199 ErrorCode::SUCCESS);
200
201 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
202 true, {MakeEnabledSet(0, 0, 0)}),
203 ErrorCode::COMMAND_DISALLOWED);
204 }
205
TEST_F(LeSetExtendedAdvertisingEnableTest,PartialScanResponseData)206 TEST_F(LeSetExtendedAdvertisingEnableTest, PartialScanResponseData) {
207 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
208 0, MakeAdvertisingEventProperties(SCANNABLE), 0x0800, 0x0800,
209 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
210 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
211 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
212 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
213 ErrorCode::SUCCESS);
214
215 std::vector<uint8_t> first_scan_response_data_fragment = {1, 2, 3};
216 ASSERT_EQ(controller_.LeSetExtendedScanResponseData(
217 0, Operation::FIRST_FRAGMENT,
218 FragmentPreference::CONTROLLER_MAY_FRAGMENT,
219 first_scan_response_data_fragment),
220 ErrorCode::SUCCESS);
221
222 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
223 true, {MakeEnabledSet(0, 0, 0)}),
224 ErrorCode::COMMAND_DISALLOWED);
225 }
226
TEST_F(LeSetExtendedAdvertisingEnableTest,EmptyScanResponseData)227 TEST_F(LeSetExtendedAdvertisingEnableTest, EmptyScanResponseData) {
228 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
229 0, MakeAdvertisingEventProperties(SCANNABLE), 0x0800, 0x0800,
230 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
231 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
232 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
233 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
234 ErrorCode::SUCCESS);
235
236 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
237 true, {MakeEnabledSet(0, 0, 0)}),
238 ErrorCode::COMMAND_DISALLOWED);
239 }
240
TEST_F(LeSetExtendedAdvertisingEnableTest,AdvertisingDataLargerThanPduCapacity)241 TEST_F(LeSetExtendedAdvertisingEnableTest,
242 AdvertisingDataLargerThanPduCapacity) {
243 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
244 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
245 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
246 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
247 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
248 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
249 ErrorCode::SUCCESS);
250
251 std::vector<uint8_t> advertising_data = {1, 2, 3};
252 advertising_data.resize(254);
253 ASSERT_EQ(controller_.LeSetExtendedAdvertisingData(
254 0, Operation::COMPLETE_ADVERTISEMENT,
255 FragmentPreference::CONTROLLER_MAY_FRAGMENT, advertising_data),
256 ErrorCode::SUCCESS);
257
258 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
259 true, {MakeEnabledSet(0, 0, 0)}),
260 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
261 }
262
TEST_F(LeSetExtendedAdvertisingEnableTest,AdvertisingDataLargerThanMaxPduCapacity)263 TEST_F(LeSetExtendedAdvertisingEnableTest,
264 AdvertisingDataLargerThanMaxPduCapacity) {
265 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
266 0, MakeAdvertisingEventProperties(0), 0x0800, 0x0800, 0x7,
267 OwnAddressType::PUBLIC_DEVICE_ADDRESS,
268 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
269 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
270 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
271 ErrorCode::SUCCESS);
272
273 std::vector<uint8_t> advertising_data = {1, 2, 3};
274 advertising_data.resize(1651);
275 ASSERT_EQ(controller_.LeSetExtendedAdvertisingData(
276 0, Operation::COMPLETE_ADVERTISEMENT,
277 FragmentPreference::CONTROLLER_MAY_FRAGMENT, advertising_data),
278 ErrorCode::SUCCESS);
279
280 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
281 true, {MakeEnabledSet(0, 0, 0)}),
282 ErrorCode::PACKET_TOO_LONG);
283 }
284
TEST_F(LeSetExtendedAdvertisingEnableTest,NoRandomAddress)285 TEST_F(LeSetExtendedAdvertisingEnableTest, NoRandomAddress) {
286 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
287 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
288 0x7, OwnAddressType::RANDOM_DEVICE_ADDRESS,
289 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
290 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
291 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
292 ErrorCode::SUCCESS);
293
294 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
295 true, {MakeEnabledSet(0, 0, 0)}),
296 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
297 }
298
TEST_F(LeSetExtendedAdvertisingEnableTest,NoResolvableOrRandomAddress)299 TEST_F(LeSetExtendedAdvertisingEnableTest, NoResolvableOrRandomAddress) {
300 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
301 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
302 0x7, OwnAddressType::RESOLVABLE_OR_RANDOM_ADDRESS,
303 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
304 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
305 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
306 ErrorCode::SUCCESS);
307
308 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
309 true, {MakeEnabledSet(0, 0, 0)}),
310 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
311 }
312
313 } // namespace rootcanal
314