| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "device/bluetooth/bluetooth_adapter_mac.h" | 5 #include "device/bluetooth/bluetooth_adapter_mac.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/ref_counted.h" | 10 #include "base/memory/ref_counted.h" |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 75 CBAdvertisementDataIsConnectable : @(YES), | 75 CBAdvertisementDataIsConnectable : @(YES), |
| 76 CBAdvertisementDataServiceDataKey : [NSDictionary dictionary], | 76 CBAdvertisementDataServiceDataKey : [NSDictionary dictionary], |
| 77 }; | 77 }; |
| 78 return [advertisement_data retain]; | 78 return [advertisement_data retain]; |
| 79 } | 79 } |
| 80 | 80 |
| 81 std::string GetHashAddress(CBPeripheral* peripheral) { | 81 std::string GetHashAddress(CBPeripheral* peripheral) { |
| 82 return BluetoothLowEnergyDeviceMac::GetPeripheralHashAddress(peripheral); | 82 return BluetoothLowEnergyDeviceMac::GetPeripheralHashAddress(peripheral); |
| 83 } | 83 } |
| 84 | 84 |
| 85 void SetDeviceTimeGreaterThanTimeout(BluetoothLowEnergyDeviceMac* device) { | |
| 86 device->last_update_time_.reset([[NSDate | |
| 87 dateWithTimeInterval:-(BluetoothAdapterMac::kDiscoveryTimeoutSec + 1) | |
| 88 sinceDate:[NSDate date]] retain]); | |
| 89 } | |
| 90 | |
| 91 void AddLowEnergyDevice(BluetoothLowEnergyDeviceMac* device) { | 85 void AddLowEnergyDevice(BluetoothLowEnergyDeviceMac* device) { |
| 92 adapter_mac_->devices_.set(device->GetAddress(), | 86 adapter_mac_->devices_.set(device->GetAddress(), |
| 93 std::unique_ptr<BluetoothDevice>(device)); | 87 std::unique_ptr<BluetoothDevice>(device)); |
| 94 } | 88 } |
| 95 | 89 |
| 96 int NumDevices() { return adapter_mac_->devices_.size(); } | 90 int NumDevices() { return adapter_mac_->devices_.size(); } |
| 97 | 91 |
| 98 bool DevicePresent(CBPeripheral* peripheral) { | 92 bool DevicePresent(CBPeripheral* peripheral) { |
| 99 BluetoothDevice* device = adapter_mac_->GetDevice( | 93 BluetoothDevice* device = adapter_mac_->GetDevice( |
| 100 BluetoothLowEnergyDeviceMac::GetPeripheralHashAddress(peripheral)); | 94 BluetoothLowEnergyDeviceMac::GetPeripheralHashAddress(peripheral)); |
| 101 return (device != NULL); | 95 return (device != NULL); |
| 102 } | 96 } |
| 103 | 97 |
| 104 void RemoveTimedOutDevices() { adapter_mac_->RemoveTimedOutDevices(); } | |
| 105 | |
| 106 bool SetMockCentralManager(CBCentralManagerState desired_state) { | 98 bool SetMockCentralManager(CBCentralManagerState desired_state) { |
| 107 if (!BluetoothAdapterMac::IsLowEnergyAvailable()) { | 99 if (!BluetoothAdapterMac::IsLowEnergyAvailable()) { |
| 108 LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; | 100 LOG(WARNING) << "Low Energy Bluetooth unavailable, skipping unit test."; |
| 109 return false; | 101 return false; |
| 110 } | 102 } |
| 111 mock_central_manager_.reset([[MockCentralManager alloc] init]); | 103 mock_central_manager_.reset([[MockCentralManager alloc] init]); |
| 112 [mock_central_manager_ setState:desired_state]; | 104 [mock_central_manager_ setState:desired_state]; |
| 113 CBCentralManager* centralManager = | 105 CBCentralManager* centralManager = |
| 114 (CBCentralManager*)mock_central_manager_.get(); | 106 (CBCentralManager*)mock_central_manager_.get(); |
| 115 adapter_mac_->SetCentralManagerForTesting(centralManager); | 107 adapter_mac_->SetCentralManagerForTesting(centralManager); |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 263 return; | 255 return; |
| 264 base::scoped_nsobject<NSDictionary> advertisement_data(AdvertisementData()); | 256 base::scoped_nsobject<NSDictionary> advertisement_data(AdvertisementData()); |
| 265 | 257 |
| 266 EXPECT_EQ(0, NumDevices()); | 258 EXPECT_EQ(0, NumDevices()); |
| 267 EXPECT_FALSE(DevicePresent(mock_peripheral)); | 259 EXPECT_FALSE(DevicePresent(mock_peripheral)); |
| 268 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); | 260 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); |
| 269 EXPECT_EQ(1, NumDevices()); | 261 EXPECT_EQ(1, NumDevices()); |
| 270 EXPECT_TRUE(DevicePresent(mock_peripheral)); | 262 EXPECT_TRUE(DevicePresent(mock_peripheral)); |
| 271 } | 263 } |
| 272 | 264 |
| 273 TEST_F(BluetoothAdapterMacTest, LowEnergyDeviceUpdatedOldDevice) { | |
| 274 if (!SetMockCentralManager(CBCentralManagerStatePoweredOn)) | |
| 275 return; | |
| 276 base::scoped_nsobject<CBPeripheral> mock_peripheral( | |
| 277 CreateMockPeripheral(kTestNSUUID)); | |
| 278 if (mock_peripheral.get() == nil) | |
| 279 return; | |
| 280 base::scoped_nsobject<NSDictionary> advertisement_data(AdvertisementData()); | |
| 281 | |
| 282 // Update the device for the first time and check it was correctly added to | |
| 283 // |devices_|. | |
| 284 EXPECT_EQ(0, NumDevices()); | |
| 285 EXPECT_FALSE(DevicePresent(mock_peripheral)); | |
| 286 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); | |
| 287 EXPECT_EQ(1, NumDevices()); | |
| 288 EXPECT_TRUE(DevicePresent(mock_peripheral)); | |
| 289 // Search for the device by the address corresponding to |kTestNSUUID|. | |
| 290 BluetoothDeviceMac* device = | |
| 291 static_cast<BluetoothDeviceMac*>(GetDevice(kTestHashAddress)); | |
| 292 base::scoped_nsobject<NSDate> first_update_time( | |
| 293 [device->GetLastUpdateTime() retain]); | |
| 294 | |
| 295 // Update the device a second time. The device should be updated in | |
| 296 // |devices_| so check the time returned by GetLastUpdateTime() has increased. | |
| 297 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); | |
| 298 EXPECT_EQ(1, NumDevices()); | |
| 299 EXPECT_TRUE(DevicePresent(mock_peripheral)); | |
| 300 device = static_cast<BluetoothDeviceMac*>(GetDevice(kTestHashAddress)); | |
| 301 EXPECT_TRUE([device->GetLastUpdateTime() compare:first_update_time] == | |
| 302 NSOrderedDescending); | |
| 303 } | |
| 304 | |
| 305 TEST_F(BluetoothAdapterMacTest, UpdateDevicesRemovesLowEnergyDevice) { | |
| 306 if (!SetMockCentralManager(CBCentralManagerStatePoweredOn)) | |
| 307 return; | |
| 308 base::scoped_nsobject<CBPeripheral> mock_peripheral( | |
| 309 CreateMockPeripheral(kTestNSUUID)); | |
| 310 if (mock_peripheral.get() == nil) | |
| 311 return; | |
| 312 base::scoped_nsobject<NSDictionary> advertisement_data(AdvertisementData()); | |
| 313 | |
| 314 BluetoothLowEnergyDeviceMac* device = new BluetoothLowEnergyDeviceMac( | |
| 315 adapter_mac_, mock_peripheral, advertisement_data, kTestRssi); | |
| 316 SetDeviceTimeGreaterThanTimeout(device); | |
| 317 | |
| 318 EXPECT_EQ(0, NumDevices()); | |
| 319 AddLowEnergyDevice(device); | |
| 320 EXPECT_EQ(1, NumDevices()); | |
| 321 EXPECT_TRUE(DevicePresent(mock_peripheral)); | |
| 322 | |
| 323 // Check that object pointed to by |device| is deleted by the adapter. | |
| 324 RemoveTimedOutDevices(); | |
| 325 EXPECT_EQ(0, NumDevices()); | |
| 326 EXPECT_FALSE(DevicePresent(mock_peripheral)); | |
| 327 } | |
| 328 | |
| 329 } // namespace device | 265 } // namespace device |
| OLD | NEW |