• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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