• 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 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