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 LeSetExtendedAdvertisingParametersTest : public ::testing::Test {
27 public:
LeSetExtendedAdvertisingParametersTest()28 LeSetExtendedAdvertisingParametersTest() {
29 // Reduce the number of advertising sets to simplify testing.
30 properties_.le_num_supported_advertising_sets = 2;
31 };
32 ~LeSetExtendedAdvertisingParametersTest() override = default;
33
34 protected:
35 Address address_{0};
36 ControllerProperties properties_{};
37 LinkLayerController controller_{address_, properties_};
38 };
39
TEST_F(LeSetExtendedAdvertisingParametersTest,Success)40 TEST_F(LeSetExtendedAdvertisingParametersTest, Success) {
41 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
42 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
43 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
44 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
45 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
46 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
47 ErrorCode::SUCCESS);
48 }
49
TEST_F(LeSetExtendedAdvertisingParametersTest,LegacyUsed)50 TEST_F(LeSetExtendedAdvertisingParametersTest, LegacyUsed) {
51 ASSERT_EQ(
52 controller_.LeSetScanParameters(LeScanType::PASSIVE, 0x2000, 0x200,
53 OwnAddressType::PUBLIC_DEVICE_ADDRESS,
54 LeScanningFilterPolicy::ACCEPT_ALL),
55 ErrorCode::SUCCESS);
56
57 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
58 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
59 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
60 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
61 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
62 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
63 ErrorCode::COMMAND_DISALLOWED);
64 }
65
TEST_F(LeSetExtendedAdvertisingParametersTest,AdvertisingSetsFull)66 TEST_F(LeSetExtendedAdvertisingParametersTest, AdvertisingSetsFull) {
67 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
68 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
69 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
70 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
71 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
72 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
73 ErrorCode::SUCCESS);
74
75 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
76 1, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
77 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
78 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
79 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
80 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
81 ErrorCode::SUCCESS);
82
83 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
84 2, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
85 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
86 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
87 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
88 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
89 ErrorCode::MEMORY_CAPACITY_EXCEEDED);
90 }
91
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidLegacyAdvertisingEventProperties)92 TEST_F(LeSetExtendedAdvertisingParametersTest,
93 InvalidLegacyAdvertisingEventProperties) {
94 ASSERT_EQ(
95 controller_.LeSetExtendedAdvertisingParameters(
96 0, MakeAdvertisingEventProperties(LEGACY | DIRECTED | SCANNABLE),
97 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
98 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
99 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
100 SecondaryPhyType::LE_2M, 0x0, false),
101 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
102 }
103
TEST_F(LeSetExtendedAdvertisingParametersTest,UnexpectedAdvertisingData)104 TEST_F(LeSetExtendedAdvertisingParametersTest, UnexpectedAdvertisingData) {
105 ASSERT_EQ(
106 controller_.LeSetExtendedAdvertisingParameters(
107 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE | SCANNABLE),
108 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
109 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
110 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
111 SecondaryPhyType::LE_2M, 0x0, false),
112 ErrorCode::SUCCESS);
113
114 std::vector<uint8_t> advertising_data = {1, 2, 3};
115 ASSERT_EQ(controller_.LeSetExtendedAdvertisingData(
116 0, Operation::COMPLETE_ADVERTISEMENT,
117 FragmentPreference::CONTROLLER_MAY_FRAGMENT, advertising_data),
118 ErrorCode::SUCCESS);
119
120 ASSERT_EQ(
121 controller_.LeSetExtendedAdvertisingParameters(
122 0, MakeAdvertisingEventProperties(LEGACY | DIRECTED | CONNECTABLE),
123 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
124 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
125 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_1M, 0,
126 SecondaryPhyType::LE_2M, 0x0, false),
127 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
128 }
129
TEST_F(LeSetExtendedAdvertisingParametersTest,UnexpectedScanResponseData)130 TEST_F(LeSetExtendedAdvertisingParametersTest, UnexpectedScanResponseData) {
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 std::vector<uint8_t> scan_response_data = {1, 2, 3};
141 ASSERT_EQ(
142 controller_.LeSetExtendedScanResponseData(
143 0, Operation::COMPLETE_ADVERTISEMENT,
144 FragmentPreference::CONTROLLER_MAY_FRAGMENT, scan_response_data),
145 ErrorCode::SUCCESS);
146
147 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
148 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE), 0x0800,
149 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
150 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
151 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
152 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
153 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
154 }
155
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidLegacyAdvertisingData)156 TEST_F(LeSetExtendedAdvertisingParametersTest, InvalidLegacyAdvertisingData) {
157 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
158 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
159 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
160 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
161 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
162 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
163 ErrorCode::SUCCESS);
164
165 std::vector<uint8_t> advertising_data = {1, 2, 3};
166 advertising_data.resize(32);
167 ASSERT_EQ(controller_.LeSetExtendedAdvertisingData(
168 0, Operation::COMPLETE_ADVERTISEMENT,
169 FragmentPreference::CONTROLLER_MAY_FRAGMENT, advertising_data),
170 ErrorCode::SUCCESS);
171
172 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
173 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE), 0x0800,
174 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
175 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
176 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
177 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
178 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
179 }
180
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidLegacyScanResponseData)181 TEST_F(LeSetExtendedAdvertisingParametersTest, InvalidLegacyScanResponseData) {
182 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
183 0, MakeAdvertisingEventProperties(SCANNABLE), 0x0800, 0x0800,
184 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
185 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
186 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
187 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
188 ErrorCode::SUCCESS);
189
190 std::vector<uint8_t> scan_response_data = {1, 2, 3};
191 scan_response_data.resize(32);
192 ASSERT_EQ(
193 controller_.LeSetExtendedScanResponseData(
194 0, Operation::COMPLETE_ADVERTISEMENT,
195 FragmentPreference::CONTROLLER_MAY_FRAGMENT, scan_response_data),
196 ErrorCode::SUCCESS);
197
198 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
199 0, MakeAdvertisingEventProperties(LEGACY | SCANNABLE), 0x0800,
200 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
201 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
202 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
203 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
204 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
205 }
206
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidExtendedAdvertisingEventProperties)207 TEST_F(LeSetExtendedAdvertisingParametersTest,
208 InvalidExtendedAdvertisingEventProperties) {
209 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
210 0, MakeAdvertisingEventProperties(CONNECTABLE | SCANNABLE),
211 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
212 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
213 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
214 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
215 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
216
217 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
218 0,
219 MakeAdvertisingEventProperties(CONNECTABLE | DIRECTED |
220 HIGH_DUTY_CYCLE),
221 0x0800, 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
222 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
223 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
224 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
225 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
226 }
227
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidPrimaryAdvertisingInterval)228 TEST_F(LeSetExtendedAdvertisingParametersTest,
229 InvalidPrimaryAdvertisingInterval) {
230 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
231 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x10, 0x0800,
232 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
233 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
234 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
235 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
236 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
237
238 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
239 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x10,
240 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
241 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
242 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
243 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
244 ErrorCode::UNSUPPORTED_FEATURE_OR_PARAMETER_VALUE);
245
246 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
247 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0400,
248 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
249 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
250 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
251 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
252 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
253 }
254
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidChannelMap)255 TEST_F(LeSetExtendedAdvertisingParametersTest, InvalidChannelMap) {
256 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
257 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
258 0x0, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
259 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
260 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
261 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
262 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
263 }
264
TEST_F(LeSetExtendedAdvertisingParametersTest,InvalidPrimaryPhy)265 TEST_F(LeSetExtendedAdvertisingParametersTest, InvalidPrimaryPhy) {
266 ASSERT_EQ(
267 controller_.LeSetExtendedAdvertisingParameters(
268 0, MakeAdvertisingEventProperties(LEGACY | CONNECTABLE), 0x0800,
269 0x0800, 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
270 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS, Address::kEmpty,
271 AdvertisingFilterPolicy::ALL_DEVICES, 0x70, PrimaryPhyType::LE_CODED,
272 0, SecondaryPhyType::LE_2M, 0x0, false),
273 ErrorCode::INVALID_HCI_COMMAND_PARAMETERS);
274 }
275
TEST_F(LeSetExtendedAdvertisingParametersTest,AdvertisingActive)276 TEST_F(LeSetExtendedAdvertisingParametersTest, AdvertisingActive) {
277 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
278 0, MakeAdvertisingEventProperties(CONNECTABLE), 0x0800, 0x0800,
279 0x7, OwnAddressType::PUBLIC_DEVICE_ADDRESS,
280 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
281 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
282 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
283 ErrorCode::SUCCESS);
284 ASSERT_EQ(controller_.LeSetExtendedAdvertisingEnable(
285 true, {MakeEnabledSet(0, 0, 0)}),
286 ErrorCode::SUCCESS);
287
288 ASSERT_EQ(controller_.LeSetExtendedAdvertisingParameters(
289 0, MakeAdvertisingEventProperties(0), 0x0800, 0x0800, 0x7,
290 OwnAddressType::PUBLIC_DEVICE_ADDRESS,
291 PeerAddressType::PUBLIC_DEVICE_OR_IDENTITY_ADDRESS,
292 Address::kEmpty, AdvertisingFilterPolicy::ALL_DEVICES, 0x70,
293 PrimaryPhyType::LE_1M, 0, SecondaryPhyType::LE_2M, 0x0, false),
294 ErrorCode::COMMAND_DISALLOWED);
295 }
296
297 } // namespace rootcanal
298