1 /*
2 * Copyright 2019 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 "hci/le_advertising_manager.h"
18
19 #include <bluetooth/log.h>
20 #include <com_android_bluetooth_flags.h>
21 #include <flag_macros.h>
22 #include <gmock/gmock.h>
23 #include <gtest/gtest.h>
24 #include <log/log.h>
25
26 #include <algorithm>
27 #include <chrono>
28 #include <future>
29
30 #include "common/bind.h"
31 #include "hardware/ble_advertiser.h"
32 #include "hci/acl_manager.h"
33 #include "hci/address.h"
34 #include "hci/controller.h"
35 #include "hci/hci_layer_fake.h"
36 #include "os/thread.h"
37 #include "packet/raw_builder.h"
38
39 #define TEST_BT com::android::bluetooth::flags
40
41 namespace bluetooth {
42 namespace hci {
43 namespace {
44
45 using namespace std::literals;
46 using namespace std::literals::chrono_literals;
47
48 using packet::RawBuilder;
49
50 using testing::_;
51 using testing::InSequence;
52 using testing::SaveArg;
53
54 class TestController : public Controller {
55 public:
IsSupported(OpCode op_code) const56 bool IsSupported(OpCode op_code) const override { return supported_opcodes_.count(op_code) == 1; }
57
AddSupported(OpCode op_code)58 void AddSupported(OpCode op_code) { supported_opcodes_.insert(op_code); }
59
GetLeNumberOfSupportedAdverisingSets() const60 uint8_t GetLeNumberOfSupportedAdverisingSets() const override { return num_advertisers_; }
61
GetLeMaximumAdvertisingDataLength() const62 uint16_t GetLeMaximumAdvertisingDataLength() const override { return 0x0672; }
63
SupportsBlePeriodicAdvertising() const64 bool SupportsBlePeriodicAdvertising() const override { return true; }
65
SupportsBleExtendedAdvertising() const66 bool SupportsBleExtendedAdvertising() const override { return support_ble_extended_advertising_; }
67
SetBleExtendedAdvertisingSupport(bool support)68 void SetBleExtendedAdvertisingSupport(bool support) {
69 support_ble_extended_advertising_ = support;
70 }
71
GetVendorCapabilities() const72 VendorCapabilities GetVendorCapabilities() const override { return vendor_capabilities_; }
73
74 uint8_t num_advertisers_{0};
75 VendorCapabilities vendor_capabilities_;
76
77 protected:
Start()78 void Start() override {}
Stop()79 void Stop() override {}
ListDependencies(ModuleList *) const80 void ListDependencies(ModuleList* /* list */) const {}
81
82 private:
83 std::set<OpCode> supported_opcodes_{};
84 bool support_ble_extended_advertising_ = false;
85 };
86
87 class TestLeAddressManager : public LeAddressManager {
88 public:
TestLeAddressManager(common::Callback<void (std::unique_ptr<CommandBuilder>)> enqueue_command,os::Handler * handler,Address public_address,uint8_t accept_list_size,uint8_t resolving_list_size,Controller * controller)89 TestLeAddressManager(common::Callback<void(std::unique_ptr<CommandBuilder>)> enqueue_command,
90 os::Handler* handler, Address public_address, uint8_t accept_list_size,
91 uint8_t resolving_list_size, Controller* controller)
92 : LeAddressManager(enqueue_command, handler, public_address, accept_list_size,
93 resolving_list_size, controller) {
94 address_policy_ = AddressPolicy::USE_STATIC_ADDRESS;
95 minimum_rotation_time_ = 0ms;
96 maximum_rotation_time_ = 100ms;
97 }
98
Register(LeAddressManagerCallback * callback)99 AddressPolicy Register(LeAddressManagerCallback* callback) override {
100 client_ = callback;
101 test_client_state_ = RESUMED;
102 return AddressPolicy::USE_STATIC_ADDRESS;
103 }
104
Unregister(LeAddressManagerCallback *)105 void Unregister(LeAddressManagerCallback* /* callback */) override {
106 if (!ignore_unregister_for_testing) {
107 client_ = nullptr;
108 }
109 test_client_state_ = UNREGISTERED;
110 }
111
AckPause(LeAddressManagerCallback *)112 void AckPause(LeAddressManagerCallback* /* callback */) override { test_client_state_ = PAUSED; }
113
AckResume(LeAddressManagerCallback *)114 void AckResume(LeAddressManagerCallback* /* callback */) override {
115 test_client_state_ = RESUMED;
116 }
117
SetAddressPolicy(AddressPolicy address_policy)118 void SetAddressPolicy(AddressPolicy address_policy) { address_policy_ = address_policy; }
119
120 LeAddressManagerCallback* client_;
121 bool ignore_unregister_for_testing = false;
122 enum TestClientState {
123 UNREGISTERED,
124 PAUSED,
125 RESUMED,
126 };
127 TestClientState test_client_state_ = UNREGISTERED;
128 };
129
130 class TestAclManager : public AclManager {
131 public:
GetLeAddressManager()132 LeAddressManager* GetLeAddressManager() override { return test_le_address_manager_; }
133
SetAddressPolicy(LeAddressManager::AddressPolicy address_policy)134 void SetAddressPolicy(LeAddressManager::AddressPolicy address_policy) {
135 test_le_address_manager_->SetAddressPolicy(address_policy);
136 }
137
138 protected:
Start()139 void Start() override {
140 thread_ = new os::Thread("thread", os::Thread::Priority::NORMAL);
141 handler_ = new os::Handler(thread_);
142 Address address({0x01, 0x02, 0x03, 0x04, 0x05, 0x06});
143 test_controller_ = new TestController;
144 test_le_address_manager_ = new TestLeAddressManager(
145 common::Bind(&TestAclManager::enqueue_command, common::Unretained(this)), handler_,
146 address, 0x3F, 0x3F, test_controller_);
147 }
148
Stop()149 void Stop() override {
150 delete test_le_address_manager_;
151 handler_->Clear();
152 delete handler_;
153 delete thread_;
154 }
155
ListDependencies(ModuleList *) const156 void ListDependencies(ModuleList* /* list */) const {}
157
SetRandomAddress(Address)158 void SetRandomAddress(Address /* address */) {}
159
enqueue_command(std::unique_ptr<CommandBuilder>)160 void enqueue_command(std::unique_ptr<CommandBuilder> /* command_packet */){};
161
162 os::Thread* thread_;
163 os::Handler* handler_;
164 TestController* test_controller_ = nullptr;
165 TestLeAddressManager* test_le_address_manager_;
166 };
167
168 class LeAdvertisingManagerTest : public ::testing::Test {
169 protected:
SetUp()170 void SetUp() override {
171 __android_log_set_minimum_priority(ANDROID_LOG_VERBOSE);
172 test_hci_layer_ = new HciLayerFake; // Ownership is transferred to registry
173 test_controller_ = new TestController;
174 test_acl_manager_ = new TestAclManager;
175 test_controller_->AddSupported(param_opcode_);
176 fake_registry_.InjectTestModule(&HciLayer::Factory, test_hci_layer_);
177 fake_registry_.InjectTestModule(&Controller::Factory, test_controller_);
178 fake_registry_.InjectTestModule(&AclManager::Factory, test_acl_manager_);
179 client_handler_ = fake_registry_.GetTestModuleHandler(&HciLayer::Factory);
180 ASSERT_NE(client_handler_, nullptr);
181 test_controller_->num_advertisers_ = num_instances_;
182 test_controller_->vendor_capabilities_.max_advt_instances_ = num_instances_;
183 test_controller_->SetBleExtendedAdvertisingSupport(support_ble_extended_advertising_);
184 le_advertising_manager_ = fake_registry_.Start<LeAdvertisingManager>(&thread_);
185 le_advertising_manager_->RegisterAdvertisingCallback(&mock_advertising_callback_);
186 }
187
TearDown()188 void TearDown() override {
189 TEST_BT::provider_->reset_flags();
190
191 sync_client_handler();
192 fake_registry_.SynchronizeModuleHandler(&LeAdvertisingManager::Factory,
193 std::chrono::milliseconds(20));
194 fake_registry_.StopAll();
195 }
196
197 TestModuleRegistry fake_registry_;
198 HciLayerFake* test_hci_layer_ = nullptr;
199 TestController* test_controller_ = nullptr;
200 TestAclManager* test_acl_manager_ = nullptr;
201 os::Thread& thread_ = fake_registry_.GetTestThread();
202 LeAdvertisingManager* le_advertising_manager_ = nullptr;
203 os::Handler* client_handler_ = nullptr;
204 OpCode param_opcode_{OpCode::LE_SET_ADVERTISING_PARAMETERS};
205 uint8_t num_instances_ = 8;
206 bool support_ble_extended_advertising_ = false;
207
208 const common::Callback<void(Address, AddressType)> scan_callback =
209 common::Bind(&LeAdvertisingManagerTest::on_scan, common::Unretained(this));
210 const common::Callback<void(ErrorCode, uint8_t, uint8_t)> set_terminated_callback =
211 common::Bind(&LeAdvertisingManagerTest::on_set_terminated, common::Unretained(this));
212
on_scan(Address,AddressType)213 void on_scan(Address /* address */, AddressType /* address_type */) {}
214
on_set_terminated(ErrorCode,uint8_t,uint8_t)215 void on_set_terminated(ErrorCode /* error_code */, uint8_t, uint8_t) {}
216
sync_client_handler()217 void sync_client_handler() {
218 log::assert_that(thread_.GetReactor()->WaitForIdle(2s),
219 "assert failed: thread_.GetReactor()->WaitForIdle(2s)");
220 }
221
222 class MockAdvertisingCallback : public AdvertisingCallback {
223 public:
224 MOCK_METHOD4(OnAdvertisingSetStarted, void(int reg_id, uint8_t advertiser_id, int8_t tx_power,
225 AdvertisingStatus status));
226 MOCK_METHOD3(OnAdvertisingEnabled,
227 void(uint8_t advertiser_id, bool enable, AdvertisingStatus status));
228 MOCK_METHOD2(OnAdvertisingDataSet, void(uint8_t advertiser_id, AdvertisingStatus status));
229 MOCK_METHOD2(OnScanResponseDataSet, void(uint8_t advertiser_id, AdvertisingStatus status));
230 MOCK_METHOD3(OnAdvertisingParametersUpdated,
231 void(uint8_t advertiser_id, int8_t tx_power, AdvertisingStatus status));
232 MOCK_METHOD2(OnPeriodicAdvertisingParametersUpdated,
233 void(uint8_t advertiser_id, AdvertisingStatus status));
234 MOCK_METHOD2(OnPeriodicAdvertisingDataSet,
235 void(uint8_t advertiser_id, AdvertisingStatus status));
236 MOCK_METHOD3(OnPeriodicAdvertisingEnabled,
237 void(uint8_t advertiser_id, bool enable, AdvertisingStatus status));
238 MOCK_METHOD3(OnOwnAddressRead,
239 void(uint8_t advertiser_id, uint8_t address_type, Address address));
240 } mock_advertising_callback_;
241 };
242
243 class LeAdvertisingAPITest : public LeAdvertisingManagerTest {
244 protected:
SetUp()245 void SetUp() override {
246 LeAdvertisingManagerTest::SetUp();
247
248 // start advertising set
249 AdvertisingConfig advertising_config{};
250 advertising_config.advertising_type = AdvertisingType::ADV_IND;
251 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
252 std::vector<GapData> gap_data{};
253 GapData data_item{};
254 data_item.data_type_ = GapDataType::FLAGS;
255 data_item.data_ = {0x34};
256 gap_data.push_back(data_item);
257 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
258 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
259 gap_data.push_back(data_item);
260 advertising_config.advertisement = gap_data;
261 advertising_config.scan_response = gap_data;
262 advertising_config.channel_map = 1;
263
264 EXPECT_CALL(
265 mock_advertising_callback_,
266 OnAdvertisingSetStarted(0x00, _, 0x00, AdvertisingCallback::AdvertisingStatus::SUCCESS))
267 .WillOnce(SaveArg<1>(&advertiser_id_));
268
269 le_advertising_manager_->ExtendedCreateAdvertiser(
270 kAdvertiserClientIdJni, 0x00, advertising_config, scan_callback,
271 set_terminated_callback, 0, 0, client_handler_);
272
273 std::vector<OpCode> adv_opcodes = {
274 OpCode::LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER,
275 OpCode::LE_SET_ADVERTISING_PARAMETERS,
276 OpCode::LE_SET_SCAN_RESPONSE_DATA,
277 OpCode::LE_SET_ADVERTISING_DATA,
278 OpCode::LE_SET_ADVERTISING_ENABLE,
279 };
280
281 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
282 for (size_t i = 0; i < adv_opcodes.size(); i++) {
283 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
284 if (adv_opcodes[i] == OpCode::LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER) {
285 test_hci_layer_->IncomingEvent(
286 LeReadAdvertisingPhysicalChannelTxPowerCompleteBuilder::Create(
287 uint8_t{1}, ErrorCode::SUCCESS, 0x00));
288 } else {
289 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
290 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
291 }
292 }
293
294 sync_client_handler();
295 ASSERT_NE(LeAdvertisingManager::kInvalidId, advertiser_id_);
296 }
297
298 AdvertiserId advertiser_id_;
299 };
300
301 class LeAndroidHciAdvertisingManagerTest : public LeAdvertisingManagerTest {
302 protected:
SetUp()303 void SetUp() override {
304 param_opcode_ = OpCode::LE_MULTI_ADVT;
305 LeAdvertisingManagerTest::SetUp();
306 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS);
307 }
308 };
309
310 class LeAndroidHciAdvertisingAPITest : public LeAndroidHciAdvertisingManagerTest {
311 protected:
SetUp()312 void SetUp() override {
313 LeAndroidHciAdvertisingManagerTest::SetUp();
314
315 AdvertisingConfig advertising_config{};
316 advertising_config.advertising_type = AdvertisingType::ADV_IND;
317 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
318 std::vector<GapData> gap_data{};
319 GapData data_item{};
320 data_item.data_type_ = GapDataType::FLAGS;
321 data_item.data_ = {0x34};
322 gap_data.push_back(data_item);
323 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
324 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
325 gap_data.push_back(data_item);
326 advertising_config.advertisement = gap_data;
327 advertising_config.scan_response = gap_data;
328 advertising_config.channel_map = 1;
329
330 EXPECT_CALL(
331 mock_advertising_callback_,
332 OnAdvertisingSetStarted(0x00, _, 0x00, AdvertisingCallback::AdvertisingStatus::SUCCESS))
333 .WillOnce(SaveArg<1>(&advertiser_id_));
334
335 le_advertising_manager_->ExtendedCreateAdvertiser(
336 kAdvertiserClientIdJni, 0x00, advertising_config, scan_callback,
337 set_terminated_callback, 0, 0, client_handler_);
338
339 std::vector<SubOcf> sub_ocf = {
340 SubOcf::SET_PARAM,
341 SubOcf::SET_SCAN_RESP,
342 SubOcf::SET_DATA,
343 SubOcf::SET_ENABLE,
344 };
345 for (size_t i = 0; i < sub_ocf.size(); i++) {
346 auto packet = test_hci_layer_->GetCommand();
347 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
348 ASSERT_TRUE(sub_packet.IsValid());
349 ASSERT_EQ(sub_packet.GetSubCmd(), sub_ocf[i]);
350 test_hci_layer_->IncomingEvent(
351 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, sub_ocf[i]));
352 }
353
354 sync_client_handler();
355 ASSERT_NE(LeAdvertisingManager::kInvalidId, advertiser_id_);
356 }
357
358 AdvertiserId advertiser_id_;
359 };
360
361 class LeAndroidHciAdvertisingAPIPublicAddressTest : public LeAndroidHciAdvertisingManagerTest {
362 protected:
SetUp()363 void SetUp() override {
364 LeAndroidHciAdvertisingManagerTest::SetUp();
365
366 AdvertisingConfig advertising_config{};
367 advertising_config.advertising_type = AdvertisingType::ADV_IND;
368 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
369 std::vector<GapData> gap_data{};
370 GapData data_item{};
371 data_item.data_type_ = GapDataType::FLAGS;
372 data_item.data_ = {0x34};
373 gap_data.push_back(data_item);
374 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
375 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
376 gap_data.push_back(data_item);
377 advertising_config.advertisement = gap_data;
378 advertising_config.scan_response = gap_data;
379 advertising_config.channel_map = 1;
380
381 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_PUBLIC_ADDRESS);
382
383 EXPECT_CALL(
384 mock_advertising_callback_,
385 OnAdvertisingSetStarted(0x00, _, 0x00, AdvertisingCallback::AdvertisingStatus::SUCCESS))
386 .WillOnce(SaveArg<1>(&advertiser_id_));
387
388 le_advertising_manager_->ExtendedCreateAdvertiser(
389 kAdvertiserClientIdJni, 0x00, advertising_config, scan_callback,
390 set_terminated_callback, 0, 0, client_handler_);
391
392 std::vector<SubOcf> sub_ocf = {
393 SubOcf::SET_PARAM,
394 SubOcf::SET_SCAN_RESP,
395 SubOcf::SET_DATA,
396 SubOcf::SET_ENABLE,
397 };
398 for (size_t i = 0; i < sub_ocf.size(); i++) {
399 auto packet = test_hci_layer_->GetCommand();
400 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
401 ASSERT_TRUE(sub_packet.IsValid());
402 ASSERT_EQ(sub_packet.GetSubCmd(), sub_ocf[i]);
403 test_hci_layer_->IncomingEvent(
404 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, sub_ocf[i]));
405 }
406
407 sync_client_handler();
408 ASSERT_NE(LeAdvertisingManager::kInvalidId, advertiser_id_);
409 }
410
411 AdvertiserId advertiser_id_;
412 };
413
414 class LeExtendedAdvertisingManagerTest : public LeAdvertisingManagerTest {
415 protected:
SetUp()416 void SetUp() override {
417 support_ble_extended_advertising_ = true;
418 param_opcode_ = OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS;
419 LeAdvertisingManagerTest::SetUp();
420 }
421 };
422
423 class LeExtendedAdvertisingAPITest : public LeExtendedAdvertisingManagerTest {
424 protected:
SetUp()425 void SetUp() override {
426 LeExtendedAdvertisingManagerTest::SetUp();
427
428 // start advertising set
429 AdvertisingConfig advertising_config{};
430 advertising_config.advertising_type = AdvertisingType::ADV_IND;
431 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
432 std::vector<GapData> gap_data{};
433 GapData data_item{};
434 data_item.data_type_ = GapDataType::FLAGS;
435 data_item.data_ = {0x34};
436 gap_data.push_back(data_item);
437 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
438 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
439 gap_data.push_back(data_item);
440 advertising_config.advertisement = gap_data;
441 advertising_config.scan_response = gap_data;
442 advertising_config.channel_map = 1;
443 advertising_config.sid = 0x01;
444
445 EXPECT_CALL(
446 mock_advertising_callback_,
447 OnAdvertisingSetStarted(0x00, _, -23, AdvertisingCallback::AdvertisingStatus::SUCCESS))
448 .WillOnce(SaveArg<1>(&advertiser_id_));
449
450 le_advertising_manager_->ExtendedCreateAdvertiser(
451 kAdvertiserClientIdJni, 0x00, advertising_config, scan_callback,
452 set_terminated_callback, 0, 0, client_handler_);
453
454 std::vector<OpCode> adv_opcodes = {
455 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
456 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA,
457 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA,
458 OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE,
459 };
460 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
461 for (size_t i = 0; i < adv_opcodes.size(); i++) {
462 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
463 if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
464 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
465 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
466 } else {
467 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
468 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
469 }
470 }
471
472 sync_client_handler();
473 ASSERT_NE(LeAdvertisingManager::kInvalidId, advertiser_id_);
474 }
475
476 AdvertiserId advertiser_id_;
477 };
478
TEST_F(LeAdvertisingManagerTest,startup_teardown)479 TEST_F(LeAdvertisingManagerTest, startup_teardown) {}
480
TEST_F(LeAndroidHciAdvertisingManagerTest,startup_teardown)481 TEST_F(LeAndroidHciAdvertisingManagerTest, startup_teardown) {}
482
TEST_F(LeExtendedAdvertisingManagerTest,startup_teardown)483 TEST_F(LeExtendedAdvertisingManagerTest, startup_teardown) {}
484
TEST_F(LeAdvertisingManagerTest,create_advertiser_test)485 TEST_F(LeAdvertisingManagerTest, create_advertiser_test) {
486 AdvertisingConfig advertising_config{};
487 advertising_config.advertising_type = AdvertisingType::ADV_IND;
488 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
489 std::vector<GapData> gap_data{};
490 GapData data_item{};
491 data_item.data_type_ = GapDataType::FLAGS;
492 data_item.data_ = {0x34};
493 gap_data.push_back(data_item);
494 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
495 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
496 gap_data.push_back(data_item);
497 advertising_config.advertisement = gap_data;
498 advertising_config.scan_response = gap_data;
499 advertising_config.channel_map = 1;
500
501 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
502 advertising_config, scan_callback,
503 set_terminated_callback, 0, 0, client_handler_);
504 std::vector<OpCode> adv_opcodes = {
505 OpCode::LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER,
506 OpCode::LE_SET_ADVERTISING_PARAMETERS,
507 OpCode::LE_SET_SCAN_RESPONSE_DATA,
508 OpCode::LE_SET_ADVERTISING_DATA,
509 OpCode::LE_SET_ADVERTISING_ENABLE,
510 };
511
512 AdvertiserId id;
513 EXPECT_CALL(
514 mock_advertising_callback_,
515 OnAdvertisingSetStarted(0x00, _, 0x00, AdvertisingCallback::AdvertisingStatus::SUCCESS))
516 .WillOnce(SaveArg<1>(&id));
517
518 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
519 for (size_t i = 0; i < adv_opcodes.size(); i++) {
520 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
521 if (adv_opcodes[i] == OpCode::LE_READ_ADVERTISING_PHYSICAL_CHANNEL_TX_POWER) {
522 test_hci_layer_->IncomingEvent(LeReadAdvertisingPhysicalChannelTxPowerCompleteBuilder::Create(
523 uint8_t{1}, ErrorCode::SUCCESS, 0x00));
524 } else {
525 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
526 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
527 }
528 }
529 sync_client_handler();
530
531 // Disable the advertiser
532 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
533 le_advertising_manager_->RemoveAdvertiser(id);
534 ASSERT_EQ(OpCode::LE_SET_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
535 }
536
TEST_F(LeAndroidHciAdvertisingManagerTest,create_advertiser_test)537 TEST_F(LeAndroidHciAdvertisingManagerTest, create_advertiser_test) {
538 AdvertisingConfig advertising_config{};
539 advertising_config.advertising_type = AdvertisingType::ADV_IND;
540 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
541 std::vector<GapData> gap_data{};
542 GapData data_item{};
543 data_item.data_type_ = GapDataType::FLAGS;
544 data_item.data_ = {0x34};
545 gap_data.push_back(data_item);
546 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
547 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
548 gap_data.push_back(data_item);
549 advertising_config.advertisement = gap_data;
550 advertising_config.scan_response = gap_data;
551 advertising_config.channel_map = 1;
552
553 AdvertiserId id;
554 EXPECT_CALL(mock_advertising_callback_,
555 OnAdvertisingSetStarted(0, _, 0, AdvertisingCallback::AdvertisingStatus::SUCCESS))
556 .WillOnce(SaveArg<1>(&id));
557
558 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
559 advertising_config, scan_callback,
560 set_terminated_callback, 0, 0, client_handler_);
561
562 std::vector<SubOcf> sub_ocf = {
563 SubOcf::SET_PARAM,
564 SubOcf::SET_SCAN_RESP,
565 SubOcf::SET_DATA,
566 SubOcf::SET_ENABLE,
567 };
568 for (size_t i = 0; i < sub_ocf.size(); i++) {
569 auto packet = test_hci_layer_->GetCommand();
570 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
571 ASSERT_TRUE(sub_packet.IsValid());
572 ASSERT_EQ(sub_packet.GetSubCmd(), sub_ocf[i]);
573 test_hci_layer_->IncomingEvent(
574 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, sub_ocf[i]));
575 }
576 sync_client_handler();
577
578 // Disable the advertiser
579 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
580 le_advertising_manager_->RemoveAdvertiser(id);
581 ASSERT_EQ(OpCode::LE_MULTI_ADVT, test_hci_layer_->GetCommand().GetOpCode());
582 test_hci_layer_->IncomingEvent(
583 LeMultiAdvtSetEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
584 }
585
TEST_F(LeAndroidHciAdvertisingManagerTest,create_advertiser_with_rpa_test)586 TEST_F(LeAndroidHciAdvertisingManagerTest, create_advertiser_with_rpa_test) {
587 AdvertisingConfig advertising_config{};
588 advertising_config.advertising_type = AdvertisingType::ADV_IND;
589 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::RESOLVABLE_RANDOM;
590 advertising_config.channel_map = 1;
591
592 AdvertiserId id;
593 EXPECT_CALL(mock_advertising_callback_,
594 OnAdvertisingSetStarted(0, _, 0, AdvertisingCallback::AdvertisingStatus::SUCCESS))
595 .WillOnce(SaveArg<1>(&id));
596
597 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
598 advertising_config, scan_callback,
599 set_terminated_callback, 0, 0, client_handler_);
600 std::vector<SubOcf> sub_ocf = {
601 SubOcf::SET_PARAM, SubOcf::SET_SCAN_RESP, SubOcf::SET_DATA,
602 SubOcf::SET_RANDOM_ADDR, SubOcf::SET_ENABLE,
603 };
604
605 for (size_t i = 0; i < sub_ocf.size(); i++) {
606 auto packet = test_hci_layer_->GetCommand();
607 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
608 ASSERT_TRUE(sub_packet.IsValid());
609 ASSERT_EQ(sub_packet.GetSubCmd(), sub_ocf[i]);
610 test_hci_layer_->IncomingEvent(
611 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, sub_ocf[i]));
612 }
613
614 sync_client_handler();
615 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
616 }
617
TEST_F(LeExtendedAdvertisingManagerTest,create_advertiser_test)618 TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test) {
619 AdvertisingConfig advertising_config{};
620 advertising_config.advertising_type = AdvertisingType::ADV_IND;
621 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
622 std::vector<GapData> gap_data{};
623 GapData data_item{};
624 data_item.data_type_ = GapDataType::FLAGS;
625 data_item.data_ = {0x34};
626 gap_data.push_back(data_item);
627 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
628 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
629 gap_data.push_back(data_item);
630 advertising_config.advertisement = gap_data;
631 advertising_config.scan_response = gap_data;
632 advertising_config.channel_map = 1;
633 advertising_config.sid = 0x01;
634
635 AdvertiserId id;
636 EXPECT_CALL(mock_advertising_callback_,
637 OnAdvertisingSetStarted(0, _, -23, AdvertisingCallback::AdvertisingStatus::SUCCESS))
638 .WillOnce(SaveArg<1>(&id));
639
640 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
641 advertising_config, scan_callback,
642 set_terminated_callback, 0, 0, client_handler_);
643
644 std::vector<OpCode> adv_opcodes = {
645 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
646 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA,
647 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA,
648 OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE,
649 };
650 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
651 for (size_t i = 0; i < adv_opcodes.size(); i++) {
652 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
653 if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
654 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
655 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
656 } else {
657 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
658 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
659 }
660 }
661 sync_client_handler();
662
663 // Remove the advertiser
664 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
665 le_advertising_manager_->RemoveAdvertiser(id);
666 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
667 ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
668 }
669
TEST_F(LeExtendedAdvertisingManagerTest,create_periodic_advertiser_test)670 TEST_F(LeExtendedAdvertisingManagerTest, create_periodic_advertiser_test) {
671 AdvertisingConfig advertising_config{};
672 advertising_config.advertising_type = AdvertisingType::ADV_IND;
673 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
674 std::vector<GapData> gap_data{};
675 GapData data_item{};
676 data_item.data_type_ = GapDataType::FLAGS;
677 data_item.data_ = {0x34};
678 gap_data.push_back(data_item);
679 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
680 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
681 gap_data.push_back(data_item);
682 advertising_config.advertisement = gap_data;
683 advertising_config.scan_response = gap_data;
684 advertising_config.channel_map = 1;
685 advertising_config.sid = 0x01;
686 advertising_config.periodic_advertising_parameters.enable = true;
687
688 AdvertiserId id;
689 EXPECT_CALL(mock_advertising_callback_,
690 OnAdvertisingSetStarted(0, _, -23, AdvertisingCallback::AdvertisingStatus::SUCCESS))
691 .WillOnce(SaveArg<1>(&id));
692
693 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
694 advertising_config, scan_callback,
695 set_terminated_callback, 0, 0, client_handler_);
696
697 std::vector<OpCode> adv_opcodes = {
698 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
699 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA,
700 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA,
701 OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE,
702 };
703 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
704 for (size_t i = 0; i < adv_opcodes.size(); i++) {
705 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
706 if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
707 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
708 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
709 } else {
710 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
711 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
712 }
713 }
714 sync_client_handler();
715
716 // Remove the advertiser
717 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
718 le_advertising_manager_->RemoveAdvertiser(id);
719 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
720 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
721 ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
722 }
723
TEST_F(LeExtendedAdvertisingManagerTest,create_advertiser_valid_max_251_ad_data_length_test)724 TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_valid_max_251_ad_data_length_test) {
725 AdvertisingConfig advertising_config{};
726 advertising_config.advertising_type = AdvertisingType::ADV_IND;
727 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
728 std::vector<GapData> gap_data{};
729 // data length 251
730 GapData data_item{};
731 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
732 uint8_t service_data[249];
733 std::copy_n(service_data, 249, std::back_inserter(data_item.data_));
734 gap_data.push_back(data_item);
735 advertising_config.advertisement = gap_data;
736 advertising_config.scan_response = gap_data;
737 advertising_config.channel_map = 1;
738 advertising_config.sid = 0x01;
739
740 AdvertiserId id;
741 EXPECT_CALL(mock_advertising_callback_,
742 OnAdvertisingSetStarted(0, _, -23, AdvertisingCallback::AdvertisingStatus::SUCCESS))
743 .WillOnce(SaveArg<1>(&id));
744
745 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
746 advertising_config, scan_callback,
747 set_terminated_callback, 0, 0, client_handler_);
748
749 std::vector<OpCode> adv_opcodes = {
750 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
751 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA,
752 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA,
753 OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE,
754 };
755 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
756 for (size_t i = 0; i < adv_opcodes.size(); i++) {
757 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
758 if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
759 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
760 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
761 } else {
762 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
763 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
764 }
765 }
766 sync_client_handler();
767
768 // Remove the advertiser
769 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
770 le_advertising_manager_->RemoveAdvertiser(id);
771 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
772 ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
773 }
774
TEST_F(LeExtendedAdvertisingManagerTest,create_advertiser_valid_max_252_ad_data_length_fragments_test)775 TEST_F(LeExtendedAdvertisingManagerTest,
776 create_advertiser_valid_max_252_ad_data_length_fragments_test) {
777 AdvertisingConfig advertising_config{};
778 advertising_config.advertising_type = AdvertisingType::ADV_IND;
779 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
780 std::vector<GapData> gap_data{};
781 // set data 252 bytes, this should pass and be fragmented into 2 packets
782 GapData data_item{};
783 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
784 uint8_t service_data[250];
785 std::copy_n(service_data, 250, std::back_inserter(data_item.data_));
786 gap_data.push_back(data_item);
787 advertising_config.advertisement = gap_data;
788 advertising_config.scan_response = gap_data;
789 advertising_config.channel_map = 1;
790 advertising_config.sid = 0x01;
791
792 AdvertiserId id;
793 EXPECT_CALL(mock_advertising_callback_,
794 OnAdvertisingSetStarted(0, _, -23, AdvertisingCallback::AdvertisingStatus::SUCCESS))
795 .WillOnce(SaveArg<1>(&id));
796
797 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
798 advertising_config, scan_callback,
799 set_terminated_callback, 0, 0, client_handler_);
800
801 std::vector<OpCode> adv_opcodes = {
802 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
803 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, // 1st fragment
804 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, // 2nd fragment
805 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, // 1st fragment
806 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, // 2nd fragment
807 OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE,
808 };
809 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
810 for (size_t i = 0; i < adv_opcodes.size(); i++) {
811 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
812 if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
813 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
814 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
815 } else if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA) {
816 test_hci_layer_->IncomingEvent(
817 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
818 } else if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_DATA) {
819 test_hci_layer_->IncomingEvent(
820 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
821 } else {
822 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
823 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
824 }
825 }
826 sync_client_handler();
827
828 // Remove the advertiser
829 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
830 le_advertising_manager_->RemoveAdvertiser(id);
831 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
832 ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
833 }
834
TEST_F(LeExtendedAdvertisingManagerTest,create_advertiser_test_invalid_256_ad_data_length_test)835 TEST_F(LeExtendedAdvertisingManagerTest, create_advertiser_test_invalid_256_ad_data_length_test) {
836 AdvertisingConfig advertising_config{};
837 advertising_config.advertising_type = AdvertisingType::ADV_IND;
838 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
839 std::vector<GapData> gap_data{};
840
841 // set data 256 bytes, this should fail with error
842 GapData data_item{};
843 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
844 uint8_t service_data[254];
845 std::copy_n(service_data, 254, std::back_inserter(data_item.data_));
846 gap_data.push_back(data_item);
847
848 advertising_config.advertisement = gap_data;
849 advertising_config.scan_response = gap_data;
850 advertising_config.channel_map = 1;
851 advertising_config.sid = 0x01;
852
853 AdvertiserId id;
854 EXPECT_CALL(
855 mock_advertising_callback_,
856 OnAdvertisingSetStarted(0, _, _, AdvertisingCallback::AdvertisingStatus::DATA_TOO_LARGE))
857 .WillOnce(SaveArg<1>(&id));
858
859 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
860 advertising_config, scan_callback,
861 set_terminated_callback, 0, 0, client_handler_);
862
863 sync_client_handler();
864 }
865
TEST_F(LeExtendedAdvertisingManagerTest,ignore_on_pause_on_resume_after_unregistered)866 TEST_F(LeExtendedAdvertisingManagerTest, ignore_on_pause_on_resume_after_unregistered) {
867 TestLeAddressManager* test_le_address_manager =
868 (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();
869 test_le_address_manager->ignore_unregister_for_testing = true;
870
871 // Register LeAddressManager vai ExtendedCreateAdvertiser
872 AdvertisingConfig advertising_config{};
873 advertising_config.advertising_type = AdvertisingType::ADV_IND;
874 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
875 std::vector<GapData> gap_data{};
876 GapData data_item{};
877 data_item.data_type_ = GapDataType::FLAGS;
878 data_item.data_ = {0x34};
879 gap_data.push_back(data_item);
880 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
881 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
882 gap_data.push_back(data_item);
883 advertising_config.advertisement = gap_data;
884 advertising_config.scan_response = gap_data;
885 advertising_config.channel_map = 1;
886 advertising_config.sid = 0x01;
887
888 AdvertiserId id;
889 EXPECT_CALL(mock_advertising_callback_,
890 OnAdvertisingSetStarted(0, _, -23, AdvertisingCallback::AdvertisingStatus::SUCCESS))
891 .WillOnce(SaveArg<1>(&id));
892
893 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00,
894 advertising_config, scan_callback,
895 set_terminated_callback, 0, 0, client_handler_);
896
897 std::vector<OpCode> adv_opcodes = {
898 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
899 OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA,
900 OpCode::LE_SET_EXTENDED_ADVERTISING_DATA,
901 OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE,
902 };
903 std::vector<uint8_t> success_vector{static_cast<uint8_t>(ErrorCode::SUCCESS)};
904 for (size_t i = 0; i < adv_opcodes.size(); i++) {
905 ASSERT_EQ(adv_opcodes[i], test_hci_layer_->GetCommand().GetOpCode());
906 if (adv_opcodes[i] == OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS) {
907 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
908 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
909 } else {
910 test_hci_layer_->IncomingEvent(CommandCompleteBuilder::Create(
911 uint8_t{1}, adv_opcodes[i], std::make_unique<RawBuilder>(success_vector)));
912 }
913 }
914 sync_client_handler();
915
916 // Unregister LeAddressManager vai RemoveAdvertiser
917 ASSERT_NE(LeAdvertisingManager::kInvalidId, id);
918 le_advertising_manager_->RemoveAdvertiser(id);
919 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
920 ASSERT_EQ(OpCode::LE_REMOVE_ADVERTISING_SET, test_hci_layer_->GetCommand().GetOpCode());
921 sync_client_handler();
922
923 // Unregistered client should ignore OnPause/OnResume
924 ASSERT_NE(test_le_address_manager->client_, nullptr);
925 ASSERT_EQ(test_le_address_manager->test_client_state_,
926 TestLeAddressManager::TestClientState::UNREGISTERED);
927 test_le_address_manager->client_->OnPause();
928 ASSERT_EQ(test_le_address_manager->test_client_state_,
929 TestLeAddressManager::TestClientState::UNREGISTERED);
930 test_le_address_manager->client_->OnResume();
931 ASSERT_EQ(test_le_address_manager->test_client_state_,
932 TestLeAddressManager::TestClientState::UNREGISTERED);
933 }
934
TEST_F(LeAdvertisingAPITest,startup_teardown)935 TEST_F(LeAdvertisingAPITest, startup_teardown) {}
936
TEST_F(LeAndroidHciAdvertisingAPITest,startup_teardown)937 TEST_F(LeAndroidHciAdvertisingAPITest, startup_teardown) {}
938
TEST_F(LeAndroidHciAdvertisingAPIPublicAddressTest,startup_teardown)939 TEST_F(LeAndroidHciAdvertisingAPIPublicAddressTest, startup_teardown) {}
940
TEST_F(LeExtendedAdvertisingAPITest,startup_teardown)941 TEST_F(LeExtendedAdvertisingAPITest, startup_teardown) {}
942
TEST_F(LeAdvertisingAPITest,set_parameter)943 TEST_F(LeAdvertisingAPITest, set_parameter) {
944 AdvertisingConfig advertising_config{};
945 advertising_config.advertising_type = AdvertisingType::ADV_IND;
946 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
947 std::vector<GapData> gap_data{};
948 GapData data_item{};
949 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
950 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
951 gap_data.push_back(data_item);
952 advertising_config.advertisement = gap_data;
953 advertising_config.channel_map = 1;
954 le_advertising_manager_->SetParameters(advertiser_id_, advertising_config);
955 ASSERT_EQ(OpCode::LE_SET_ADVERTISING_PARAMETERS, test_hci_layer_->GetCommand().GetOpCode());
956 EXPECT_CALL(mock_advertising_callback_,
957 OnAdvertisingParametersUpdated(advertiser_id_, 0x00,
958 AdvertisingCallback::AdvertisingStatus::SUCCESS));
959 test_hci_layer_->IncomingEvent(
960 LeSetAdvertisingParametersCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
961 }
962
TEST_F(LeAndroidHciAdvertisingAPITest,set_parameter)963 TEST_F(LeAndroidHciAdvertisingAPITest, set_parameter) {
964 AdvertisingConfig advertising_config{};
965 advertising_config.advertising_type = AdvertisingType::ADV_IND;
966 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
967 std::vector<GapData> gap_data{};
968 GapData data_item{};
969 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
970 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
971 gap_data.push_back(data_item);
972 advertising_config.advertisement = gap_data;
973 advertising_config.channel_map = 1;
974 le_advertising_manager_->SetParameters(advertiser_id_, advertising_config);
975 auto packet = test_hci_layer_->GetCommand();
976 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
977 ASSERT_TRUE(sub_packet.IsValid());
978 ASSERT_EQ(sub_packet.GetSubCmd(), SubOcf::SET_PARAM);
979 EXPECT_CALL(mock_advertising_callback_,
980 OnAdvertisingParametersUpdated(advertiser_id_, 0x00,
981 AdvertisingCallback::AdvertisingStatus::SUCCESS));
982 test_hci_layer_->IncomingEvent(
983 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, SubOcf::SET_PARAM));
984 }
985
TEST_F(LeExtendedAdvertisingAPITest,set_parameter)986 TEST_F(LeExtendedAdvertisingAPITest, set_parameter) {
987 AdvertisingConfig advertising_config{};
988 advertising_config.advertising_type = AdvertisingType::ADV_IND;
989 advertising_config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
990 std::vector<GapData> gap_data{};
991 GapData data_item{};
992 data_item.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
993 data_item.data_ = {'r', 'a', 'n', 'd', 'o', 'm', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
994 gap_data.push_back(data_item);
995 advertising_config.advertisement = gap_data;
996 advertising_config.channel_map = 1;
997 advertising_config.sid = 0x01;
998 advertising_config.tx_power = 0x08;
999 le_advertising_manager_->SetParameters(advertiser_id_, advertising_config);
1000 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS,
1001 test_hci_layer_->GetCommand().GetOpCode());
1002 EXPECT_CALL(mock_advertising_callback_,
1003 OnAdvertisingParametersUpdated(advertiser_id_, 0x08,
1004 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1005 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
1006 uint8_t{1}, ErrorCode::SUCCESS, 0x08));
1007 }
1008
TEST_F(LeAdvertisingAPITest,set_data_test)1009 TEST_F(LeAdvertisingAPITest, set_data_test) {
1010 // Set advertising data
1011 std::vector<GapData> advertising_data{};
1012 GapData data_item{};
1013 data_item.data_type_ = GapDataType::TX_POWER_LEVEL;
1014 data_item.data_ = {0x00};
1015 advertising_data.push_back(data_item);
1016 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1017 ASSERT_EQ(OpCode::LE_SET_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1018 EXPECT_CALL(
1019 mock_advertising_callback_,
1020 OnAdvertisingDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1021 test_hci_layer_->IncomingEvent(
1022 LeSetAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1023
1024 // Set scan response data
1025 std::vector<GapData> response_data{};
1026 GapData data_item2{};
1027 data_item2.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
1028 data_item2.data_ = {'t', 'e', 's', 't', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
1029 response_data.push_back(data_item2);
1030 le_advertising_manager_->SetData(advertiser_id_, true, response_data);
1031 ASSERT_EQ(OpCode::LE_SET_SCAN_RESPONSE_DATA, test_hci_layer_->GetCommand().GetOpCode());
1032 EXPECT_CALL(
1033 mock_advertising_callback_,
1034 OnScanResponseDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1035 test_hci_layer_->IncomingEvent(
1036 LeSetScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1037 }
1038
TEST_F(LeExtendedAdvertisingAPITest,set_data_test)1039 TEST_F(LeExtendedAdvertisingAPITest, set_data_test) {
1040 // Set advertising data
1041 std::vector<GapData> advertising_data{};
1042 GapData data_item{};
1043 data_item.data_type_ = GapDataType::TX_POWER_LEVEL;
1044 data_item.data_ = {0x00};
1045 advertising_data.push_back(data_item);
1046 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1047 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1048 EXPECT_CALL(
1049 mock_advertising_callback_,
1050 OnAdvertisingDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1051 test_hci_layer_->IncomingEvent(
1052 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1053
1054 // Set scan response data
1055 std::vector<GapData> response_data{};
1056 GapData data_item2{};
1057 data_item2.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
1058 data_item2.data_ = {'t', 'e', 's', 't', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
1059 response_data.push_back(data_item2);
1060 le_advertising_manager_->SetData(advertiser_id_, true, response_data);
1061 ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, test_hci_layer_->GetCommand().GetOpCode());
1062 EXPECT_CALL(
1063 mock_advertising_callback_,
1064 OnScanResponseDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1065 test_hci_layer_->IncomingEvent(
1066 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1067 }
1068
TEST_F(LeAndroidHciAdvertisingAPITest,set_data_test)1069 TEST_F(LeAndroidHciAdvertisingAPITest, set_data_test) {
1070 // Set advertising data
1071 std::vector<GapData> advertising_data{};
1072 GapData data_item{};
1073 data_item.data_type_ = GapDataType::TX_POWER_LEVEL;
1074 data_item.data_ = {0x00};
1075 advertising_data.push_back(data_item);
1076 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1077 auto packet = test_hci_layer_->GetCommand();
1078 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
1079 ASSERT_TRUE(sub_packet.IsValid());
1080 ASSERT_EQ(sub_packet.GetSubCmd(), SubOcf::SET_DATA);
1081 EXPECT_CALL(
1082 mock_advertising_callback_,
1083 OnAdvertisingDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1084 test_hci_layer_->IncomingEvent(
1085 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, SubOcf::SET_DATA));
1086
1087 // Set scan response data
1088 std::vector<GapData> response_data{};
1089 GapData data_item2{};
1090 data_item2.data_type_ = GapDataType::COMPLETE_LOCAL_NAME;
1091 data_item2.data_ = {'t', 'e', 's', 't', ' ', 'd', 'e', 'v', 'i', 'c', 'e'};
1092 response_data.push_back(data_item2);
1093 le_advertising_manager_->SetData(advertiser_id_, true, response_data);
1094 packet = test_hci_layer_->GetCommand();
1095 sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
1096 ASSERT_TRUE(sub_packet.IsValid());
1097 ASSERT_EQ(sub_packet.GetSubCmd(), SubOcf::SET_SCAN_RESP);
1098 EXPECT_CALL(
1099 mock_advertising_callback_,
1100 OnScanResponseDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1101 test_hci_layer_->IncomingEvent(LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS,
1102 SubOcf::SET_SCAN_RESP));
1103 }
1104
TEST_F(LeExtendedAdvertisingAPITest,set_data_fragments_test)1105 TEST_F(LeExtendedAdvertisingAPITest, set_data_fragments_test) {
1106 // Set advertising data
1107 std::vector<GapData> advertising_data{};
1108 for (uint8_t i = 0; i < 3; i++) {
1109 GapData data_item{};
1110 data_item.data_.push_back(0xda);
1111 data_item.data_type_ = GapDataType::SERVICE_DATA_128_BIT_UUIDS;
1112 uint8_t uuid[16] = {0xf0, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1113 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, i};
1114 std::copy_n(uuid, 16, std::back_inserter(data_item.data_));
1115 uint8_t service_data[200];
1116 std::copy_n(service_data, 200, std::back_inserter(data_item.data_));
1117 advertising_data.push_back(data_item);
1118 }
1119 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1120
1121 // First fragment
1122 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1123 // Intermediate fragment
1124 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1125 // Last fragment
1126 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1127
1128 EXPECT_CALL(
1129 mock_advertising_callback_,
1130 OnAdvertisingDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1131 test_hci_layer_->IncomingEvent(
1132 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1133 test_hci_layer_->IncomingEvent(
1134 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1135 test_hci_layer_->IncomingEvent(
1136 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1137 }
1138
TEST_F(LeExtendedAdvertisingAPITest,set_scan_response_fragments_test)1139 TEST_F(LeExtendedAdvertisingAPITest, set_scan_response_fragments_test) {
1140 // Set advertising data
1141 std::vector<GapData> advertising_data{};
1142 for (uint8_t i = 0; i < 3; i++) {
1143 GapData data_item{};
1144 data_item.data_.push_back(0xfa);
1145 data_item.data_type_ = GapDataType::SERVICE_DATA_128_BIT_UUIDS;
1146 uint8_t uuid[16] = {0xf0, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1147 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, i};
1148 std::copy_n(uuid, 16, std::back_inserter(data_item.data_));
1149 uint8_t service_data[232];
1150 std::copy_n(service_data, 232, std::back_inserter(data_item.data_));
1151 advertising_data.push_back(data_item);
1152 }
1153 le_advertising_manager_->SetData(advertiser_id_, true, advertising_data);
1154
1155 // First fragment
1156 ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, test_hci_layer_->GetCommand().GetOpCode());
1157 // Intermediate fragment
1158 ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, test_hci_layer_->GetCommand().GetOpCode());
1159 // Last fragment
1160 ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, test_hci_layer_->GetCommand().GetOpCode());
1161
1162 EXPECT_CALL(
1163 mock_advertising_callback_,
1164 OnScanResponseDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1165 test_hci_layer_->IncomingEvent(
1166 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1167 test_hci_layer_->IncomingEvent(
1168 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1169 test_hci_layer_->IncomingEvent(
1170 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1171 }
1172
TEST_F(LeExtendedAdvertisingAPITest,set_data_with_invalid_length)1173 TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_length) {
1174 // Set advertising data with data that greater than le_maximum_advertising_data_length_
1175 std::vector<GapData> advertising_data{};
1176 for (uint8_t i = 0; i < 10; i++) {
1177 GapData data_item{};
1178 data_item.data_.push_back(0xfb);
1179 data_item.data_type_ = GapDataType::SERVICE_DATA_128_BIT_UUIDS;
1180 uint8_t uuid[16] = {0xf0, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1181 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, i};
1182 std::copy_n(uuid, 16, std::back_inserter(data_item.data_));
1183 uint8_t service_data[200];
1184 std::copy_n(service_data, 200, std::back_inserter(data_item.data_));
1185 advertising_data.push_back(data_item);
1186 }
1187
1188 EXPECT_CALL(mock_advertising_callback_,
1189 OnAdvertisingDataSet(advertiser_id_,
1190 AdvertisingCallback::AdvertisingStatus::DATA_TOO_LARGE));
1191 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1192
1193 EXPECT_CALL(mock_advertising_callback_,
1194 OnScanResponseDataSet(advertiser_id_,
1195 AdvertisingCallback::AdvertisingStatus::DATA_TOO_LARGE));
1196 le_advertising_manager_->SetData(advertiser_id_, true, advertising_data);
1197
1198 sync_client_handler();
1199 }
1200
TEST_F(LeExtendedAdvertisingAPITest,set_data_valid_max_251_ad_data_length_test)1201 TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_max_251_ad_data_length_test) {
1202 // Set advertising data
1203 std::vector<GapData> advertising_data{};
1204 // set data 251 bytes
1205 GapData data_item{};
1206 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1207 uint8_t service_data[249];
1208 std::copy_n(service_data, 249, std::back_inserter(data_item.data_));
1209 advertising_data.push_back(data_item);
1210
1211 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1212 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1213 EXPECT_CALL(
1214 mock_advertising_callback_,
1215 OnAdvertisingDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1216 test_hci_layer_->IncomingEvent(
1217 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1218
1219 // Set scan response data
1220 std::vector<GapData> response_data{};
1221 // set data 251 bytes
1222 GapData data_item2{};
1223 data_item2.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1224 std::copy_n(service_data, 249, std::back_inserter(data_item2.data_));
1225 response_data.push_back(data_item2);
1226
1227 le_advertising_manager_->SetData(advertiser_id_, true, response_data);
1228 ASSERT_EQ(OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA, test_hci_layer_->GetCommand().GetOpCode());
1229 EXPECT_CALL(
1230 mock_advertising_callback_,
1231 OnScanResponseDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1232 test_hci_layer_->IncomingEvent(
1233 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1234 }
1235
TEST_F(LeExtendedAdvertisingAPITest,set_data_valid_252_ad_data_length_fragments_test)1236 TEST_F(LeExtendedAdvertisingAPITest, set_data_valid_252_ad_data_length_fragments_test) {
1237 // Set advertising data
1238 std::vector<GapData> advertising_data{};
1239 // set data 252 bytes
1240 GapData data_item{};
1241 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1242 uint8_t service_data[250];
1243 std::copy_n(service_data, 250, std::back_inserter(data_item.data_));
1244 advertising_data.push_back(data_item);
1245
1246 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1247
1248 // First fragment
1249 auto command = test_hci_layer_->GetCommand();
1250 ASSERT_EQ(command.GetOpCode(), OpCode::LE_SET_EXTENDED_ADVERTISING_DATA);
1251 ASSERT_EQ(1ul /* Advertising_Handle */ + 1ul /* Operation */ + 1ul /* Fragment_Preference */
1252 + 1ul /*Advertising_Data_Length*/ +
1253 251ul /* Max data length 251 includes AD length and type */,
1254 command.GetPayload().size());
1255 // Second fragment
1256 auto command2 = test_hci_layer_->GetCommand();
1257 ASSERT_EQ(command2.GetOpCode(), OpCode::LE_SET_EXTENDED_ADVERTISING_DATA);
1258 ASSERT_EQ(1ul /* Advertising_Handle */ + 1ul /* Operation */ + 1ul /* Fragment_Preference */
1259 + 1ul /*Advertising_Data_Length*/ + 1ul /* Remaining 1 byte data */,
1260 command2.GetPayload().size());
1261
1262 EXPECT_CALL(
1263 mock_advertising_callback_,
1264 OnAdvertisingDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1265 test_hci_layer_->IncomingEvent(
1266 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1267 test_hci_layer_->IncomingEvent(
1268 LeSetExtendedAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1269
1270 // Set scan response data
1271 std::vector<GapData> response_data{};
1272 // set data 252 bytes, this should pass and be fragmented into 2 packets
1273 GapData data_item2{};
1274 data_item2.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1275 std::copy_n(service_data, 250, std::back_inserter(data_item2.data_));
1276 response_data.push_back(data_item2);
1277
1278 le_advertising_manager_->SetData(advertiser_id_, true, response_data);
1279
1280 // First fragment
1281 command = test_hci_layer_->GetCommand();
1282 ASSERT_EQ(command.GetOpCode(), OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA);
1283 ASSERT_EQ(1ul /* Advertising_Handle */ + 1ul /* Operation */ + 1ul /* Fragment_Preference */
1284 + 1ul /*Advertising_Data_Length*/ +
1285 251ul /* Max data length 251 includes AD length and type */,
1286 command.GetPayload().size());
1287 // Second fragment
1288 command2 = test_hci_layer_->GetCommand();
1289 ASSERT_EQ(command2.GetOpCode(), OpCode::LE_SET_EXTENDED_SCAN_RESPONSE_DATA);
1290 ASSERT_EQ(1ul /* Advertising_Handle */ + 1ul /* Operation */ + 1ul /* Fragment_Preference */
1291 + 1ul /*Advertising_Data_Length*/ + 1ul /* Remaining 1 byte data */,
1292 command2.GetPayload().size());
1293
1294 EXPECT_CALL(
1295 mock_advertising_callback_,
1296 OnScanResponseDataSet(advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1297 test_hci_layer_->IncomingEvent(
1298 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1299 test_hci_layer_->IncomingEvent(
1300 LeSetExtendedScanResponseDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1301 }
1302
TEST_F(LeExtendedAdvertisingAPITest,set_data_with_invalid_256_ad_data_length_test)1303 TEST_F(LeExtendedAdvertisingAPITest, set_data_with_invalid_256_ad_data_length_test) {
1304 // Set advertising data with data that greater than le_maximum_advertising_data_length_
1305 std::vector<GapData> advertising_data{};
1306
1307 // set data 256 bytes, this should fail with error
1308 GapData data_item{};
1309 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1310 uint8_t service_data[254];
1311 std::copy_n(service_data, 254, std::back_inserter(data_item.data_));
1312 advertising_data.push_back(data_item);
1313
1314 EXPECT_CALL(mock_advertising_callback_,
1315 OnAdvertisingDataSet(advertiser_id_,
1316 AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR));
1317 le_advertising_manager_->SetData(advertiser_id_, false, advertising_data);
1318
1319 EXPECT_CALL(mock_advertising_callback_,
1320 OnScanResponseDataSet(advertiser_id_,
1321 AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR));
1322 le_advertising_manager_->SetData(advertiser_id_, true, advertising_data);
1323
1324 sync_client_handler();
1325 }
1326
TEST_F(LeAdvertisingAPITest,disable_enable_advertiser_test)1327 TEST_F(LeAdvertisingAPITest, disable_enable_advertiser_test) {
1328 // disable advertiser
1329 le_advertising_manager_->EnableAdvertiser(advertiser_id_, false, 0x00, 0x00);
1330 ASSERT_EQ(OpCode::LE_SET_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1331 EXPECT_CALL(mock_advertising_callback_,
1332 OnAdvertisingEnabled(advertiser_id_, false,
1333 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1334 test_hci_layer_->IncomingEvent(
1335 LeSetAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1336 sync_client_handler();
1337
1338 // enable advertiser
1339 le_advertising_manager_->EnableAdvertiser(advertiser_id_, true, 0x00, 0x00);
1340 ASSERT_EQ(OpCode::LE_SET_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1341 EXPECT_CALL(mock_advertising_callback_,
1342 OnAdvertisingEnabled(advertiser_id_, true,
1343 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1344 test_hci_layer_->IncomingEvent(
1345 LeSetAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1346 }
1347
TEST_F(LeAndroidHciAdvertisingAPITest,disable_enable_advertiser_test)1348 TEST_F(LeAndroidHciAdvertisingAPITest, disable_enable_advertiser_test) {
1349 // disable advertiser
1350 le_advertising_manager_->EnableAdvertiser(advertiser_id_, false, 0x00, 0x00);
1351 auto packet = test_hci_layer_->GetCommand();
1352 auto sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
1353 ASSERT_TRUE(sub_packet.IsValid());
1354 ASSERT_EQ(sub_packet.GetSubCmd(), SubOcf::SET_ENABLE);
1355 EXPECT_CALL(mock_advertising_callback_,
1356 OnAdvertisingEnabled(advertiser_id_, false,
1357 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1358 test_hci_layer_->IncomingEvent(
1359 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, SubOcf::SET_ENABLE));
1360 sync_client_handler();
1361
1362 // enable advertiser
1363 le_advertising_manager_->EnableAdvertiser(advertiser_id_, true, 0x00, 0x00);
1364 packet = test_hci_layer_->GetCommand();
1365 sub_packet = LeMultiAdvtView::Create(LeAdvertisingCommandView::Create(packet));
1366 ASSERT_TRUE(sub_packet.IsValid());
1367 ASSERT_EQ(sub_packet.GetSubCmd(), SubOcf::SET_ENABLE);
1368 EXPECT_CALL(mock_advertising_callback_,
1369 OnAdvertisingEnabled(advertiser_id_, true,
1370 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1371 test_hci_layer_->IncomingEvent(
1372 LeMultiAdvtCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS, SubOcf::SET_ENABLE));
1373 }
1374
TEST_F(LeExtendedAdvertisingAPITest,disable_enable_advertiser_test)1375 TEST_F(LeExtendedAdvertisingAPITest, disable_enable_advertiser_test) {
1376 // disable advertiser
1377 le_advertising_manager_->EnableAdvertiser(advertiser_id_, false, 0x00, 0x00);
1378 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1379 EXPECT_CALL(mock_advertising_callback_,
1380 OnAdvertisingEnabled(advertiser_id_, false,
1381 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1382 test_hci_layer_->IncomingEvent(
1383 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1384 sync_client_handler();
1385
1386 // enable advertiser
1387 le_advertising_manager_->EnableAdvertiser(advertiser_id_, true, 0x00, 0x00);
1388 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1389 EXPECT_CALL(mock_advertising_callback_,
1390 OnAdvertisingEnabled(advertiser_id_, true,
1391 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1392 test_hci_layer_->IncomingEvent(
1393 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1394 }
1395
TEST_F(LeExtendedAdvertisingAPITest,disable_after_enable)1396 TEST_F(LeExtendedAdvertisingAPITest, disable_after_enable) {
1397 // we expect Started -> Enable(false) -> Enable(true) -> Enable(false)
1398
1399 // setup already arranges everything and starts the advertiser
1400
1401 // expect
1402 InSequence s;
1403 EXPECT_CALL(mock_advertising_callback_, OnAdvertisingEnabled(_, false, _));
1404 EXPECT_CALL(mock_advertising_callback_, OnAdvertisingEnabled(_, true, _));
1405 EXPECT_CALL(mock_advertising_callback_, OnAdvertisingEnabled(_, false, _));
1406 EXPECT_CALL(mock_advertising_callback_, OnAdvertisingEnabled(_, true, _));
1407
1408 // act
1409
1410 // disable
1411 le_advertising_manager_->EnableAdvertiser(advertiser_id_, false, 0x00, 0x00);
1412 test_hci_layer_->GetCommand();
1413 test_hci_layer_->IncomingEvent(
1414 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1415
1416 // enable
1417 le_advertising_manager_->EnableAdvertiser(advertiser_id_, true, 0x00, 0x00);
1418 test_hci_layer_->GetCommand();
1419 test_hci_layer_->IncomingEvent(
1420 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1421
1422 // disable
1423 le_advertising_manager_->EnableAdvertiser(advertiser_id_, false, 0x00, 0x00);
1424 test_hci_layer_->GetCommand();
1425 test_hci_layer_->IncomingEvent(
1426 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1427
1428 // enable
1429 le_advertising_manager_->EnableAdvertiser(advertiser_id_, true, 0x00, 0x00);
1430 test_hci_layer_->GetCommand();
1431 test_hci_layer_->IncomingEvent(
1432 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1433
1434 sync_client_handler();
1435 }
1436
TEST_F(LeExtendedAdvertisingAPITest,set_periodic_parameter)1437 TEST_F(LeExtendedAdvertisingAPITest, set_periodic_parameter) {
1438 PeriodicAdvertisingParameters advertising_config{};
1439 advertising_config.max_interval = 0x1000;
1440 advertising_config.min_interval = 0x0006;
1441 le_advertising_manager_->SetPeriodicParameters(advertiser_id_, advertising_config);
1442 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_PARAMETERS,
1443 test_hci_layer_->GetCommand().GetOpCode());
1444 EXPECT_CALL(mock_advertising_callback_,
1445 OnPeriodicAdvertisingParametersUpdated(
1446 advertiser_id_, AdvertisingCallback::AdvertisingStatus::SUCCESS));
1447 test_hci_layer_->IncomingEvent(LeSetPeriodicAdvertisingParametersCompleteBuilder::Create(
1448 uint8_t{1}, ErrorCode::SUCCESS));
1449 sync_client_handler();
1450 }
1451
TEST_F(LeExtendedAdvertisingAPITest,set_periodic_data_test)1452 TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_test) {
1453 // Set advertising data
1454 std::vector<GapData> advertising_data{};
1455 GapData data_item{};
1456 data_item.data_type_ = GapDataType::TX_POWER_LEVEL;
1457 data_item.data_ = {0x00};
1458 advertising_data.push_back(data_item);
1459 le_advertising_manager_->SetPeriodicData(advertiser_id_, advertising_data);
1460 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1461 EXPECT_CALL(mock_advertising_callback_,
1462 OnPeriodicAdvertisingDataSet(advertiser_id_,
1463 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1464 test_hci_layer_->IncomingEvent(
1465 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1466 sync_client_handler();
1467 }
1468
TEST_F(LeExtendedAdvertisingAPITest,set_periodic_data_fragments_test)1469 TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_fragments_test) {
1470 // Set advertising data
1471 std::vector<GapData> advertising_data{};
1472 for (uint8_t i = 0; i < 3; i++) {
1473 GapData data_item{};
1474 data_item.data_.push_back(0xfa);
1475 data_item.data_type_ = GapDataType::SERVICE_DATA_128_BIT_UUIDS;
1476 uint8_t uuid[16] = {0xf0, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1477 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, i};
1478 std::copy_n(uuid, 16, std::back_inserter(data_item.data_));
1479 uint8_t service_data[232];
1480 std::copy_n(service_data, 232, std::back_inserter(data_item.data_));
1481 advertising_data.push_back(data_item);
1482 }
1483 le_advertising_manager_->SetPeriodicData(advertiser_id_, advertising_data);
1484
1485 // First fragment
1486 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1487 // Intermediate fragment
1488 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1489 // Last fragment
1490 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1491
1492 EXPECT_CALL(mock_advertising_callback_,
1493 OnPeriodicAdvertisingDataSet(advertiser_id_,
1494 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1495 test_hci_layer_->IncomingEvent(
1496 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1497 test_hci_layer_->IncomingEvent(
1498 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1499 test_hci_layer_->IncomingEvent(
1500 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1501 }
1502
TEST_F(LeExtendedAdvertisingAPITest,set_periodic_data_valid_max_252_ad_data_length_test)1503 TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_max_252_ad_data_length_test) {
1504 // Set advertising data
1505 std::vector<GapData> advertising_data{};
1506
1507 // set data 252 bytes, this should pass and be sent in 1 packet
1508 GapData data_item{};
1509 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1510 uint8_t service_data[250];
1511 std::copy_n(service_data, 250, std::back_inserter(data_item.data_));
1512 advertising_data.push_back(data_item);
1513
1514 le_advertising_manager_->SetPeriodicData(advertiser_id_, advertising_data);
1515
1516 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_DATA, test_hci_layer_->GetCommand().GetOpCode());
1517 EXPECT_CALL(mock_advertising_callback_,
1518 OnPeriodicAdvertisingDataSet(advertiser_id_,
1519 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1520 test_hci_layer_->IncomingEvent(
1521 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1522 sync_client_handler();
1523 }
1524
TEST_F(LeExtendedAdvertisingAPITest,set_periodic_data_valid_253_ad_data_length_fragments_test)1525 TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_valid_253_ad_data_length_fragments_test) {
1526 // Set advertising data
1527 std::vector<GapData> advertising_data{};
1528
1529 // set data 253 bytes, this should pass and be fragmented into 2 packets
1530 GapData data_item{};
1531 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1532 uint8_t service_data[251];
1533 std::copy_n(service_data, 251, std::back_inserter(data_item.data_));
1534 advertising_data.push_back(data_item);
1535
1536 le_advertising_manager_->SetPeriodicData(advertiser_id_, advertising_data);
1537
1538 // First fragment
1539 auto command = test_hci_layer_->GetCommand();
1540 ASSERT_EQ(command.GetOpCode(), OpCode::LE_SET_PERIODIC_ADVERTISING_DATA);
1541 ASSERT_EQ(1ul /* Advertising_Handle */ + 1ul /* Operation */ + 1ul /*Advertising_Data_Length*/
1542 + 252ul /* Max data length 252 includes AD length and type */,
1543 command.GetPayload().size());
1544 // Second fragment
1545 auto command2 = test_hci_layer_->GetCommand();
1546 ASSERT_EQ(command2.GetOpCode(), OpCode::LE_SET_PERIODIC_ADVERTISING_DATA);
1547 ASSERT_EQ(1ul /* Advertising_Handle */ + 1ul /* Operation */ + 1ul /*Advertising_Data_Length*/
1548 + 1ul /* Remaining 1 byte data */,
1549 command2.GetPayload().size());
1550
1551 EXPECT_CALL(mock_advertising_callback_,
1552 OnPeriodicAdvertisingDataSet(advertiser_id_,
1553 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1554 test_hci_layer_->IncomingEvent(
1555 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1556 test_hci_layer_->IncomingEvent(
1557 LeSetPeriodicAdvertisingDataCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1558 }
1559
TEST_F(LeExtendedAdvertisingAPITest,set_periodic_data_invalid_256_ad_data_length_test)1560 TEST_F(LeExtendedAdvertisingAPITest, set_periodic_data_invalid_256_ad_data_length_test) {
1561 // Set advertising data
1562 std::vector<GapData> advertising_data{};
1563
1564 // set data 256 bytes, this should fail with error
1565 GapData data_item{};
1566 data_item.data_type_ = GapDataType::MANUFACTURER_SPECIFIC_DATA;
1567 uint8_t service_data[254];
1568 std::copy_n(service_data, 254, std::back_inserter(data_item.data_));
1569 advertising_data.push_back(data_item);
1570
1571 EXPECT_CALL(mock_advertising_callback_,
1572 OnPeriodicAdvertisingDataSet(advertiser_id_,
1573 AdvertisingCallback::AdvertisingStatus::INTERNAL_ERROR));
1574 le_advertising_manager_->SetPeriodicData(advertiser_id_, advertising_data);
1575
1576 sync_client_handler();
1577 }
1578
TEST_F(LeExtendedAdvertisingAPITest,set_perodic_data_with_invalid_length)1579 TEST_F(LeExtendedAdvertisingAPITest, set_perodic_data_with_invalid_length) {
1580 // Set advertising data with data that greater than le_maximum_advertising_data_length_
1581 std::vector<GapData> advertising_data{};
1582 for (uint8_t i = 0; i < 10; i++) {
1583 GapData data_item{};
1584 data_item.data_.push_back(0xfb);
1585 data_item.data_type_ = GapDataType::SERVICE_DATA_128_BIT_UUIDS;
1586 uint8_t uuid[16] = {0xf0, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
1587 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, i};
1588 std::copy_n(uuid, 16, std::back_inserter(data_item.data_));
1589 uint8_t service_data[200];
1590 std::copy_n(service_data, 200, std::back_inserter(data_item.data_));
1591 advertising_data.push_back(data_item);
1592 }
1593
1594 EXPECT_CALL(mock_advertising_callback_,
1595 OnPeriodicAdvertisingDataSet(advertiser_id_,
1596 AdvertisingCallback::AdvertisingStatus::DATA_TOO_LARGE));
1597 le_advertising_manager_->SetPeriodicData(advertiser_id_, advertising_data);
1598
1599 sync_client_handler();
1600 }
1601
TEST_F(LeExtendedAdvertisingAPITest,disable_enable_periodic_advertiser_test)1602 TEST_F(LeExtendedAdvertisingAPITest, disable_enable_periodic_advertiser_test) {
1603 // disable advertiser
1604 le_advertising_manager_->EnablePeriodicAdvertising(advertiser_id_, false, false);
1605 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1606 EXPECT_CALL(mock_advertising_callback_,
1607 OnPeriodicAdvertisingEnabled(advertiser_id_, false,
1608 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1609 test_hci_layer_->IncomingEvent(
1610 LeSetPeriodicAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1611 sync_client_handler();
1612
1613 // enable advertiser
1614 le_advertising_manager_->EnablePeriodicAdvertising(advertiser_id_, true, false);
1615 ASSERT_EQ(OpCode::LE_SET_PERIODIC_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1616 EXPECT_CALL(mock_advertising_callback_,
1617 OnPeriodicAdvertisingEnabled(advertiser_id_, true,
1618 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1619 test_hci_layer_->IncomingEvent(
1620 LeSetPeriodicAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1621 sync_client_handler();
1622 }
1623
TEST_F(LeExtendedAdvertisingAPITest,trigger_advertiser_callbacks_if_started_while_paused)1624 TEST_F(LeExtendedAdvertisingAPITest, trigger_advertiser_callbacks_if_started_while_paused) {
1625 // arrange
1626 auto test_le_address_manager = (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();
1627 auto id_promise = std::promise<uint8_t>{};
1628 auto id_future = id_promise.get_future();
1629 le_advertising_manager_->RegisterAdvertiser(client_handler_->BindOnce(
1630 [](std::promise<uint8_t> promise, uint8_t id,
1631 AdvertisingCallback::AdvertisingStatus /* _status */) { promise.set_value(id); },
1632 std::move(id_promise)));
1633 sync_client_handler();
1634 auto set_id = id_future.get();
1635
1636 auto status_promise = std::promise<ErrorCode>{};
1637 auto status_future = status_promise.get_future();
1638
1639 test_le_address_manager->client_->OnPause();
1640
1641 test_hci_layer_->GetCommand();
1642 test_hci_layer_->IncomingEvent(
1643 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1644 sync_client_handler();
1645
1646 // act
1647 le_advertising_manager_->StartAdvertising(
1648 set_id, {}, 0,
1649 base::BindOnce([](std::promise<ErrorCode> promise,
1650 uint8_t status) { promise.set_value((ErrorCode)status); },
1651 std::move(status_promise)),
1652 base::Bind([](uint8_t /* _status */) {}),
1653 base::Bind([](Address /* _address */, AddressType /* _address_type */) {}),
1654 base::Bind(
1655 [](ErrorCode /* _status */, uint8_t /* _unused_1 */, uint8_t /* _unused_2 */) {}),
1656 client_handler_);
1657
1658 test_hci_layer_->GetCommand();
1659 test_hci_layer_->IncomingEvent(
1660 LeSetExtendedAdvertisingParametersCompleteBuilder::Create(1, ErrorCode::SUCCESS, 0));
1661
1662 test_hci_layer_->GetCommand();
1663 test_hci_layer_->IncomingEvent(
1664 LeSetExtendedScanResponseDataCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1665
1666 test_hci_layer_->GetCommand();
1667 test_hci_layer_->IncomingEvent(
1668 LeSetExtendedAdvertisingDataCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1669
1670 EXPECT_EQ(status_future.wait_for(std::chrono::milliseconds(100)), std::future_status::timeout);
1671
1672 test_le_address_manager->client_->OnResume();
1673
1674 test_hci_layer_->GetCommand();
1675 test_hci_layer_->IncomingEvent(
1676 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1677
1678 // assert
1679 EXPECT_EQ(status_future.get(), ErrorCode::SUCCESS);
1680
1681 sync_client_handler();
1682 }
1683
TEST_F(LeExtendedAdvertisingAPITest,duration_maxevents_restored_on_resume)1684 TEST_F(LeExtendedAdvertisingAPITest, duration_maxevents_restored_on_resume) {
1685 // arrange
1686 auto test_le_address_manager = (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();
1687 uint16_t duration = 1000;
1688 uint8_t max_extended_advertising_events = 100;
1689
1690 // enable advertiser
1691 le_advertising_manager_->EnableAdvertiser(advertiser_id_, true, duration,
1692 max_extended_advertising_events);
1693 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1694 EXPECT_CALL(mock_advertising_callback_,
1695 OnAdvertisingEnabled(advertiser_id_, true,
1696 AdvertisingCallback::AdvertisingStatus::SUCCESS));
1697 test_hci_layer_->IncomingEvent(
1698 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(uint8_t{1}, ErrorCode::SUCCESS));
1699
1700 test_le_address_manager->client_->OnPause();
1701 // verify advertising is disabled onPause
1702 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, test_hci_layer_->GetCommand().GetOpCode());
1703 test_hci_layer_->IncomingEvent(
1704 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1705 sync_client_handler();
1706
1707 test_le_address_manager->client_->OnResume();
1708 // verify advertising is reenabled onResume with correct parameters
1709 auto command = test_hci_layer_->GetCommand();
1710 ASSERT_EQ(OpCode::LE_SET_EXTENDED_ADVERTISING_ENABLE, command.GetOpCode());
1711 auto enable_command_view =
1712 LeSetExtendedAdvertisingEnableView::Create(LeAdvertisingCommandView::Create(command));
1713 ASSERT_TRUE(enable_command_view.IsValid());
1714 ASSERT_EQ(bluetooth::hci::Enable::ENABLED, enable_command_view.GetEnable());
1715 auto enabled_sets = enable_command_view.GetEnabledSets();
1716 ASSERT_EQ(static_cast<uint8_t>(1), enabled_sets.size());
1717 ASSERT_EQ(duration, enabled_sets[0].duration_);
1718 ASSERT_EQ(max_extended_advertising_events, enabled_sets[0].max_extended_advertising_events_);
1719 test_hci_layer_->IncomingEvent(
1720 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1721
1722 sync_client_handler();
1723 }
1724
TEST_F(LeExtendedAdvertisingAPITest,no_callbacks_on_pause)1725 TEST_F(LeExtendedAdvertisingAPITest, no_callbacks_on_pause) {
1726 // arrange
1727 auto test_le_address_manager = (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();
1728
1729 // expect
1730 EXPECT_CALL(mock_advertising_callback_, OnAdvertisingEnabled(_, _, _)).Times(0);
1731
1732 // act
1733 log::info("pause");
1734 test_le_address_manager->client_->OnPause();
1735 test_hci_layer_->GetCommand();
1736 test_hci_layer_->IncomingEvent(
1737 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1738
1739 sync_client_handler();
1740 }
1741
TEST_F(LeExtendedAdvertisingAPITest,no_callbacks_on_resume)1742 TEST_F(LeExtendedAdvertisingAPITest, no_callbacks_on_resume) {
1743 // arrange
1744 auto test_le_address_manager = (TestLeAddressManager*)test_acl_manager_->GetLeAddressManager();
1745 test_le_address_manager->client_->OnPause();
1746 test_hci_layer_->GetCommand();
1747 test_hci_layer_->IncomingEvent(
1748 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1749 sync_client_handler();
1750
1751 // expect
1752 EXPECT_CALL(mock_advertising_callback_, OnAdvertisingEnabled(_, _, _)).Times(0);
1753
1754 // act
1755 test_le_address_manager->client_->OnResume();
1756 test_hci_layer_->GetCommand();
1757 test_hci_layer_->IncomingEvent(
1758 LeSetExtendedAdvertisingEnableCompleteBuilder::Create(1, ErrorCode::SUCCESS));
1759
1760 sync_client_handler();
1761 }
1762
TEST_F(LeExtendedAdvertisingManagerTest,use_rpa)1763 TEST_F(LeExtendedAdvertisingManagerTest, use_rpa) {
1764 // arrange: use RANDOM address policy
1765 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS);
1766
1767 // act: start advertising set with RPA
1768 AdvertisingConfig config{};
1769 config.requested_advertiser_address_type = AdvertiserAddressType::RESOLVABLE_RANDOM;
1770 config.channel_map = 1;
1771
1772 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00, config,
1773 scan_callback, set_terminated_callback, 0, 0,
1774 client_handler_);
1775 auto command = LeAdvertisingCommandView::Create(test_hci_layer_->GetCommand());
1776
1777 // assert
1778 ASSERT_TRUE(command.IsValid());
1779 EXPECT_EQ(command.GetOpCode(), OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS);
1780
1781 auto set_parameters_command =
1782 LeSetExtendedAdvertisingParametersView::Create(LeAdvertisingCommandView::Create(command));
1783 ASSERT_TRUE(set_parameters_command.IsValid());
1784 EXPECT_EQ(set_parameters_command.GetOwnAddressType(), OwnAddressType::RANDOM_DEVICE_ADDRESS);
1785 }
1786
TEST_F(LeExtendedAdvertisingManagerTest,use_non_resolvable_address)1787 TEST_F(LeExtendedAdvertisingManagerTest, use_non_resolvable_address) {
1788 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_RESOLVABLE_ADDRESS);
1789
1790 // start advertising set with NRPA
1791 AdvertisingConfig config{};
1792 config.requested_advertiser_address_type = AdvertiserAddressType::NONRESOLVABLE_RANDOM;
1793 config.channel_map = 1;
1794
1795 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00, config,
1796 scan_callback, set_terminated_callback, 0, 0,
1797 client_handler_);
1798
1799 ASSERT_EQ(test_hci_layer_->GetCommand().GetOpCode(),
1800 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS);
1801 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
1802 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
1803
1804 auto command = LeAdvertisingCommandView::Create(test_hci_layer_->GetCommand());
1805 ASSERT_TRUE(command.IsValid());
1806 ASSERT_EQ(command.GetOpCode(), OpCode::LE_SET_ADVERTISING_SET_RANDOM_ADDRESS);
1807
1808 auto set_address_command =
1809 LeSetAdvertisingSetRandomAddressView::Create(LeAdvertisingCommandView::Create(command));
1810 ASSERT_TRUE(set_address_command.IsValid());
1811 EXPECT_EQ(set_address_command.GetOpCode(), OpCode::LE_SET_ADVERTISING_SET_RANDOM_ADDRESS);
1812
1813 // checking that it is an NRPA (first two bits = 0b00)
1814 Address address = set_address_command.GetRandomAddress();
1815 EXPECT_EQ(address.data()[5] >> 6, 0b00);
1816 }
1817
TEST_F(LeExtendedAdvertisingManagerTest,use_public_address_type_if_public_address_policy)1818 TEST_F(LeExtendedAdvertisingManagerTest, use_public_address_type_if_public_address_policy) {
1819 // arrange: use PUBLIC address policy
1820 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_PUBLIC_ADDRESS);
1821
1822 // act: start advertising set with RPA
1823 AdvertisingConfig config{};
1824 config.requested_advertiser_address_type = AdvertiserAddressType::RESOLVABLE_RANDOM;
1825 config.channel_map = 1;
1826
1827 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00, config,
1828 scan_callback, set_terminated_callback, 0, 0,
1829 client_handler_);
1830 auto command = LeAdvertisingCommandView::Create(test_hci_layer_->GetCommand());
1831
1832 // assert
1833 ASSERT_TRUE(command.IsValid());
1834 EXPECT_EQ(command.GetOpCode(), OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS);
1835
1836 auto set_parameters_command =
1837 LeSetExtendedAdvertisingParametersView::Create(LeAdvertisingCommandView::Create(command));
1838 ASSERT_TRUE(set_parameters_command.IsValid());
1839 EXPECT_EQ(set_parameters_command.GetOwnAddressType(), OwnAddressType::PUBLIC_DEVICE_ADDRESS);
1840 }
1841
TEST_F(LeExtendedAdvertisingManagerTest,use_nrpa_if_public_address_policy_non_connectable)1842 TEST_F(LeExtendedAdvertisingManagerTest, use_nrpa_if_public_address_policy_non_connectable) {
1843 TEST_BT::provider_->nrpa_non_connectable_adv(true);
1844
1845 // arrange: use PUBLIC address policy
1846 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_PUBLIC_ADDRESS);
1847
1848 // act: start non-connectable advertising set with RPA
1849 AdvertisingConfig config{};
1850 config.requested_advertiser_address_type = AdvertiserAddressType::RESOLVABLE_RANDOM;
1851 config.channel_map = 1;
1852 config.connectable = false;
1853
1854 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00, config,
1855 scan_callback, set_terminated_callback, 0, 0,
1856 client_handler_);
1857 ASSERT_EQ(test_hci_layer_->GetCommand().GetOpCode(),
1858 OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS);
1859 test_hci_layer_->IncomingEvent(LeSetExtendedAdvertisingParametersCompleteBuilder::Create(
1860 uint8_t{1}, ErrorCode::SUCCESS, static_cast<uint8_t>(-23)));
1861
1862 auto command = LeAdvertisingCommandView::Create(test_hci_layer_->GetCommand());
1863 ASSERT_TRUE(command.IsValid());
1864 ASSERT_EQ(command.GetOpCode(), OpCode::LE_SET_ADVERTISING_SET_RANDOM_ADDRESS);
1865
1866 auto set_address_command =
1867 LeSetAdvertisingSetRandomAddressView::Create(LeAdvertisingCommandView::Create(command));
1868 ASSERT_TRUE(set_address_command.IsValid());
1869 EXPECT_EQ(set_address_command.GetOpCode(), OpCode::LE_SET_ADVERTISING_SET_RANDOM_ADDRESS);
1870
1871 // checking that it is an NRPA (first two bits = 0b00)
1872 Address address = set_address_command.GetRandomAddress();
1873 EXPECT_EQ(address.data()[5] >> 6, 0b00);
1874 }
1875
TEST_F(LeExtendedAdvertisingManagerTest,use_public_if_requested_with_public_address_policy_non_connectable)1876 TEST_F(LeExtendedAdvertisingManagerTest,
1877 use_public_if_requested_with_public_address_policy_non_connectable) {
1878 TEST_BT::provider_->nrpa_non_connectable_adv(true);
1879 // arrange: use PUBLIC address policy
1880 test_acl_manager_->SetAddressPolicy(LeAddressManager::AddressPolicy::USE_PUBLIC_ADDRESS);
1881
1882 // act: start non-connectable advertising set with PUBLIC
1883 AdvertisingConfig config{};
1884 config.requested_advertiser_address_type = AdvertiserAddressType::PUBLIC;
1885 config.channel_map = 1;
1886 config.connectable = false;
1887
1888 le_advertising_manager_->ExtendedCreateAdvertiser(kAdvertiserClientIdJni, 0x00, config,
1889 scan_callback, set_terminated_callback, 0, 0,
1890 client_handler_);
1891 auto command = LeAdvertisingCommandView::Create(test_hci_layer_->GetCommand());
1892
1893 // assert
1894 ASSERT_TRUE(command.IsValid());
1895 EXPECT_EQ(command.GetOpCode(), OpCode::LE_SET_EXTENDED_ADVERTISING_PARAMETERS);
1896
1897 auto set_parameters_command =
1898 LeSetExtendedAdvertisingParametersView::Create(LeAdvertisingCommandView::Create(command));
1899 ASSERT_TRUE(set_parameters_command.IsValid());
1900 EXPECT_EQ(set_parameters_command.GetOwnAddressType(), OwnAddressType::PUBLIC_DEVICE_ADDRESS);
1901 }
1902
1903 } // namespace
1904 } // namespace hci
1905 } // namespace bluetooth
1906