Home | History | Annotate | Download | only in test
      1 /******************************************************************************
      2  *
      3  *  Copyright 2016 The Android Open Source Project
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 #include <array>
     20 #include <gmock/gmock.h>
     21 #include <gtest/gtest.h>
     22 
     23 #include "device/include/controller.h"
     24 #include "stack/btm/ble_advertiser_hci_interface.h"
     25 #include "stack/include/ble_advertiser.h"
     26 
     27 using ::testing::Args;
     28 using ::testing::Contains;
     29 using ::testing::ElementsAreArray;
     30 using ::testing::Exactly;
     31 using ::testing::Field;
     32 using ::testing::IsEmpty;
     33 using ::testing::SaveArg;
     34 using ::testing::SizeIs;
     35 using ::testing::_;
     36 using base::Bind;
     37 using status_cb = BleAdvertiserHciInterface::status_cb;
     38 using parameters_cb = BleAdvertiserHciInterface::parameters_cb;
     39 using SetEnableData = BleAdvertiserHciInterface::SetEnableData;
     40 
     41 const int num_adv_instances = 16;
     42 
     43 /* Below are methods that must be implemented if we don't want to compile the
     44  * whole stack. They will be removed, or changed into mocks one by one in the
     45  * future, as the refactoring progresses */
     46 bool BTM_BleLocalPrivacyEnabled() { return true; }
     47 uint16_t BTM_ReadDiscoverability(uint16_t* p_window, uint16_t* p_interval) {
     48   return true;
     49 }
     50 bool SMP_Encrypt(uint8_t* key, uint8_t key_len, uint8_t* plain_text,
     51                  uint8_t pt_len, tSMP_ENC* p_out) {
     52   return true;
     53 }
     54 void BTM_GetDeviceIDRoot(BT_OCTET16 irk) {}
     55 void btm_ble_update_dmt_flag_bits(uint8_t* flag_value,
     56                                   const uint16_t connect_mode,
     57                                   const uint16_t disc_mode) {}
     58 void btm_acl_update_conn_addr(uint16_t conn_handle, const RawAddress& address) {
     59 }
     60 void btm_gen_resolvable_private_addr(base::Callback<void(uint8_t[8])> cb) {
     61   uint8_t fake_rand[8] = {0, 0, 0, 0, 0, 0, 0, 0};
     62   cb.Run(fake_rand);
     63 }
     64 
     65 alarm_callback_t last_alarm_cb = nullptr;
     66 void* last_alarm_data = nullptr;
     67 void alarm_set_on_mloop(alarm_t* alarm, period_ms_t interval_ms,
     68                         alarm_callback_t cb, void* data) {
     69   last_alarm_cb = cb;
     70   last_alarm_data = data;
     71 }
     72 
     73 void alarm_cancel(alarm_t* alarm) {}
     74 alarm_t* alarm_new_periodic(const char* name) { return nullptr; }
     75 alarm_t* alarm_new(const char* name) { return nullptr; }
     76 void alarm_free(alarm_t* alarm) {}
     77 const controller_t* controller_get_interface() { return nullptr; }
     78 
     79 namespace {
     80 void DoNothing(uint8_t) {}
     81 
     82 void DoNothing2(uint8_t, uint8_t) {}
     83 
     84 void TriggerRandomAddressUpdate() {
     85   // Call to StartAdvertisingSet set the last_alarm_cb to random address timeout
     86   // callback. Call it now in order to trigger address update
     87   last_alarm_cb(last_alarm_data);
     88 }
     89 
     90 constexpr uint8_t INTERMEDIATE =
     91     0x00;                           // Intermediate fragment of fragmented data
     92 constexpr uint8_t FIRST = 0x01;     // First fragment of fragmented data
     93 constexpr uint8_t LAST = 0x02;      // Last fragment of fragmented data
     94 constexpr uint8_t COMPLETE = 0x03;  // Complete extended advertising data
     95 
     96 class AdvertiserHciMock : public BleAdvertiserHciInterface {
     97  public:
     98   AdvertiserHciMock() = default;
     99   ~AdvertiserHciMock() override = default;
    100 
    101   MOCK_METHOD1(ReadInstanceCount,
    102                void(base::Callback<void(uint8_t /* inst_cnt*/)>));
    103   MOCK_METHOD1(SetAdvertisingEventObserver,
    104                void(AdvertisingEventObserver* observer));
    105   MOCK_METHOD6(SetAdvertisingData,
    106                void(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t*, status_cb));
    107   MOCK_METHOD6(SetScanResponseData,
    108                void(uint8_t, uint8_t, uint8_t, uint8_t, uint8_t*, status_cb));
    109   MOCK_METHOD3(SetRandomAddress, void(uint8_t, const RawAddress&, status_cb));
    110   MOCK_METHOD3(Enable, void(uint8_t, std::vector<SetEnableData>, status_cb));
    111   MOCK_METHOD5(SetPeriodicAdvertisingParameters,
    112                void(uint8_t, uint16_t, uint16_t, uint16_t, status_cb));
    113   MOCK_METHOD5(SetPeriodicAdvertisingData,
    114                void(uint8_t, uint8_t, uint8_t, uint8_t*, status_cb));
    115   MOCK_METHOD3(SetPeriodicAdvertisingEnable, void(uint8_t, uint8_t, status_cb));
    116   MOCK_METHOD2(RemoveAdvertisingSet, void(uint8_t, status_cb));
    117   MOCK_METHOD1(ClearAdvertisingSets, void(status_cb));
    118 
    119   MOCK_METHOD9(SetParameters1,
    120                void(uint8_t, uint16_t, uint32_t, uint32_t, uint8_t, uint8_t,
    121                     const RawAddress&, uint8_t, const RawAddress&));
    122   MOCK_METHOD8(SetParameters2, void(uint8_t, int8_t, uint8_t, uint8_t, uint8_t,
    123                                     uint8_t, uint8_t, parameters_cb));
    124 
    125   void SetParameters(uint8_t handle, uint16_t properties, uint32_t adv_int_min,
    126                      uint32_t adv_int_max, uint8_t channel_map,
    127                      uint8_t own_address_type, const RawAddress& own_address,
    128                      uint8_t peer_address_type, const RawAddress& peer_address,
    129                      uint8_t filter_policy, int8_t tx_power,
    130                      uint8_t primary_phy, uint8_t secondary_max_skip,
    131                      uint8_t secondary_phy, uint8_t advertising_sid,
    132                      uint8_t scan_request_notify_enable,
    133                      parameters_cb cmd_complete) override {
    134     SetParameters1(handle, properties, adv_int_min, adv_int_max, channel_map,
    135                    own_address_type, own_address, peer_address_type,
    136                    peer_address);
    137     SetParameters2(filter_policy, tx_power, primary_phy, secondary_max_skip,
    138                    secondary_phy, advertising_sid, scan_request_notify_enable,
    139                    cmd_complete);
    140   };
    141 
    142   bool QuirkAdvertiserZeroHandle() { return false; }
    143 
    144  private:
    145   DISALLOW_COPY_AND_ASSIGN(AdvertiserHciMock);
    146 };
    147 
    148 }  // namespace
    149 
    150 class BleAdvertisingManagerTest : public testing::Test {
    151  protected:
    152   int reg_inst_id = -1;
    153   int reg_status = -1;
    154   int set_params_status = -1;
    155   int set_data_status = -1;
    156   int enable_status = -1;
    157   int start_advertising_status = -1;
    158   int start_advertising_set_advertiser_id = -1;
    159   int start_advertising_set_tx_power = -1;
    160   int start_advertising_set_status = -1;
    161 
    162   std::unique_ptr<AdvertiserHciMock> hci_mock;
    163 
    164   virtual void SetUp() {
    165     hci_mock.reset(new AdvertiserHciMock());
    166 
    167     base::Callback<void(uint8_t)> inst_cnt_Cb;
    168     EXPECT_CALL(*hci_mock, ReadInstanceCount(_))
    169         .Times(Exactly(1))
    170         .WillOnce(SaveArg<0>(&inst_cnt_Cb));
    171 
    172     BleAdvertisingManager::Initialize(hci_mock.get());
    173     ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    174 
    175     // we are a truly gracious fake controller, let the command succeed!
    176     inst_cnt_Cb.Run(num_adv_instances);
    177   }
    178 
    179   virtual void TearDown() {
    180     BleAdvertisingManager::CleanUp();
    181     hci_mock.reset();
    182   }
    183 
    184  public:
    185   void RegistrationCb(uint8_t inst_id, uint8_t status) {
    186     reg_inst_id = inst_id;
    187     reg_status = status;
    188   }
    189 
    190   void SetParametersCb(uint8_t status, int8_t tx_power) {
    191     set_params_status = status;
    192   }
    193   void SetDataCb(uint8_t status) { set_data_status = status; }
    194   void EnableCb(uint8_t status) { enable_status = status; }
    195   void StartAdvertisingCb(uint8_t status) { start_advertising_status = status; }
    196   void StartAdvertisingSetCb(uint8_t advertiser_id, int8_t tx_power,
    197                              uint8_t status) {
    198     start_advertising_set_advertiser_id = advertiser_id;
    199     start_advertising_set_tx_power = tx_power;
    200     start_advertising_set_status = status;
    201   }
    202 };
    203 
    204 TEST_F(BleAdvertisingManagerTest, test_registration) {
    205   for (int i = 0; i < num_adv_instances; i++) {
    206     BleAdvertisingManager::Get()->RegisterAdvertiser(Bind(
    207         &BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    208     EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    209     EXPECT_EQ(i, reg_inst_id);
    210   }
    211 
    212   // This call should return an error - no more advertisers left.
    213   BleAdvertisingManager::Get()->RegisterAdvertiser(
    214       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    215   EXPECT_EQ(ADVERTISE_FAILED_TOO_MANY_ADVERTISERS, reg_status);
    216   // Don't bother checking inst_id, it doesn't matter
    217 
    218   status_cb remove_cb;
    219   EXPECT_CALL(*hci_mock, RemoveAdvertisingSet(_, _))
    220       .Times(1)
    221       .WillOnce(SaveArg<1>(&remove_cb));
    222   BleAdvertisingManager::Get()->Unregister(5);
    223   remove_cb.Run(0);
    224 
    225   // One advertiser was freed, so should be able to register one now
    226   BleAdvertisingManager::Get()->RegisterAdvertiser(
    227       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    228   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    229   EXPECT_EQ(5, reg_inst_id);
    230 }
    231 
    232 /* This test verifies that the following flow is working correctly: register,
    233  * set parameters, set data, enable, ... (advertise) ..., unregister*/
    234 TEST_F(BleAdvertisingManagerTest, test_android_flow) {
    235   BleAdvertisingManager::Get()->RegisterAdvertiser(
    236       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    237   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    238   int advertiser_id = reg_inst_id;
    239 
    240   parameters_cb set_params_cb;
    241   tBTM_BLE_ADV_PARAMS params;
    242   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
    243       .Times(1);
    244   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
    245       .Times(1)
    246       .WillOnce(SaveArg<7>(&set_params_cb));
    247   BleAdvertisingManager::Get()->SetParameters(
    248       advertiser_id, &params,
    249       Bind(&BleAdvertisingManagerTest::SetParametersCb,
    250            base::Unretained(this)));
    251   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    252 
    253   // we are a truly gracious fake controller, let the command succeed!
    254   set_params_cb.Run(0, 0);
    255   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
    256 
    257   status_cb set_data_cb;
    258   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, _, _, _, _, _))
    259       .Times(1)
    260       .WillOnce(SaveArg<5>(&set_data_cb));
    261   BleAdvertisingManager::Get()->SetData(
    262       advertiser_id, false, std::vector<uint8_t>(),
    263       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    264   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    265 
    266   set_data_cb.Run(0);
    267   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    268 
    269   status_cb enable_cb;
    270   EXPECT_CALL(*hci_mock,
    271               Enable(0x01 /* enable */,
    272                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    273                                                      advertiser_id))),
    274                      _))
    275       .Times(1)
    276       .WillOnce(SaveArg<2>(&enable_cb));
    277   BleAdvertisingManager::Get()->Enable(
    278       advertiser_id, true,
    279       Bind(&BleAdvertisingManagerTest::EnableCb, base::Unretained(this)), 0, 0,
    280       base::Callback<void(uint8_t)>());
    281   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    282 
    283   enable_cb.Run(0);
    284   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, enable_status);
    285 
    286   /* fake controller should be advertising */
    287 
    288   EXPECT_CALL(*hci_mock,
    289               Enable(0x00 /* disable */,
    290                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    291                                                      advertiser_id))),
    292                      _))
    293       .Times(1)
    294       .WillOnce(SaveArg<2>(&enable_cb));
    295   status_cb remove_cb;
    296   EXPECT_CALL(*hci_mock, RemoveAdvertisingSet(_, _))
    297       .Times(1)
    298       .WillOnce(SaveArg<1>(&remove_cb));
    299   BleAdvertisingManager::Get()->Unregister(advertiser_id);
    300   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    301 
    302   enable_cb.Run(0);
    303   remove_cb.Run(0);
    304 }
    305 
    306 /* This test verifies that when advertising data is set, tx power and flags will
    307  * be properly filled. */
    308 TEST_F(BleAdvertisingManagerTest, test_adv_data_filling) {
    309   BleAdvertisingManager::Get()->RegisterAdvertiser(
    310       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    311   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    312   int advertiser_id = reg_inst_id;
    313 
    314   parameters_cb set_params_cb;
    315   tBTM_BLE_ADV_PARAMS params;
    316   params.advertising_event_properties =
    317       BleAdvertisingManager::advertising_prop_legacy_connectable;
    318   params.tx_power = -15;
    319   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
    320       .Times(1);
    321   EXPECT_CALL(*hci_mock, SetParameters2(_, params.tx_power, _, _, _, _, _, _))
    322       .Times(1)
    323       .WillOnce(SaveArg<7>(&set_params_cb));
    324   BleAdvertisingManager::Get()->SetParameters(
    325       advertiser_id, &params,
    326       Bind(&BleAdvertisingManagerTest::SetParametersCb,
    327            base::Unretained(this)));
    328   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    329 
    330   // let the set parameters command succeed!
    331   set_params_cb.Run(0, 0);
    332   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
    333 
    334   status_cb set_data_cb;
    335   /* verify that flags will be added, and tx power filled, if call to SetData
    336    * contained only tx power, and the advertisement is connectable */
    337   uint8_t expected_adv_data[] = {
    338       0x02 /* len */,         0x01 /* flags */,
    339       0x02 /* flags value */, 0x02 /* len */,
    340       0x0A /* tx_power */,    static_cast<uint8_t>(params.tx_power)};
    341   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, _, _, _, _, _))
    342       .With(Args<4, 3>(ElementsAreArray(expected_adv_data)))
    343       .Times(1)
    344       .WillOnce(SaveArg<5>(&set_data_cb));
    345   BleAdvertisingManager::Get()->SetData(
    346       advertiser_id, false,
    347       std::vector<uint8_t>({0x02 /* len */, 0x0A /* tx_power */, 0x00}),
    348       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    349   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    350 
    351   set_data_cb.Run(0);
    352   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    353 }
    354 
    355 /* This test verifies that when advertising is non-connectable, flags will not
    356  * be added. */
    357 TEST_F(BleAdvertisingManagerTest, test_adv_data_not_filling) {
    358   BleAdvertisingManager::Get()->RegisterAdvertiser(
    359       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    360   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    361   int advertiser_id = reg_inst_id;
    362 
    363   parameters_cb set_params_cb;
    364   tBTM_BLE_ADV_PARAMS params;
    365   params.advertising_event_properties =
    366       BleAdvertisingManager::advertising_prop_legacy_non_connectable;
    367   params.tx_power = -15;
    368   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
    369       .Times(1);
    370   EXPECT_CALL(*hci_mock,
    371               SetParameters2(_, (uint8_t)params.tx_power, _, _, _, _, _, _))
    372       .Times(1)
    373       .WillOnce(SaveArg<7>(&set_params_cb));
    374   BleAdvertisingManager::Get()->SetParameters(
    375       advertiser_id, &params,
    376       Bind(&BleAdvertisingManagerTest::SetParametersCb,
    377            base::Unretained(this)));
    378   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    379 
    380   // let the set parameters command succeed!
    381   set_params_cb.Run(0, -15);
    382   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_params_status);
    383 
    384   status_cb set_data_cb;
    385   /* verify that flags will not be added */
    386   uint8_t expected_adv_data[] = {
    387       0x02 /* len */, 0xFF /* manufacturer specific */, 0x01 /* data */};
    388   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, _, _, _, _, _))
    389       .With(Args<4, 3>(ElementsAreArray(expected_adv_data)))
    390       .Times(1)
    391       .WillOnce(SaveArg<5>(&set_data_cb));
    392   BleAdvertisingManager::Get()->SetData(
    393       advertiser_id, false, std::vector<uint8_t>({0x02 /* len */, 0xFF, 0x01}),
    394       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    395   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    396 
    397   set_data_cb.Run(0);
    398   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    399 }
    400 
    401 TEST_F(BleAdvertisingManagerTest, test_reenabling) {
    402   BleAdvertisingManager::Get()->RegisterAdvertiser(
    403       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    404   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    405   EXPECT_EQ(0, reg_inst_id);
    406 
    407   uint8_t advertiser_id = reg_inst_id;
    408   status_cb enable_cb;
    409   EXPECT_CALL(*hci_mock,
    410               Enable(0x01 /* enable */,
    411                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    412                                                      advertiser_id))),
    413                      _))
    414       .Times(1)
    415       .WillOnce(SaveArg<2>(&enable_cb));
    416   BleAdvertisingManager::Get()->Enable(advertiser_id, true, Bind(DoNothing), 0,
    417                                        0, Bind(DoNothing));
    418   enable_cb.Run(0);
    419   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    420 
    421   EXPECT_CALL(*hci_mock,
    422               Enable(0x01 /* enable */,
    423                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    424                                                      advertiser_id))),
    425                      _))
    426       .Times(1)
    427       .WillOnce(SaveArg<2>(&enable_cb));
    428   BleAdvertisingManager::Get()->OnAdvertisingSetTerminated(advertiser_id, 0x00,
    429                                                            0x01ed, 0x00);
    430   enable_cb.Run(0);
    431   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    432 }
    433 
    434 /* Make sure that instance is not reenabled if it's already disabled */
    435 TEST_F(BleAdvertisingManagerTest, test_reenabling_disabled_instance) {
    436   uint8_t advertiser_id = 1;  // any unregistered value
    437 
    438   EXPECT_CALL(*hci_mock, Enable(_, _, _)).Times(Exactly(0));
    439   BleAdvertisingManager::Get()->OnAdvertisingSetTerminated(advertiser_id, 0x00,
    440                                                            0x05, 0x00);
    441   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    442 }
    443 
    444 /* This test verifies that the only flow that is currently used on Android, is
    445  * working correctly in happy case scenario. */
    446 TEST_F(BleAdvertisingManagerTest, test_start_advertising_set) {
    447   std::vector<uint8_t> adv_data;
    448   std::vector<uint8_t> scan_resp;
    449   tBTM_BLE_ADV_PARAMS params;
    450   tBLE_PERIODIC_ADV_PARAMS periodic_params;
    451   periodic_params.enable = false;
    452   std::vector<uint8_t> periodic_data;
    453 
    454   parameters_cb set_params_cb;
    455   status_cb set_address_cb;
    456   status_cb set_data_cb;
    457   status_cb set_scan_resp_data_cb;
    458   status_cb enable_cb;
    459   EXPECT_CALL(*hci_mock, SetParameters1(_, _, _, _, _, _, _, _, _)).Times(1);
    460   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
    461       .Times(1)
    462       .WillOnce(SaveArg<7>(&set_params_cb));
    463   EXPECT_CALL(*hci_mock, SetRandomAddress(_, _, _))
    464       .Times(1)
    465       .WillOnce(SaveArg<2>(&set_address_cb));
    466   EXPECT_CALL(*hci_mock, SetAdvertisingData(_, _, _, _, _, _))
    467       .Times(1)
    468       .WillOnce(SaveArg<5>(&set_data_cb));
    469   EXPECT_CALL(*hci_mock, SetScanResponseData(_, _, _, _, _, _))
    470       .Times(1)
    471       .WillOnce(SaveArg<5>(&set_scan_resp_data_cb));
    472   EXPECT_CALL(*hci_mock, Enable(0x01 /* enable */, _, _))
    473       .Times(1)
    474       .WillOnce(SaveArg<2>(&enable_cb));
    475 
    476   BleAdvertisingManager::Get()->StartAdvertisingSet(
    477       Bind(&BleAdvertisingManagerTest::StartAdvertisingSetCb,
    478            base::Unretained(this)),
    479       &params, adv_data, scan_resp, &periodic_params, periodic_data,
    480       0 /* duration */, 0 /* maxExtAdvEvents */, Bind(DoNothing2));
    481 
    482   // we are a truly gracious fake controller, let the commands succeed!
    483   int selected_tx_power = -15;
    484   set_params_cb.Run(0, selected_tx_power);
    485   set_address_cb.Run(0);
    486   set_data_cb.Run(0);
    487   set_scan_resp_data_cb.Run(0);
    488   enable_cb.Run(0);
    489   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, start_advertising_set_status);
    490   EXPECT_EQ(selected_tx_power, start_advertising_set_tx_power);
    491   int advertiser_id = start_advertising_set_advertiser_id;
    492   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    493 
    494   // ... advertising ...
    495 
    496   // Disable advertiser
    497   status_cb disable_cb;
    498   EXPECT_CALL(*hci_mock,
    499               Enable(0x00 /* disable */,
    500                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    501                                                      advertiser_id))),
    502                      _))
    503       .Times(1)
    504       .WillOnce(SaveArg<2>(&disable_cb));
    505   status_cb remove_cb;
    506   EXPECT_CALL(*hci_mock, RemoveAdvertisingSet(advertiser_id, _))
    507       .Times(1)
    508       .WillOnce(SaveArg<1>(&remove_cb));
    509   BleAdvertisingManager::Get()->Unregister(advertiser_id);
    510   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    511 
    512   disable_cb.Run(0);
    513   remove_cb.Run(0);
    514 }
    515 
    516 TEST_F(BleAdvertisingManagerTest, test_start_advertising_set_params_failed) {
    517   BleAdvertisingManager::Get()->RegisterAdvertiser(
    518       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    519   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    520   int advertiser_id = reg_inst_id;
    521 
    522   std::vector<uint8_t> adv_data;
    523   std::vector<uint8_t> scan_resp;
    524   tBTM_BLE_ADV_PARAMS params;
    525 
    526   parameters_cb set_params_cb;
    527   EXPECT_CALL(*hci_mock, SetParameters1(advertiser_id, _, _, _, _, _, _, _, _))
    528       .Times(1);
    529   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
    530       .Times(1)
    531       .WillOnce(SaveArg<7>(&set_params_cb));
    532 
    533   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, _, _, _, _, _))
    534       .Times(Exactly(0));
    535 
    536   BleAdvertisingManager::Get()->StartAdvertising(
    537       advertiser_id,
    538       Bind(&BleAdvertisingManagerTest::StartAdvertisingCb,
    539            base::Unretained(this)),
    540       &params, adv_data, scan_resp, 0, base::Callback<void(uint8_t)>());
    541   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    542 
    543   // set params failed
    544   set_params_cb.Run(0x01, 0);
    545 
    546   // Expect the whole flow to fail right away
    547   EXPECT_EQ(BTM_BLE_MULTI_ADV_FAILURE, start_advertising_status);
    548 }
    549 
    550 TEST_F(BleAdvertisingManagerTest, test_data_sender) {
    551   // prepare test input vector
    552   const int max_data_size = 1650;
    553   std::vector<uint8_t> data(max_data_size);
    554   for (int i = 0; i < max_data_size; i++) data[i] = i;
    555 
    556   BleAdvertisingManager::Get()->RegisterAdvertiser(
    557       Bind(&BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    558   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    559   int advertiser_id = reg_inst_id;
    560 
    561   status_cb set_data_cb;
    562   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, FIRST, _, 251, _, _))
    563       .Times(1)
    564       .WillOnce(SaveArg<5>(&set_data_cb));
    565   EXPECT_CALL(*hci_mock,
    566               SetAdvertisingData(advertiser_id, INTERMEDIATE, _, 251, _, _))
    567       .Times(5)
    568       .WillRepeatedly(SaveArg<5>(&set_data_cb));
    569   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, LAST, _, 144, _, _))
    570       .Times(1)
    571       .WillOnce(SaveArg<5>(&set_data_cb));
    572   BleAdvertisingManager::Get()->SetData(
    573       advertiser_id, false, data,
    574       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    575   for (int i = 0; i < 7; i++) {
    576     set_data_cb.Run(0x00);
    577   }
    578   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    579   // Expect the whole flow to succeed
    580   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    581 
    582   // ***************** Try again with different data size *********************
    583   data.resize(503);
    584   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, FIRST, _, 251, _, _))
    585       .Times(1)
    586       .WillOnce(SaveArg<5>(&set_data_cb));
    587   EXPECT_CALL(*hci_mock,
    588               SetAdvertisingData(advertiser_id, INTERMEDIATE, _, 251, _, _))
    589       .Times(1)
    590       .WillRepeatedly(SaveArg<5>(&set_data_cb));
    591   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, LAST, _, 1, _, _))
    592       .Times(1)
    593       .WillOnce(SaveArg<5>(&set_data_cb));
    594   BleAdvertisingManager::Get()->SetData(
    595       advertiser_id, false, data,
    596       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    597   for (int i = 0; i < 3; i++) {
    598     set_data_cb.Run(0x00);
    599   }
    600   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    601   // Expect the whole flow to succeed
    602   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    603 
    604   // ***************** Try again with different data size *********************
    605   data.resize(502);
    606   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, FIRST, _, 251, _, _))
    607       .Times(1)
    608       .WillOnce(SaveArg<5>(&set_data_cb));
    609   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, LAST, _, 251, _, _))
    610       .Times(1)
    611       .WillOnce(SaveArg<5>(&set_data_cb));
    612   BleAdvertisingManager::Get()->SetData(
    613       advertiser_id, false, data,
    614       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    615   for (int i = 0; i < 2; i++) {
    616     set_data_cb.Run(0x00);
    617   }
    618   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    619   // Expect the whole flow to succeed
    620   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    621 
    622   // ***************** Try again with different data size *********************
    623   data.resize(501);
    624   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, FIRST, _, 251, _, _))
    625       .Times(1)
    626       .WillOnce(SaveArg<5>(&set_data_cb));
    627   EXPECT_CALL(*hci_mock, SetAdvertisingData(advertiser_id, LAST, _, 250, _, _))
    628       .Times(1)
    629       .WillOnce(SaveArg<5>(&set_data_cb));
    630   BleAdvertisingManager::Get()->SetData(
    631       advertiser_id, false, data,
    632       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    633   for (int i = 0; i < 2; i++) {
    634     set_data_cb.Run(0x00);
    635   }
    636   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    637   // Expect the whole flow to succeed
    638   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    639 
    640   // ***************** Try again with different data size *********************
    641   data.resize(251);
    642   EXPECT_CALL(*hci_mock,
    643               SetAdvertisingData(advertiser_id, COMPLETE, _, 251, _, _))
    644       .Times(1)
    645       .WillOnce(SaveArg<5>(&set_data_cb));
    646   BleAdvertisingManager::Get()->SetData(
    647       advertiser_id, false, data,
    648       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    649   set_data_cb.Run(0x00);
    650   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    651   // Expect the whole flow to succeed
    652   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    653 
    654   // ***************** Try again with different data size *********************
    655   data.resize(120);
    656   EXPECT_CALL(*hci_mock,
    657               SetAdvertisingData(advertiser_id, COMPLETE, _, 120, _, _))
    658       .Times(1)
    659       .WillOnce(SaveArg<5>(&set_data_cb));
    660   BleAdvertisingManager::Get()->SetData(
    661       advertiser_id, false, data,
    662       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    663   set_data_cb.Run(0x00);
    664   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    665   // Expect the whole flow to succeed
    666   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    667 
    668   // ***************** Try again with different data size *********************
    669   data.resize(0);
    670   EXPECT_CALL(*hci_mock,
    671               SetAdvertisingData(advertiser_id, COMPLETE, _, 0, _, _))
    672       .Times(1)
    673       .WillOnce(SaveArg<5>(&set_data_cb));
    674   BleAdvertisingManager::Get()->SetData(
    675       advertiser_id, false, data,
    676       Bind(&BleAdvertisingManagerTest::SetDataCb, base::Unretained(this)));
    677   set_data_cb.Run(0x00);
    678   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    679   // Expect the whole flow to succeed
    680   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, set_data_status);
    681 }
    682 
    683 /* This test makes sure that conectable advertisment with timeout will get it's
    684  * address updated once the timeout passes and one tries to enable it again.*/
    685 TEST_F(BleAdvertisingManagerTest,
    686        test_connectable_address_update_during_timeout) {
    687   std::vector<uint8_t> adv_data;
    688   std::vector<uint8_t> scan_resp;
    689   tBTM_BLE_ADV_PARAMS params;
    690   params.advertising_event_properties = 0x1 /* connectable */;
    691   tBLE_PERIODIC_ADV_PARAMS periodic_params;
    692   periodic_params.enable = false;
    693   std::vector<uint8_t> periodic_data;
    694 
    695   uint8_t maxExtAdvEvents = 50;
    696 
    697   parameters_cb set_params_cb;
    698   status_cb set_address_cb;
    699   status_cb set_data_cb;
    700   status_cb set_scan_resp_data_cb;
    701   status_cb enable_cb;
    702   EXPECT_CALL(*hci_mock, SetParameters1(_, _, _, _, _, _, _, _, _)).Times(1);
    703   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
    704       .Times(1)
    705       .WillOnce(SaveArg<7>(&set_params_cb));
    706   EXPECT_CALL(*hci_mock, SetRandomAddress(_, _, _))
    707       .Times(1)
    708       .WillOnce(SaveArg<2>(&set_address_cb));
    709   EXPECT_CALL(*hci_mock, SetAdvertisingData(_, _, _, _, _, _))
    710       .Times(1)
    711       .WillOnce(SaveArg<5>(&set_data_cb));
    712   EXPECT_CALL(*hci_mock, SetScanResponseData(_, _, _, _, _, _))
    713       .Times(1)
    714       .WillOnce(SaveArg<5>(&set_scan_resp_data_cb));
    715   EXPECT_CALL(
    716       *hci_mock,
    717       Enable(
    718           0x01 /* enable */,
    719           AllOf(SizeIs(1),
    720                 Contains(Field(&SetEnableData::max_extended_advertising_events,
    721                                maxExtAdvEvents))),
    722           _))
    723       .Times(1)
    724       .WillOnce(SaveArg<2>(&enable_cb));
    725 
    726   BleAdvertisingManager::Get()->StartAdvertisingSet(
    727       Bind(&BleAdvertisingManagerTest::StartAdvertisingSetCb,
    728            base::Unretained(this)),
    729       &params, adv_data, scan_resp, &periodic_params, periodic_data,
    730       0 /* duration */, maxExtAdvEvents, Bind(DoNothing2));
    731 
    732   // we are a truly gracious fake controller, let the commands succeed!
    733   int selected_tx_power = -15;
    734   set_params_cb.Run(0, selected_tx_power);
    735   set_address_cb.Run(0);
    736   set_data_cb.Run(0);
    737   set_scan_resp_data_cb.Run(0);
    738   enable_cb.Run(0);
    739   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, start_advertising_set_status);
    740   EXPECT_EQ(selected_tx_power, start_advertising_set_tx_power);
    741   int advertiser_id = start_advertising_set_advertiser_id;
    742   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    743 
    744   // ... advertising ...
    745 
    746   // No HCI calls should be triggered, becuase there is a timeout on a
    747   // connectable advertisement.
    748   TriggerRandomAddressUpdate();
    749   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    750 
    751   // Set terminated because we advertised maxExtAdvEvents times!
    752   BleAdvertisingManager::Get()->OnAdvertisingSetTerminated(
    753       0x43 /*status */, advertiser_id, 0x00 /* conn_handle*/, maxExtAdvEvents);
    754   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    755 
    756   // Try to Enable the advertiser. It should first update it's random address.
    757   EXPECT_CALL(*hci_mock, SetRandomAddress(_, _, _))
    758       .Times(1)
    759       .WillOnce(SaveArg<2>(&set_address_cb));
    760   EXPECT_CALL(
    761       *hci_mock,
    762       Enable(
    763           0x01 /* enable */,
    764           AllOf(SizeIs(1),
    765                 Contains(Field(&SetEnableData::max_extended_advertising_events,
    766                                maxExtAdvEvents))),
    767           _))
    768       .Times(1)
    769       .WillOnce(SaveArg<2>(&enable_cb));
    770   BleAdvertisingManager::Get()->Enable(
    771       advertiser_id, true,
    772       Bind(&BleAdvertisingManagerTest::EnableCb, base::Unretained(this)), 0,
    773       maxExtAdvEvents, Bind(DoNothing));
    774   set_address_cb.Run(0);
    775   enable_cb.Run(0);
    776   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    777 
    778   // Disable advertiser
    779   status_cb disable_cb;
    780   EXPECT_CALL(*hci_mock,
    781               Enable(0x00 /* disable */,
    782                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    783                                                      advertiser_id))),
    784                      _))
    785       .Times(1)
    786       .WillOnce(SaveArg<2>(&disable_cb));
    787   status_cb remove_cb;
    788   EXPECT_CALL(*hci_mock, RemoveAdvertisingSet(advertiser_id, _))
    789       .Times(1)
    790       .WillOnce(SaveArg<1>(&remove_cb));
    791   BleAdvertisingManager::Get()->Unregister(advertiser_id);
    792   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    793 
    794   disable_cb.Run(0);
    795   remove_cb.Run(0);
    796 }
    797 
    798 /* This test makes sure that periodic advertising is stopped before
    799  * unregistering the advertiser, if it was enabled. */
    800 TEST_F(BleAdvertisingManagerTest, test_periodic_adv_disable_on_unregister) {
    801   std::vector<uint8_t> adv_data;
    802   std::vector<uint8_t> scan_resp;
    803   tBTM_BLE_ADV_PARAMS params;
    804   params.advertising_event_properties = 0x1 /* connectable */;
    805   tBLE_PERIODIC_ADV_PARAMS periodic_params;
    806   periodic_params.enable = true;  // enable periodic advertising
    807   std::vector<uint8_t> periodic_data;
    808 
    809   parameters_cb set_params_cb;
    810   status_cb set_address_cb;
    811   status_cb set_data_cb;
    812   status_cb set_scan_resp_data_cb;
    813   status_cb enable_cb;
    814   status_cb set_periodic_params_cb;
    815   status_cb set_periodic_data_cb;
    816   status_cb set_periodic_enable_cb;
    817   EXPECT_CALL(*hci_mock, SetParameters1(_, _, _, _, _, _, _, _, _)).Times(1);
    818   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
    819       .Times(1)
    820       .WillOnce(SaveArg<7>(&set_params_cb));
    821   EXPECT_CALL(*hci_mock, SetRandomAddress(_, _, _))
    822       .Times(1)
    823       .WillOnce(SaveArg<2>(&set_address_cb));
    824   EXPECT_CALL(*hci_mock, SetAdvertisingData(_, _, _, _, _, _))
    825       .Times(1)
    826       .WillOnce(SaveArg<5>(&set_data_cb));
    827   EXPECT_CALL(*hci_mock, SetScanResponseData(_, _, _, _, _, _))
    828       .Times(1)
    829       .WillOnce(SaveArg<5>(&set_scan_resp_data_cb));
    830   EXPECT_CALL(*hci_mock, SetPeriodicAdvertisingParameters(_, _, _, _, _))
    831       .Times(1)
    832       .WillOnce(SaveArg<4>(&set_periodic_params_cb));
    833   EXPECT_CALL(*hci_mock, SetPeriodicAdvertisingData(_, _, _, _, _))
    834       .Times(1)
    835       .WillOnce(SaveArg<4>(&set_periodic_data_cb));
    836   EXPECT_CALL(*hci_mock, SetPeriodicAdvertisingEnable(0x01 /* enable */, _, _))
    837       .Times(1)
    838       .WillOnce(SaveArg<2>(&set_periodic_enable_cb));
    839   EXPECT_CALL(*hci_mock, Enable(0x01 /* enable */, _, _))
    840       .Times(1)
    841       .WillOnce(SaveArg<2>(&enable_cb));
    842 
    843   BleAdvertisingManager::Get()->StartAdvertisingSet(
    844       Bind(&BleAdvertisingManagerTest::StartAdvertisingSetCb,
    845            base::Unretained(this)),
    846       &params, adv_data, scan_resp, &periodic_params, periodic_data,
    847       0 /* duration */, 0 /* maxExtAdvEvents */, Bind(DoNothing2));
    848 
    849   // we are a truly gracious fake controller, let the commands succeed!
    850   int selected_tx_power = -15;
    851   set_params_cb.Run(0, selected_tx_power);
    852   set_address_cb.Run(0);
    853   set_data_cb.Run(0);
    854   set_scan_resp_data_cb.Run(0);
    855   set_periodic_params_cb.Run(0);
    856   set_periodic_data_cb.Run(0);
    857   set_periodic_enable_cb.Run(0);
    858   enable_cb.Run(0);
    859   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, start_advertising_set_status);
    860   EXPECT_EQ(selected_tx_power, start_advertising_set_tx_power);
    861   int advertiser_id = start_advertising_set_advertiser_id;
    862   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    863 
    864   // ... advertising ...
    865 
    866   // Unregister advertiser - should disable periodic advertising
    867   status_cb disable_cb;
    868   EXPECT_CALL(*hci_mock,
    869               Enable(0x00 /* disable */,
    870                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    871                                                      advertiser_id))),
    872                      _))
    873       .Times(1)
    874       .WillOnce(SaveArg<2>(&disable_cb));
    875   status_cb disable_periodic_cb;
    876   EXPECT_CALL(*hci_mock, SetPeriodicAdvertisingEnable(0x00 /* disable */,
    877                                                       advertiser_id, _))
    878       .Times(1)
    879       .WillOnce(SaveArg<2>(&disable_periodic_cb));
    880   status_cb remove_cb;
    881   EXPECT_CALL(*hci_mock, RemoveAdvertisingSet(advertiser_id, _))
    882       .Times(1)
    883       .WillOnce(SaveArg<1>(&remove_cb));
    884   BleAdvertisingManager::Get()->Unregister(advertiser_id);
    885   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    886 
    887   disable_cb.Run(0);
    888   disable_periodic_cb.Run(0);
    889   remove_cb.Run(0);
    890 }
    891 
    892 TEST_F(BleAdvertisingManagerTest, test_suspend_resume) {
    893   for (int i = 0; i < 10; i++) {
    894     BleAdvertisingManager::Get()->RegisterAdvertiser(Bind(
    895         &BleAdvertisingManagerTest::RegistrationCb, base::Unretained(this)));
    896     EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, reg_status);
    897     EXPECT_EQ(i, reg_inst_id);
    898   }
    899 
    900   std::array<int, 3> enabled = {{1, 3, 9}};
    901 
    902   for (int advertiser_id : enabled) {
    903     status_cb enable_cb;
    904     EXPECT_CALL(*hci_mock,
    905                 Enable(0x01 /* enable */,
    906                        AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
    907                                                        advertiser_id))),
    908                        _))
    909         .Times(1)
    910         .WillOnce(SaveArg<2>(&enable_cb));
    911     BleAdvertisingManager::Get()->Enable(
    912         advertiser_id, true,
    913         Bind(&BleAdvertisingManagerTest::EnableCb, base::Unretained(this)), 0,
    914         0, base::Callback<void(uint8_t)>());
    915     enable_cb.Run(0);
    916     ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    917   }
    918 
    919   // we have some advertisers registered, three advertising.
    920 
    921   // Call to Suspend() should disable all running advertisers
    922   status_cb disable_cb;
    923   EXPECT_CALL(
    924       *hci_mock,
    925       Enable(0x00 /* disable */,
    926              AllOf(SizeIs(3), Contains(Field(&SetEnableData::handle, 1)),
    927                    Contains(Field(&SetEnableData::handle, 3)),
    928                    Contains(Field(&SetEnableData::handle, 9))),
    929              _))
    930       .Times(1)
    931       .WillOnce(SaveArg<2>(&disable_cb));
    932 
    933   BleAdvertisingManager::Get()->Suspend();
    934 
    935   disable_cb.Run(0);
    936   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    937 
    938   // Call to Resume() should re-enable advertisers
    939   status_cb enable_cb;
    940   EXPECT_CALL(
    941       *hci_mock,
    942       Enable(0x01 /* enable */,
    943              AllOf(SizeIs(3), Contains(Field(&SetEnableData::handle, 1)),
    944                    Contains(Field(&SetEnableData::handle, 3)),
    945                    Contains(Field(&SetEnableData::handle, 9))),
    946              _))
    947       .Times(1)
    948       .WillOnce(SaveArg<2>(&enable_cb));
    949 
    950   BleAdvertisingManager::Get()->Resume();
    951 
    952   enable_cb.Run(0);
    953 
    954   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
    955 }
    956 
    957 /* This test makes sure that conectable advertisment with timeout will get it's
    958  * duration and maxExtAdvEvents updated, when it's terminated due to incoming
    959  * connection.*/
    960 TEST_F(BleAdvertisingManagerTest, test_duration_update_during_timeout) {
    961   std::vector<uint8_t> adv_data;
    962   std::vector<uint8_t> scan_resp;
    963   tBTM_BLE_ADV_PARAMS params;
    964   params.advertising_event_properties = 0x1 /* connectable */;
    965   params.adv_int_min = params.adv_int_max = 0xA0 /* 100ms */;
    966   tBLE_PERIODIC_ADV_PARAMS periodic_params;
    967   periodic_params.enable = false;
    968   std::vector<uint8_t> periodic_data;
    969 
    970   uint8_t maxExtAdvEvents = 50;
    971   uint16_t duration = 500 /* 5s */;
    972 
    973   parameters_cb set_params_cb;
    974   status_cb set_address_cb;
    975   status_cb set_data_cb;
    976   status_cb set_scan_resp_data_cb;
    977   status_cb enable_cb;
    978   EXPECT_CALL(*hci_mock, SetParameters1(_, _, _, _, _, _, _, _, _)).Times(1);
    979   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
    980       .Times(1)
    981       .WillOnce(SaveArg<7>(&set_params_cb));
    982   EXPECT_CALL(*hci_mock, SetRandomAddress(_, _, _))
    983       .Times(1)
    984       .WillOnce(SaveArg<2>(&set_address_cb));
    985   EXPECT_CALL(*hci_mock, SetAdvertisingData(_, _, _, _, _, _))
    986       .Times(1)
    987       .WillOnce(SaveArg<5>(&set_data_cb));
    988   EXPECT_CALL(*hci_mock, SetScanResponseData(_, _, _, _, _, _))
    989       .Times(1)
    990       .WillOnce(SaveArg<5>(&set_scan_resp_data_cb));
    991   EXPECT_CALL(
    992       *hci_mock,
    993       Enable(0x01 /* enable */,
    994              AllOf(SizeIs(1),
    995                    Contains(AllOf(
    996                        Field(&SetEnableData::max_extended_advertising_events,
    997                              maxExtAdvEvents),
    998                        Field(&SetEnableData::duration, duration)))),
    999              _))
   1000       .Times(1)
   1001       .WillOnce(SaveArg<2>(&enable_cb));
   1002 
   1003   BleAdvertisingManager::Get()->StartAdvertisingSet(
   1004       Bind(&BleAdvertisingManagerTest::StartAdvertisingSetCb,
   1005            base::Unretained(this)),
   1006       &params, adv_data, scan_resp, &periodic_params, periodic_data, duration,
   1007       maxExtAdvEvents, Bind(DoNothing2));
   1008 
   1009   // we are a truly gracious fake controller, let the commands succeed!
   1010   int selected_tx_power = -15;
   1011   set_params_cb.Run(0, selected_tx_power);
   1012   set_address_cb.Run(0);
   1013   set_data_cb.Run(0);
   1014   set_scan_resp_data_cb.Run(0);
   1015   enable_cb.Run(0);
   1016   EXPECT_EQ(BTM_BLE_MULTI_ADV_SUCCESS, start_advertising_set_status);
   1017   EXPECT_EQ(selected_tx_power, start_advertising_set_tx_power);
   1018   int advertiser_id = start_advertising_set_advertiser_id;
   1019   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
   1020 
   1021   // ... advertising ...
   1022 
   1023   sleep(1);
   1024 
   1025   std::vector<SetEnableData> setEnableData;
   1026   // Set terminated because we received connect request! Should trigger
   1027   // re-enabling of the set
   1028   EXPECT_CALL(*hci_mock, Enable(0x01 /* enable */, _, _))
   1029       .Times(1)
   1030       .WillOnce(DoAll(SaveArg<1>(&setEnableData), SaveArg<2>(&enable_cb)));
   1031 
   1032   BleAdvertisingManager::Get()->OnAdvertisingSetTerminated(
   1033       0x00 /* Advertising successfully ended with a connection being created */,
   1034       advertiser_id, 0x01fe /* conn_handle*/, 20 /* completed ExtAdvEvents */);
   1035   enable_cb.Run(0);
   1036 
   1037   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
   1038 
   1039   uint16_t new_duration = setEnableData[0].duration;
   1040   uint8_t new_extAdvEvents = setEnableData[0].max_extended_advertising_events;
   1041 
   1042   // Sleep is not super-accurate, so assume the recomputed timeouts are around
   1043   // 4s +/- 100ms
   1044   EXPECT_NEAR((duration - new_duration), 100 /*4s */, 10);
   1045   EXPECT_NEAR((maxExtAdvEvents - new_extAdvEvents), 10, 1);
   1046 
   1047   // Disable advertiser
   1048   status_cb disable_cb;
   1049   EXPECT_CALL(*hci_mock,
   1050               Enable(0x00 /* disable */,
   1051                      AllOf(SizeIs(1), Contains(Field(&SetEnableData::handle,
   1052                                                      advertiser_id))),
   1053                      _))
   1054       .Times(1)
   1055       .WillOnce(SaveArg<2>(&disable_cb));
   1056   status_cb remove_cb;
   1057   EXPECT_CALL(*hci_mock, RemoveAdvertisingSet(advertiser_id, _))
   1058       .Times(1)
   1059       .WillOnce(SaveArg<1>(&remove_cb));
   1060   BleAdvertisingManager::Get()->Unregister(advertiser_id);
   1061   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
   1062 
   1063   disable_cb.Run(0);
   1064   remove_cb.Run(0);
   1065 }
   1066 
   1067 /* This test verifies that stack cleanup, and shutdown happening while there is
   1068  * outstanding HCI command is not triggering the callback */
   1069 TEST_F(BleAdvertisingManagerTest, test_cleanup_during_execution) {
   1070   std::vector<uint8_t> adv_data;
   1071   std::vector<uint8_t> scan_resp;
   1072   tBTM_BLE_ADV_PARAMS params;
   1073   tBLE_PERIODIC_ADV_PARAMS periodic_params;
   1074   periodic_params.enable = false;
   1075   std::vector<uint8_t> periodic_data;
   1076 
   1077   parameters_cb set_params_cb;
   1078   status_cb set_address_cb;
   1079   status_cb set_data_cb;
   1080   EXPECT_CALL(*hci_mock, SetParameters1(_, _, _, _, _, _, _, _, _)).Times(1);
   1081   EXPECT_CALL(*hci_mock, SetParameters2(_, _, _, _, _, _, _, _))
   1082       .Times(1)
   1083       .WillOnce(SaveArg<7>(&set_params_cb));
   1084   EXPECT_CALL(*hci_mock, SetRandomAddress(_, _, _))
   1085       .Times(1)
   1086       .WillOnce(SaveArg<2>(&set_address_cb));
   1087   EXPECT_CALL(*hci_mock, SetAdvertisingData(_, _, _, _, _, _))
   1088       .Times(1)
   1089       .WillOnce(SaveArg<5>(&set_data_cb));
   1090 
   1091   BleAdvertisingManager::Get()->StartAdvertisingSet(
   1092       Bind(&BleAdvertisingManagerTest::StartAdvertisingSetCb,
   1093            base::Unretained(this)),
   1094       &params, adv_data, scan_resp, &periodic_params, periodic_data,
   1095       0 /* duration */, 0 /* maxExtAdvEvents */, Bind(DoNothing2));
   1096 
   1097   // we are a truly gracious fake controller, let the commands succeed!
   1098   int selected_tx_power = -15;
   1099   set_params_cb.Run(0, selected_tx_power);
   1100   set_address_cb.Run(0);
   1101 
   1102   // Someone shut down the stack in the middle of flow, when the HCI Set
   1103   // Advertise Data was scheduled!
   1104   BleAdvertisingManager::Get()->CleanUp();
   1105 
   1106   // The HCI call returns with status, and tries to execute the callback. This
   1107   // should just silently drop the call. If it got executed, we would get crash,
   1108   // because BleAdvertisingManager object was already deleted.
   1109   set_data_cb.Run(0);
   1110 
   1111   ::testing::Mock::VerifyAndClearExpectations(hci_mock.get());
   1112 }
   1113 
   1114 extern void testRecomputeTimeout1();
   1115 extern void testRecomputeTimeout2();
   1116 extern void testRecomputeTimeout3();
   1117 
   1118 TEST_F(BleAdvertisingManagerTest, test_recompute_timeout) {
   1119   testRecomputeTimeout1();
   1120   testRecomputeTimeout2();
   1121   testRecomputeTimeout3();
   1122 }