| Index: device/bluetooth/test/bluetooth_test_mac.mm
|
| diff --git a/device/bluetooth/test/bluetooth_test_mac.mm b/device/bluetooth/test/bluetooth_test_mac.mm
|
| index d64b5f79787622c89b85492f6684c06843f3c52b..9ad45830154dc291b8ce816641424ab9b73cb546 100644
|
| --- a/device/bluetooth/test/bluetooth_test_mac.mm
|
| +++ b/device/bluetooth/test/bluetooth_test_mac.mm
|
| @@ -6,21 +6,38 @@
|
|
|
| #include <stdint.h>
|
|
|
| +#include "base/mac/foundation_util.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "build/build_config.h"
|
| #include "device/bluetooth/bluetooth_adapter_mac.h"
|
| +#include "device/bluetooth/test/mock_bluetooth_cbperipheral_mac.h"
|
| #include "device/bluetooth/test/mock_bluetooth_central_manager_mac.h"
|
| #include "device/bluetooth/test/test_bluetooth_adapter_observer.h"
|
| #include "third_party/ocmock/OCMock/OCMock.h"
|
|
|
| -#if defined(OS_IOS)
|
| #import <CoreBluetooth/CoreBluetooth.h>
|
| -#else // !defined(OS_IOS)
|
| -#import <IOBluetooth/IOBluetooth.h>
|
| -#endif // defined(OS_IOS)
|
| +
|
| +using base::mac::ObjCCast;
|
| +using base::scoped_nsobject;
|
|
|
| namespace device {
|
|
|
| +// This class hides Objective-C from bluetooth_test_mac.h.
|
| +class BluetoothTestMac::ScopedMockCentralManager {
|
| + public:
|
| + explicit ScopedMockCentralManager(MockCentralManager* mock_central_manager) {
|
| + mock_central_manager_.reset(mock_central_manager);
|
| + }
|
| +
|
| + // Returns MockCentralManager instance.
|
| + MockCentralManager* get() { return mock_central_manager_.get(); };
|
| +
|
| + private:
|
| + scoped_nsobject<MockCentralManager> mock_central_manager_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(ScopedMockCentralManager);
|
| +};
|
| +
|
| namespace {
|
|
|
| CBPeripheral* CreateMockPeripheral(NSString* peripheral_identifier) {
|
| @@ -83,9 +100,11 @@ void BluetoothTestMac::InitWithoutDefaultAdapter() {
|
| adapter_ = adapter_mac_;
|
|
|
| if (BluetoothAdapterMac::IsLowEnergyAvailable()) {
|
| - id low_energy_central_manager = [[MockCentralManager alloc] init];
|
| - [low_energy_central_manager setState:CBCentralManagerStateUnsupported];
|
| - adapter_mac_->SetCentralManagerForTesting(low_energy_central_manager);
|
| + mock_central_manager_.reset(
|
| + new ScopedMockCentralManager([[MockCentralManager alloc] init]));
|
| + [mock_central_manager_->get() setBluetoothTestMac:this];
|
| + [mock_central_manager_->get() setState:CBCentralManagerStateUnsupported];
|
| + adapter_mac_->SetCentralManagerForTesting((id)mock_central_manager_->get());
|
| }
|
| }
|
|
|
| @@ -97,9 +116,11 @@ void BluetoothTestMac::InitWithFakeAdapter() {
|
| adapter_ = adapter_mac_;
|
|
|
| if (BluetoothAdapterMac::IsLowEnergyAvailable()) {
|
| - id low_energy_central_manager = [[MockCentralManager alloc] init];
|
| - [low_energy_central_manager setState:CBCentralManagerStatePoweredOn];
|
| - adapter_mac_->SetCentralManagerForTesting(low_energy_central_manager);
|
| + mock_central_manager_.reset(
|
| + new ScopedMockCentralManager([[MockCentralManager alloc] init]));
|
| + mock_central_manager_->get().bluetoothTestMac = this;
|
| + [mock_central_manager_->get() setState:CBCentralManagerStatePoweredOn];
|
| + adapter_mac_->SetCentralManagerForTesting((id)mock_central_manager_->get());
|
| }
|
| }
|
|
|
| @@ -151,12 +172,17 @@ BluetoothDevice* BluetoothTestMac::DiscoverLowEnergyDevice(int device_ordinal) {
|
| break;
|
| }
|
| case 3: {
|
| - CBPeripheral* peripheral = CreateMockPeripheral(
|
| - [NSString stringWithUTF8String:kTestPeripheralUUID1.c_str()]);
|
| - NSString* name =
|
| - [NSString stringWithUTF8String:kTestDeviceNameEmpty.c_str()];
|
| - NSArray* uuids = nil;
|
| - NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids);
|
| + scoped_nsobject<NSString> uuid_string(
|
| + [[NSString alloc] initWithUTF8String:kTestPeripheralUUID1.c_str()]);
|
| + scoped_nsobject<NSUUID> identifier(
|
| + [[NSUUID alloc] initWithUUIDString:uuid_string]);
|
| + scoped_nsobject<CBPeripheral> peripheral;
|
| + peripheral.reset(static_cast<CBPeripheral*>(
|
| + [[MockCBPeripheral alloc] initWithIdentifier:identifier]));
|
| + scoped_nsobject<NSString> name(
|
| + [[NSString alloc] initWithUTF8String:kTestDeviceNameEmpty.c_str()]);
|
| + scoped_nsobject<NSDictionary> advertisement_data(
|
| + [CreateAdvertisementData(name, nil) retain]);
|
| [central_manager_delegate centralManager:central_manager
|
| didDiscoverPeripheral:peripheral
|
| advertisementData:advertisement_data
|
| @@ -180,6 +206,59 @@ BluetoothDevice* BluetoothTestMac::DiscoverLowEnergyDevice(int device_ordinal) {
|
| return observer.last_device();
|
| }
|
|
|
| +void BluetoothTestMac::SimulateGattConnection(BluetoothDevice* device) {
|
| + BluetoothLowEnergyDeviceMac* lowEnergyDeviceMac =
|
| + static_cast<BluetoothLowEnergyDeviceMac*>(device);
|
| + CBPeripheral* peripheral = lowEnergyDeviceMac->GetPeripheral();
|
| + MockCBPeripheral* mockPeripheral = (MockCBPeripheral*)peripheral;
|
| + [mockPeripheral setState:CBPeripheralStateConnected];
|
| + CBCentralManager* centralManager =
|
| + ObjCCast<CBCentralManager>(mock_central_manager_->get());
|
| + [centralManager.delegate centralManager:centralManager
|
| + didConnectPeripheral:peripheral];
|
| +}
|
| +
|
| +void BluetoothTestMac::SimulateGattDisconnection(BluetoothDevice* device) {
|
| + BluetoothLowEnergyDeviceMac* lowEnergyDeviceMac =
|
| + static_cast<BluetoothLowEnergyDeviceMac*>(device);
|
| + CBPeripheral* peripheral = lowEnergyDeviceMac->GetPeripheral();
|
| + MockCBPeripheral* mockPeripheral = (MockCBPeripheral*)peripheral;
|
| + [mockPeripheral setState:CBPeripheralStateDisconnected];
|
| + CBCentralManager* centralManager =
|
| + ObjCCast<CBCentralManager>(mock_central_manager_->get());
|
| + [centralManager.delegate centralManager:centralManager
|
| + didDisconnectPeripheral:peripheral
|
| + error:nil];
|
| +}
|
| +
|
| +void BluetoothTestMac::SimulateGattConnectionError(
|
| + BluetoothDevice* device,
|
| + BluetoothDevice::ConnectErrorCode errorCode) {
|
| + BluetoothLowEnergyDeviceMac* lowEnergyDeviceMac =
|
| + static_cast<BluetoothLowEnergyDeviceMac*>(device);
|
| + CBPeripheral* peripheral = lowEnergyDeviceMac->GetPeripheral();
|
| + MockCBPeripheral* mockPeripheral = (MockCBPeripheral*)peripheral;
|
| + [mockPeripheral setState:CBPeripheralStateDisconnected];
|
| + CBCentralManager* centralManager =
|
| + ObjCCast<CBCentralManager>(mock_central_manager_->get());
|
| + // TODO(http://crbug.com/585894): Need to convert the connect error code into
|
| + // NSError
|
| + NSError* error = [NSError errorWithDomain:@"BluetoothDevice::ConnectErrorCode"
|
| + code:-1
|
| + userInfo:nil];
|
| + [centralManager.delegate centralManager:centralManager
|
| + didFailToConnectPeripheral:peripheral
|
| + error:error];
|
| +}
|
| +
|
| +void BluetoothTestMac::OnFakeBluetoothDeviceConnectGattCalled() {
|
| + gatt_connection_attempts_++;
|
| +}
|
| +
|
| +void BluetoothTestMac::OnFakeBluetoothGattDisconnect() {
|
| + gatt_disconnection_attempts_++;
|
| +}
|
| +
|
| // Utility function for generating new (CBUUID, address) pairs where CBUUID
|
| // hashes to address. For use when adding a new device address to the testing
|
| // suite because CoreBluetooth peripherals have CBUUIDs in place of addresses,
|
|
|