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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 base::scoped_nsobject<NSDictionary> advertisement_data( | 256 base::scoped_nsobject<NSDictionary> advertisement_data( |
265 CreateAdvertisementData()); | 257 CreateAdvertisementData()); |
266 | 258 |
267 EXPECT_EQ(0, NumDevices()); | 259 EXPECT_EQ(0, NumDevices()); |
268 EXPECT_FALSE(DevicePresent(mock_peripheral)); | 260 EXPECT_FALSE(DevicePresent(mock_peripheral)); |
269 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); | 261 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); |
270 EXPECT_EQ(1, NumDevices()); | 262 EXPECT_EQ(1, NumDevices()); |
271 EXPECT_TRUE(DevicePresent(mock_peripheral)); | 263 EXPECT_TRUE(DevicePresent(mock_peripheral)); |
272 } | 264 } |
273 | 265 |
274 TEST_F(BluetoothAdapterMacTest, LowEnergyDeviceUpdatedOldDevice) { | |
275 if (!SetMockCentralManager(CBCentralManagerStatePoweredOn)) | |
276 return; | |
277 base::scoped_nsobject<CBPeripheral> mock_peripheral( | |
278 CreateMockPeripheral(kTestNSUUID)); | |
279 if (mock_peripheral.get() == nil) | |
280 return; | |
281 base::scoped_nsobject<NSDictionary> advertisement_data( | |
282 CreateAdvertisementData()); | |
283 | |
284 // Update the device for the first time and check it was correctly added to | |
285 // |devices_|. | |
286 EXPECT_EQ(0, NumDevices()); | |
287 EXPECT_FALSE(DevicePresent(mock_peripheral)); | |
288 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); | |
289 EXPECT_EQ(1, NumDevices()); | |
290 EXPECT_TRUE(DevicePresent(mock_peripheral)); | |
291 // Search for the device by the address corresponding to |kTestNSUUID|. | |
292 BluetoothDeviceMac* device = | |
293 static_cast<BluetoothDeviceMac*>(GetDevice(kTestHashAddress)); | |
294 base::scoped_nsobject<NSDate> first_update_time( | |
295 [device->GetLastUpdateTime() retain]); | |
296 | |
297 // Update the device a second time. The device should be updated in | |
298 // |devices_| so check the time returned by GetLastUpdateTime() has increased. | |
299 LowEnergyDeviceUpdated(mock_peripheral, advertisement_data, kTestRssi); | |
300 EXPECT_EQ(1, NumDevices()); | |
301 EXPECT_TRUE(DevicePresent(mock_peripheral)); | |
302 device = static_cast<BluetoothDeviceMac*>(GetDevice(kTestHashAddress)); | |
303 EXPECT_TRUE([device->GetLastUpdateTime() compare:first_update_time] == | |
304 NSOrderedDescending); | |
305 } | |
306 | |
307 TEST_F(BluetoothAdapterMacTest, UpdateDevicesRemovesLowEnergyDevice) { | |
308 if (!SetMockCentralManager(CBCentralManagerStatePoweredOn)) | |
309 return; | |
310 base::scoped_nsobject<CBPeripheral> mock_peripheral( | |
311 CreateMockPeripheral(kTestNSUUID)); | |
312 if (mock_peripheral.get() == nil) | |
313 return; | |
314 base::scoped_nsobject<NSDictionary> advertisement_data( | |
315 CreateAdvertisementData()); | |
316 | |
317 BluetoothLowEnergyDeviceMac* device = new BluetoothLowEnergyDeviceMac( | |
318 adapter_mac_, mock_peripheral, advertisement_data, kTestRssi); | |
319 SetDeviceTimeGreaterThanTimeout(device); | |
320 | |
321 EXPECT_EQ(0, NumDevices()); | |
322 AddLowEnergyDevice(device); | |
323 EXPECT_EQ(1, NumDevices()); | |
324 EXPECT_TRUE(DevicePresent(mock_peripheral)); | |
325 | |
326 // Check that object pointed to by |device| is deleted by the adapter. | |
327 RemoveTimedOutDevices(); | |
328 EXPECT_EQ(0, NumDevices()); | |
329 EXPECT_FALSE(DevicePresent(mock_peripheral)); | |
330 } | |
331 | |
332 } // namespace device | 266 } // namespace device |
OLD | NEW |