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