Commit b3e28328 authored by Tim Song's avatar Tim Song Committed by Commit Bot

Stop BLE advertisement on macOS when the adapter is powered off.

This makes the behaviour consistent with BLE advertisement on ChromeOS.

Change-Id: I8405f5fafc6f29874abf7e988d6828d7d03828ad
Reviewed-on: https://chromium-review.googlesource.com/1162689
Commit-Queue: Tim Song <tengs@chromium.org>
Reviewed-by: default avatarGustavo Sacomoto <sacomoto@chromium.org>
Reviewed-by: default avatarGiovanni Ortuño Urquidi <ortuno@chromium.org>
Cr-Commit-Position: refs/heads/master@{#581893}
parent 1b7d4e50
...@@ -32,8 +32,10 @@ void BluetoothLowEnergyAdvertisementManagerMac:: ...@@ -32,8 +32,10 @@ void BluetoothLowEnergyAdvertisementManagerMac::
// powered on. // powered on.
// 2. Start advertising a registered advertisement if the adapter is powered // 2. Start advertising a registered advertisement if the adapter is powered
// on. // on.
// Note that if the adapter is powered off while advertising, macOS will // 3. Stop the advertisement when the adapter is powered off.
// automatically restart advertising when the adapter is powered back on. // Note that if the adapter is powered off while advertising, macOS will
// automatically restart advertising when the adapter is powered back on,
// so we need to explicitly stop advertising in this case.
if (!active_advertisement_) { if (!active_advertisement_) {
return; return;
...@@ -61,12 +63,22 @@ void BluetoothLowEnergyAdvertisementManagerMac:: ...@@ -61,12 +63,22 @@ void BluetoothLowEnergyAdvertisementManagerMac::
if (active_advertisement_->is_advertising() && if (active_advertisement_->is_advertising() &&
adapter_state == CBPeripheralManagerStateResetting) { adapter_state == CBPeripheralManagerStateResetting) {
DVLOG(1) << "Adapter resetting. Invaldating advertisement."; DVLOG(1) << "Adapter resetting. Invalidating advertisement.";
active_advertisement_->OnAdapterReset(); active_advertisement_->OnAdapterReset();
active_advertisement_ = nullptr; active_advertisement_ = nullptr;
return; return;
} }
if (active_advertisement_->is_advertising() &&
adapter_state == CBPeripheralManagerStatePoweredOff) {
DVLOG(1) << "Adapter powered off. Stopping advertisement.";
// Note: we purposefully don't unregister the active advertisement for
// consistency with ChromeOS. The caller must manually unregister
// the advertisement themselves.
[peripheral_manager_ stopAdvertising];
return;
}
if (active_advertisement_->is_waiting_for_adapter()) { if (active_advertisement_->is_waiting_for_adapter()) {
StartAdvertising(); StartAdvertising();
} }
......
...@@ -271,23 +271,6 @@ TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest, Register_Twice) { ...@@ -271,23 +271,6 @@ TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest, Register_Twice) {
EXPECT_TRUE(advertisement_); EXPECT_TRUE(advertisement_);
} }
TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
AdapterPoweredOff_WhileAdvertising) {
// Register advertisement.
RegisterAdvertisement(CreateAdvertisementData());
advertisement_manager_.DidStartAdvertising(nil);
ui_task_runner_->RunPendingTasks();
EXPECT_TRUE(advertisement_);
// Power off the adapter. Advertisement should not be stopped.
BluetoothAdvertisementMac* advertisement_mac =
static_cast<BluetoothAdvertisementMac*>(advertisement_.get());
EXPECT_TRUE(advertisement_mac->is_advertising());
peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
advertisement_manager_.OnPeripheralManagerStateChanged();
EXPECT_TRUE(advertisement_mac->is_advertising());
}
TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest, TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
AdapterReset_RestartAdvertising) { AdapterReset_RestartAdvertising) {
// Register advertisement. // Register advertisement.
...@@ -311,4 +294,31 @@ TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest, ...@@ -311,4 +294,31 @@ TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
[peripheral_manager_mock_ verifyAtLocation:nil]; [peripheral_manager_mock_ verifyAtLocation:nil];
} }
TEST_F(BluetoothLowEnergyAdvertisementManagerMacTest,
Advertising_ThenAdapterPoweredOff_ThenReregister) {
// Register advertisement.
RegisterAdvertisement(CreateAdvertisementData());
advertisement_manager_.DidStartAdvertising(nil);
ui_task_runner_->RunPendingTasks();
EXPECT_TRUE(advertisement_);
// Power off the adapter. Advertisement should be stopped.
OCMExpect([peripheral_manager_ stopAdvertising]);
peripheral_manager_state_ = CBPeripheralManagerStatePoweredOff;
advertisement_manager_.OnPeripheralManagerStateChanged();
[peripheral_manager_mock_ verifyAtLocation:nil];
// Register a new advertisement after powering back on the adapter.
// This should fail as the caller needs to manually unregister the
// advertisement.
peripheral_manager_state_ = CBPeripheralManagerStatePoweredOn;
advertisement_ = nullptr;
RegisterAdvertisement(CreateAdvertisementData());
ui_task_runner_->RunPendingTasks();
EXPECT_FALSE(advertisement_);
ASSERT_TRUE(registration_error_);
EXPECT_EQ(BluetoothAdvertisement::ERROR_ADVERTISEMENT_ALREADY_EXISTS,
*registration_error_);
}
} // namespace device } // namespace device
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment