Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: device/bluetooth/test/bluetooth_test_mac.mm

Issue 1538173003: Implementing GATT connection/disconnect on OS X. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sorting methods between bluetooth_adapter_mac.h and bluetooth_adapter_mac.mm Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/test/bluetooth_test_mac.h" 5 #include "device/bluetooth/test/bluetooth_test_mac.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "build/build_config.h" 10 #include "build/build_config.h"
11 #include "device/bluetooth/bluetooth_adapter_mac.h" 11 #include "device/bluetooth/bluetooth_adapter_mac.h"
12 #include "device/bluetooth/test/mock_bluetooth_cbperipheral_mac.h"
12 #include "device/bluetooth/test/mock_bluetooth_central_manager_mac.h" 13 #include "device/bluetooth/test/mock_bluetooth_central_manager_mac.h"
13 #include "device/bluetooth/test/test_bluetooth_adapter_observer.h" 14 #include "device/bluetooth/test/test_bluetooth_adapter_observer.h"
14 #include "third_party/ocmock/OCMock/OCMock.h" 15 #include "third_party/ocmock/OCMock/OCMock.h"
15 16
16 #if defined(OS_IOS)
17 #import <CoreBluetooth/CoreBluetooth.h> 17 #import <CoreBluetooth/CoreBluetooth.h>
18 #else // !defined(OS_IOS)
19 #import <IOBluetooth/IOBluetooth.h>
20 #endif // defined(OS_IOS)
21 18
22 namespace device { 19 namespace device {
23 20
24 namespace { 21 namespace {
25 22
26 CBPeripheral* CreateMockPeripheral(NSString* peripheral_identifier) { 23 CBPeripheral* CreateMockPeripheral(NSString* peripheral_identifier) {
27 Class peripheral_class = NSClassFromString(@"CBPeripheral"); 24 Class peripheral_class = NSClassFromString(@"CBPeripheral");
28 id mock_peripheral = [OCMockObject mockForClass:[peripheral_class class]]; 25 id mock_peripheral = [OCMockObject mockForClass:[peripheral_class class]];
29 [[[mock_peripheral stub] andReturnValue:@(CBPeripheralStateDisconnected)] 26 [[[mock_peripheral stub] andReturnValue:@(CBPeripheralStateDisconnected)]
30 performSelector:@selector(state)]; 27 performSelector:@selector(state)];
(...skipping 25 matching lines...) Expand all
56 } // namespace 53 } // namespace
57 54
58 // UUID1 hashes to kTestDeviceAddress1, and UUID2 to kTestDeviceAddress2. 55 // UUID1 hashes to kTestDeviceAddress1, and UUID2 to kTestDeviceAddress2.
59 const std::string BluetoothTestMac::kTestPeripheralUUID1 = 56 const std::string BluetoothTestMac::kTestPeripheralUUID1 =
60 "34045B00-0000-0000-0000-000000000000"; 57 "34045B00-0000-0000-0000-000000000000";
61 const std::string BluetoothTestMac::kTestPeripheralUUID2 = 58 const std::string BluetoothTestMac::kTestPeripheralUUID2 =
62 "EC1B8F00-0000-0000-0000-000000000000"; 59 "EC1B8F00-0000-0000-0000-000000000000";
63 60
64 BluetoothTestMac::BluetoothTestMac() {} 61 BluetoothTestMac::BluetoothTestMac() {}
65 62
66 BluetoothTestMac::~BluetoothTestMac() {} 63 BluetoothTestMac::~BluetoothTestMac() {
64 [(MockCentralManager*)mock_central_manager_ release];
scheib 2016/02/10 18:59:46 Use static_cast instead of C-Style casts. https://
jlebel 2016/02/10 21:20:08 Done.
65 }
67 66
68 void BluetoothTestMac::SetUp() {} 67 void BluetoothTestMac::SetUp() {}
69 68
70 bool BluetoothTestMac::PlatformSupportsLowEnergy() { 69 bool BluetoothTestMac::PlatformSupportsLowEnergy() {
71 return BluetoothAdapterMac::IsLowEnergyAvailable(); 70 return BluetoothAdapterMac::IsLowEnergyAvailable();
72 } 71 }
73 72
74 void BluetoothTestMac::InitWithDefaultAdapter() { 73 void BluetoothTestMac::InitWithDefaultAdapter() {
75 adapter_mac_ = BluetoothAdapterMac::CreateAdapter().get(); 74 adapter_mac_ = BluetoothAdapterMac::CreateAdapter().get();
76 adapter_ = adapter_mac_; 75 adapter_ = adapter_mac_;
77 } 76 }
78 77
79 void BluetoothTestMac::InitWithoutDefaultAdapter() { 78 void BluetoothTestMac::InitWithoutDefaultAdapter() {
80 adapter_mac_ = BluetoothAdapterMac::CreateAdapterForTest( 79 adapter_mac_ = BluetoothAdapterMac::CreateAdapterForTest(
81 "", "", message_loop_.task_runner()) 80 "", "", message_loop_.task_runner())
82 .get(); 81 .get();
83 adapter_ = adapter_mac_; 82 adapter_ = adapter_mac_;
84 83
85 if (BluetoothAdapterMac::IsLowEnergyAvailable()) { 84 if (BluetoothAdapterMac::IsLowEnergyAvailable()) {
86 id low_energy_central_manager = [[MockCentralManager alloc] init]; 85 mock_central_manager_ = [[MockCentralManager alloc] init];
87 [low_energy_central_manager setState:CBCentralManagerStateUnsupported]; 86 MockCentralManager* mock_central_manager =
88 adapter_mac_->SetCentralManagerForTesting(low_energy_central_manager); 87 (MockCentralManager*)mock_central_manager_;
88 [mock_central_manager setBluetoothTestMac:this];
89 [mock_central_manager setState:CBCentralManagerStateUnsupported];
90 adapter_mac_->SetCentralManagerForTesting((id)mock_central_manager);
89 } 91 }
90 } 92 }
91 93
92 void BluetoothTestMac::InitWithFakeAdapter() { 94 void BluetoothTestMac::InitWithFakeAdapter() {
93 adapter_mac_ = 95 adapter_mac_ =
94 BluetoothAdapterMac::CreateAdapterForTest( 96 BluetoothAdapterMac::CreateAdapterForTest(
95 kTestAdapterName, kTestAdapterAddress, message_loop_.task_runner()) 97 kTestAdapterName, kTestAdapterAddress, message_loop_.task_runner())
96 .get(); 98 .get();
97 adapter_ = adapter_mac_; 99 adapter_ = adapter_mac_;
98 100
99 if (BluetoothAdapterMac::IsLowEnergyAvailable()) { 101 if (BluetoothAdapterMac::IsLowEnergyAvailable()) {
100 id low_energy_central_manager = [[MockCentralManager alloc] init]; 102 mock_central_manager_ = [[MockCentralManager alloc] init];
101 [low_energy_central_manager setState:CBCentralManagerStatePoweredOn]; 103 MockCentralManager* mock_central_manager =
102 adapter_mac_->SetCentralManagerForTesting(low_energy_central_manager); 104 (MockCentralManager*)mock_central_manager_;
105 mock_central_manager.bluetoothTestMac = this;
106 [mock_central_manager setState:CBCentralManagerStatePoweredOn];
107 adapter_mac_->SetCentralManagerForTesting((id)mock_central_manager);
103 } 108 }
104 } 109 }
105 110
106 BluetoothDevice* BluetoothTestMac::DiscoverLowEnergyDevice(int device_ordinal) { 111 BluetoothDevice* BluetoothTestMac::DiscoverLowEnergyDevice(int device_ordinal) {
107 TestBluetoothAdapterObserver observer(adapter_); 112 TestBluetoothAdapterObserver observer(adapter_);
108 CBCentralManager* central_manager = adapter_mac_->low_energy_central_manager_; 113 CBCentralManager* central_manager = adapter_mac_->low_energy_central_manager_;
109 BluetoothLowEnergyCentralManagerDelegate* central_manager_delegate = 114 BluetoothLowEnergyCentralManagerDelegate* central_manager_delegate =
110 adapter_mac_->low_energy_central_manager_delegate_; 115 adapter_mac_->low_energy_central_manager_delegate_;
111 Class cbuuid_class = NSClassFromString(@"CBUUID"); 116 Class cbuuid_class = NSClassFromString(@"CBUUID");
112 switch (device_ordinal) { 117 switch (device_ordinal) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 stringWithUTF8String:kTestUUIDLinkLoss.c_str()]] 149 stringWithUTF8String:kTestUUIDLinkLoss.c_str()]]
145 ]; 150 ];
146 NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids); 151 NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids);
147 [central_manager_delegate centralManager:central_manager 152 [central_manager_delegate centralManager:central_manager
148 didDiscoverPeripheral:peripheral 153 didDiscoverPeripheral:peripheral
149 advertisementData:advertisement_data 154 advertisementData:advertisement_data
150 RSSI:[NSNumber numberWithInt:0]]; 155 RSSI:[NSNumber numberWithInt:0]];
151 break; 156 break;
152 } 157 }
153 case 3: { 158 case 3: {
154 CBPeripheral* peripheral = CreateMockPeripheral( 159 NSString* uuid_string =
155 [NSString stringWithUTF8String:kTestPeripheralUUID1.c_str()]); 160 [NSString stringWithUTF8String:kTestPeripheralUUID1.c_str()];
161 NSUUID* identifier = [[NSUUID alloc] initWithUUIDString:uuid_string];
162 CBPeripheral* peripheral = (CBPeripheral*)[[MockCBPeripheral alloc]
scheib 2016/02/10 18:59:46 scoped object?
jlebel 2016/02/10 21:20:08 Done.
163 initWithIdentifier:identifier];
156 NSString* name = 164 NSString* name =
157 [NSString stringWithUTF8String:kTestDeviceNameEmpty.c_str()]; 165 [NSString stringWithUTF8String:kTestDeviceNameEmpty.c_str()];
158 NSArray* uuids = nil; 166 NSArray* uuids = nil;
159 NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids); 167 NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids);
160 [central_manager_delegate centralManager:central_manager 168 [central_manager_delegate centralManager:central_manager
161 didDiscoverPeripheral:peripheral 169 didDiscoverPeripheral:peripheral
162 advertisementData:advertisement_data 170 advertisementData:advertisement_data
163 RSSI:[NSNumber numberWithInt:0]]; 171 RSSI:[NSNumber numberWithInt:0]];
172 [peripheral release];
164 break; 173 break;
165 } 174 }
166 case 4: { 175 case 4: {
167 CBPeripheral* peripheral = CreateMockPeripheral( 176 CBPeripheral* peripheral = CreateMockPeripheral(
168 [NSString stringWithUTF8String:kTestPeripheralUUID2.c_str()]); 177 [NSString stringWithUTF8String:kTestPeripheralUUID2.c_str()]);
169 NSString* name = 178 NSString* name =
170 [NSString stringWithUTF8String:kTestDeviceNameEmpty.c_str()]; 179 [NSString stringWithUTF8String:kTestDeviceNameEmpty.c_str()];
171 NSArray* uuids = nil; 180 NSArray* uuids = nil;
172 NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids); 181 NSDictionary* advertisement_data = CreateAdvertisementData(name, uuids);
173 [central_manager_delegate centralManager:central_manager 182 [central_manager_delegate centralManager:central_manager
174 didDiscoverPeripheral:peripheral 183 didDiscoverPeripheral:peripheral
175 advertisementData:advertisement_data 184 advertisementData:advertisement_data
176 RSSI:[NSNumber numberWithInt:0]]; 185 RSSI:[NSNumber numberWithInt:0]];
177 break; 186 break;
178 } 187 }
179 } 188 }
180 return observer.last_device(); 189 return observer.last_device();
181 } 190 }
182 191
192 void BluetoothTestMac::SimulateGattConnection(BluetoothDevice* device) {
193 BluetoothLowEnergyDeviceMac* lowEnergyDeviceMac =
194 (BluetoothLowEnergyDeviceMac*)device;
195 CBPeripheral* peripheral = lowEnergyDeviceMac->GetPeripheral();
196 MockCBPeripheral* mockPeripheral = (MockCBPeripheral*)peripheral;
197 [mockPeripheral setStateForTesting:CBPeripheralStateConnected];
198 CBCentralManager* centralManager = (CBCentralManager*)mock_central_manager_;
199 [centralManager.delegate centralManager:centralManager
200 didConnectPeripheral:peripheral];
201 }
202
203 void BluetoothTestMac::SimulateGattDisconnection(BluetoothDevice* device) {
204 BluetoothLowEnergyDeviceMac* lowEnergyDeviceMac =
205 (BluetoothLowEnergyDeviceMac*)device;
206 CBPeripheral* peripheral = lowEnergyDeviceMac->GetPeripheral();
207 MockCBPeripheral* mockPeripheral = (MockCBPeripheral*)peripheral;
208 [mockPeripheral setStateForTesting:CBPeripheralStateDisconnected];
209 CBCentralManager* centralManager = (CBCentralManager*)mock_central_manager_;
210 [centralManager.delegate centralManager:centralManager
211 didDisconnectPeripheral:peripheral
212 error:nil];
213 }
214
215 void BluetoothTestMac::SimulateGattConnectionError(
216 BluetoothDevice* device,
217 BluetoothDevice::ConnectErrorCode errorCode) {
218 BluetoothLowEnergyDeviceMac* lowEnergyDeviceMac =
219 (BluetoothLowEnergyDeviceMac*)device;
220 CBPeripheral* peripheral = lowEnergyDeviceMac->GetPeripheral();
221 MockCBPeripheral* mockPeripheral = (MockCBPeripheral*)peripheral;
222 [mockPeripheral setStateForTesting:CBPeripheralStateDisconnected];
223 CBCentralManager* centralManager = (CBCentralManager*)mock_central_manager_;
224 // TODO(jlebel): Need to convert the connect error code into NSError
scheib 2016/02/10 18:59:46 ditto: crbug.com
jlebel 2016/02/10 21:20:08 Done.
225 NSError* error = [NSError errorWithDomain:@"BluetoothDevice::ConnectErrorCode"
226 code:-1
227 userInfo:nil];
228 [centralManager.delegate centralManager:centralManager
229 didFailToConnectPeripheral:peripheral
230 error:error];
231 }
232
233 void BluetoothTestMac::OnFakeBluetoothDeviceConnectGattCalled() {
234 gatt_connection_attempts_++;
235 }
236
237 void BluetoothTestMac::OnFakeBluetoothGattDisconnect() {
238 gatt_disconnection_attempts_++;
239 }
240
183 // Utility function for generating new (CBUUID, address) pairs where CBUUID 241 // Utility function for generating new (CBUUID, address) pairs where CBUUID
184 // hashes to address. For use when adding a new device address to the testing 242 // hashes to address. For use when adding a new device address to the testing
185 // suite because CoreBluetooth peripherals have CBUUIDs in place of addresses, 243 // suite because CoreBluetooth peripherals have CBUUIDs in place of addresses,
186 // and we construct fake addresses for them by hashing the CBUUID. By changing 244 // and we construct fake addresses for them by hashing the CBUUID. By changing
187 // |target| the user can generate sequentially numbered test addresses. 245 // |target| the user can generate sequentially numbered test addresses.
188 // 246 //
189 // std::string BluetoothTestMac::FindCBUUIDForHashTarget() { 247 // std::string BluetoothTestMac::FindCBUUIDForHashTarget() {
190 // // The desired first 6 digits of the hash. For example 0100000, 020000, 248 // // The desired first 6 digits of the hash. For example 0100000, 020000,
191 // // 030000, ... 249 // // 030000, ...
192 // const std::string target = "010000"; 250 // const std::string target = "010000";
(...skipping 16 matching lines...) Expand all
209 // crypto::SHA256HashString(input_str, raw, sizeof(raw)); 267 // crypto::SHA256HashString(input_str, raw, sizeof(raw));
210 // if (base::HexEncode(raw, sizeof(raw)) == target) { 268 // if (base::HexEncode(raw, sizeof(raw)) == target) {
211 // return input_str; 269 // return input_str;
212 // } 270 // }
213 // ++input[0]; 271 // ++input[0];
214 // } 272 // }
215 // return ""; 273 // return "";
216 // } 274 // }
217 275
218 } // namespace device 276 } // namespace device
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698