OLD | NEW |
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 "content/shell/browser/layout_test/layout_test_bluetooth_adapter_provid
er.h" | 5 #include "content/shell/browser/layout_test/layout_test_bluetooth_adapter_provid
er.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
116 return NULL; | 116 return NULL; |
117 } | 117 } |
118 | 118 |
119 std::set<BluetoothUUID> GetUUIDs( | 119 std::set<BluetoothUUID> GetUUIDs( |
120 const device::BluetoothDiscoveryFilter* filter) { | 120 const device::BluetoothDiscoveryFilter* filter) { |
121 std::set<BluetoothUUID> result; | 121 std::set<BluetoothUUID> result; |
122 filter->GetUUIDs(result); | 122 filter->GetUUIDs(result); |
123 return result; | 123 return result; |
124 } | 124 } |
125 | 125 |
| 126 // Notifies the adapter's observers for each device id the adapter. |
| 127 void NotifyDevicesAdded(MockBluetoothAdapter* adapter) { |
| 128 for (BluetoothDevice* device : adapter->GetMockDevices()) { |
| 129 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, adapter->GetObservers(), |
| 130 DeviceAdded(adapter, device)); |
| 131 } |
| 132 } |
| 133 |
126 // Notifies the adapter's observers that the services have been discovered. | 134 // Notifies the adapter's observers that the services have been discovered. |
127 void NotifyServicesDiscovered(MockBluetoothAdapter* adapter, | 135 void NotifyServicesDiscovered(MockBluetoothAdapter* adapter, |
128 MockBluetoothDevice* device) { | 136 MockBluetoothDevice* device) { |
129 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, adapter->GetObservers(), | 137 FOR_EACH_OBSERVER(BluetoothAdapter::Observer, adapter->GetObservers(), |
130 GattServicesDiscovered(adapter, device)); | 138 GattServicesDiscovered(adapter, device)); |
131 } | 139 } |
132 | 140 |
133 // Notifies the adapter's observers that a device has changed. | 141 // Notifies the adapter's observers that a device has changed. |
134 void NotifyDeviceChanged(MockBluetoothAdapter* adapter, | 142 void NotifyDeviceChanged(MockBluetoothAdapter* adapter, |
135 MockBluetoothDevice* device) { | 143 MockBluetoothDevice* device) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 return GetServicesDiscoveredAfterReconnectionAdapter( | 189 return GetServicesDiscoveredAfterReconnectionAdapter( |
182 false /* disconnect */); | 190 false /* disconnect */); |
183 if (fake_adapter_name == "BlacklistTestAdapter") | 191 if (fake_adapter_name == "BlacklistTestAdapter") |
184 return GetBlacklistTestAdapter(); | 192 return GetBlacklistTestAdapter(); |
185 if (fake_adapter_name == "FailingConnectionsAdapter") | 193 if (fake_adapter_name == "FailingConnectionsAdapter") |
186 return GetFailingConnectionsAdapter(); | 194 return GetFailingConnectionsAdapter(); |
187 if (fake_adapter_name == "FailingGATTOperationsAdapter") | 195 if (fake_adapter_name == "FailingGATTOperationsAdapter") |
188 return GetFailingGATTOperationsAdapter(); | 196 return GetFailingGATTOperationsAdapter(); |
189 if (fake_adapter_name == "SecondDiscoveryFindsHeartRateAdapter") | 197 if (fake_adapter_name == "SecondDiscoveryFindsHeartRateAdapter") |
190 return GetSecondDiscoveryFindsHeartRateAdapter(); | 198 return GetSecondDiscoveryFindsHeartRateAdapter(); |
| 199 if (fake_adapter_name == "DeviceEventAdapter") |
| 200 return GetDeviceEventAdapter(); |
191 if (fake_adapter_name == "DelayedServicesDiscoveryAdapter") | 201 if (fake_adapter_name == "DelayedServicesDiscoveryAdapter") |
192 return GetDelayedServicesDiscoveryAdapter(); | 202 return GetDelayedServicesDiscoveryAdapter(); |
193 if (fake_adapter_name.empty()) | 203 if (fake_adapter_name.empty()) |
194 return nullptr; | 204 return nullptr; |
195 // New adapters that can be used when fuzzing the Web Bluetooth API | 205 // New adapters that can be used when fuzzing the Web Bluetooth API |
196 // should also be added to | 206 // should also be added to |
197 // src/third_party/WebKit/Source/modules/ | 207 // src/third_party/WebKit/Source/modules/ |
198 // bluetooth/testing/clusterfuzz/constraints.py. | 208 // bluetooth/testing/clusterfuzz/constraints.py. |
199 | 209 |
200 NOTREACHED() << fake_adapter_name; | 210 NOTREACHED() << fake_adapter_name; |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPresentAdapter()); | 266 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPresentAdapter()); |
257 ON_CALL(*adapter, IsPowered()).WillByDefault(Return(false)); | 267 ON_CALL(*adapter, IsPowered()).WillByDefault(Return(false)); |
258 | 268 |
259 return adapter; | 269 return adapter; |
260 } | 270 } |
261 | 271 |
262 // static | 272 // static |
263 scoped_refptr<NiceMockBluetoothAdapter> | 273 scoped_refptr<NiceMockBluetoothAdapter> |
264 LayoutTestBluetoothAdapterProvider::GetScanFilterCheckingAdapter() { | 274 LayoutTestBluetoothAdapterProvider::GetScanFilterCheckingAdapter() { |
265 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); | 275 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); |
| 276 MockBluetoothAdapter* adapter_ptr = adapter.get(); |
266 | 277 |
267 // This fails the test with an error message listing actual and expected UUIDs | 278 // This fails the test with an error message listing actual and expected UUIDs |
268 // if StartDiscoverySessionWithFilter() is called with the wrong argument. | 279 // if StartDiscoverySessionWithFilter() is called with the wrong argument. |
269 EXPECT_CALL( | 280 EXPECT_CALL( |
270 *adapter, | 281 *adapter, |
271 StartDiscoverySessionWithFilterRaw( | 282 StartDiscoverySessionWithFilterRaw( |
272 ResultOf(&GetUUIDs, ElementsAre(BluetoothUUID(kGlucoseServiceUUID), | 283 ResultOf(&GetUUIDs, ElementsAre(BluetoothUUID(kGlucoseServiceUUID), |
273 BluetoothUUID(kHeartRateServiceUUID), | 284 BluetoothUUID(kHeartRateServiceUUID), |
274 BluetoothUUID(kBatteryServiceUUID))), | 285 BluetoothUUID(kBatteryServiceUUID))), |
275 _, _)) | 286 _, _)) |
276 .WillRepeatedly(RunCallbackWithResult<1 /* success_callback */>( | 287 .WillRepeatedly( |
277 []() { return GetDiscoverySession(); })); | 288 RunCallbackWithResult<1 /* success_callback */>([adapter_ptr]() { |
| 289 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 290 FROM_HERE, base::Bind(&NotifyDevicesAdded, |
| 291 base::RetainedRef(adapter_ptr))); |
| 292 |
| 293 return GetDiscoverySession(); |
| 294 })); |
278 | 295 |
279 // Any unexpected call results in the failure callback. | 296 // Any unexpected call results in the failure callback. |
280 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) | 297 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) |
281 .WillByDefault(RunCallback<2 /* error_callback */>()); | 298 .WillByDefault(RunCallback<2 /* error_callback */>()); |
282 | 299 |
283 // We need to add a device otherwise requestDevice would reject. | 300 // We need to add a device otherwise requestDevice would reject. |
284 adapter->AddMockDevice(GetBatteryDevice(adapter.get())); | 301 adapter->AddMockDevice(GetBatteryDevice(adapter.get())); |
285 | 302 |
286 return adapter; | 303 return adapter; |
287 } | 304 } |
288 | 305 |
289 // static | 306 // static |
290 scoped_refptr<NiceMockBluetoothAdapter> | 307 scoped_refptr<NiceMockBluetoothAdapter> |
291 LayoutTestBluetoothAdapterProvider::GetFailStartDiscoveryAdapter() { | 308 LayoutTestBluetoothAdapterProvider::GetFailStartDiscoveryAdapter() { |
292 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); | 309 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); |
293 | 310 |
294 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) | 311 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) |
295 .WillByDefault(RunCallback<2 /* error_callback */>()); | 312 .WillByDefault(RunCallback<2 /* error_callback */>()); |
296 | 313 |
297 return adapter; | 314 return adapter; |
298 } | 315 } |
299 | 316 |
300 // static | 317 // static |
301 scoped_refptr<NiceMockBluetoothAdapter> | 318 scoped_refptr<NiceMockBluetoothAdapter> |
302 LayoutTestBluetoothAdapterProvider::GetEmptyAdapter() { | 319 LayoutTestBluetoothAdapterProvider::GetEmptyAdapter() { |
303 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); | 320 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); |
304 | 321 |
| 322 MockBluetoothAdapter* adapter_ptr = adapter.get(); |
| 323 |
305 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) | 324 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) |
306 .WillByDefault(RunCallbackWithResult<1 /* success_callback */>( | 325 .WillByDefault( |
307 []() { return GetDiscoverySession(); })); | 326 RunCallbackWithResult<1 /* success_callback */>([adapter_ptr]() { |
| 327 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 328 FROM_HERE, base::Bind(&NotifyDevicesAdded, |
| 329 base::RetainedRef(adapter_ptr))); |
| 330 |
| 331 return GetDiscoverySession(); |
| 332 })); |
308 | 333 |
309 return adapter; | 334 return adapter; |
310 } | 335 } |
311 | 336 |
312 // static | 337 // static |
313 scoped_refptr<NiceMockBluetoothAdapter> | 338 scoped_refptr<NiceMockBluetoothAdapter> |
314 LayoutTestBluetoothAdapterProvider::GetGlucoseHeartRateAdapter() { | 339 LayoutTestBluetoothAdapterProvider::GetGlucoseHeartRateAdapter() { |
315 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetEmptyAdapter()); | 340 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetEmptyAdapter()); |
316 | 341 |
317 adapter->AddMockDevice(GetHeartRateDevice(adapter.get())); | 342 adapter->AddMockDevice(GetHeartRateDevice(adapter.get())); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
349 EXPECT_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) | 374 EXPECT_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) |
350 .WillOnce(RunCallbackWithResult<1 /* success_callback */>( | 375 .WillOnce(RunCallbackWithResult<1 /* success_callback */>( |
351 []() { return GetDiscoverySession(); })) | 376 []() { return GetDiscoverySession(); })) |
352 .WillOnce( | 377 .WillOnce( |
353 RunCallbackWithResult<1 /* success_callback */>([adapter_ptr]() { | 378 RunCallbackWithResult<1 /* success_callback */>([adapter_ptr]() { |
354 // In the second discovery session, have the adapter discover a new | 379 // In the second discovery session, have the adapter discover a new |
355 // device, shortly after the session starts. | 380 // device, shortly after the session starts. |
356 base::ThreadTaskRunnerHandle::Get()->PostTask( | 381 base::ThreadTaskRunnerHandle::Get()->PostTask( |
357 FROM_HERE, | 382 FROM_HERE, |
358 base::Bind(&AddDevice, make_scoped_refptr(adapter_ptr), | 383 base::Bind(&AddDevice, make_scoped_refptr(adapter_ptr), |
359 | |
360 base::Passed(GetHeartRateDevice(adapter_ptr)))); | 384 base::Passed(GetHeartRateDevice(adapter_ptr)))); |
361 return GetDiscoverySession(); | 385 return GetDiscoverySession(); |
362 })); | 386 })); |
363 | 387 |
364 return adapter; | 388 return adapter; |
365 } | 389 } |
366 | 390 |
367 // static | 391 // static |
368 scoped_refptr<NiceMockBluetoothAdapter> | 392 scoped_refptr<NiceMockBluetoothAdapter> |
| 393 LayoutTestBluetoothAdapterProvider::GetDeviceEventAdapter() { |
| 394 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetPoweredAdapter()); |
| 395 NiceMockBluetoothAdapter* adapter_ptr = adapter.get(); |
| 396 |
| 397 // Add ConnectedHeartRateDevice. |
| 398 std::unique_ptr<NiceMockBluetoothDevice> connected_hr(GetBaseDevice( |
| 399 adapter.get(), "Connected Heart Rate Device", |
| 400 {BluetoothUUID(kHeartRateServiceUUID)}, makeMACAddress(0x0))); |
| 401 connected_hr->SetConnected(true); |
| 402 adapter->AddMockDevice(std::move(connected_hr)); |
| 403 |
| 404 // Add ChangingBatteryDevice with no uuids. |
| 405 std::unique_ptr<NiceMockBluetoothDevice> changing_battery( |
| 406 GetBaseDevice(adapter.get(), "Changing Battery Device", |
| 407 BluetoothDevice::UUIDList(), makeMACAddress(0x1))); |
| 408 changing_battery->SetConnected(false); |
| 409 |
| 410 NiceMockBluetoothDevice* changing_battery_ptr = changing_battery.get(); |
| 411 adapter->AddMockDevice(std::move(changing_battery)); |
| 412 |
| 413 // Add Non Connected Tx Power Device. |
| 414 std::unique_ptr<NiceMockBluetoothDevice> non_connected_tx_power( |
| 415 GetBaseDevice(adapter.get(), "Non Connected Tx Power Device", |
| 416 {BluetoothUUID(kTxPowerServiceUUID)}, makeMACAddress(0x2))); |
| 417 non_connected_tx_power->SetConnected(false); |
| 418 adapter->AddMockDevice(std::move(non_connected_tx_power)); |
| 419 |
| 420 // Add Discovery Generic Access Device with no uuids. |
| 421 std::unique_ptr<NiceMockBluetoothDevice> discovery_generic_access( |
| 422 GetBaseDevice(adapter.get(), "Discovery Generic Access Device", |
| 423 BluetoothDevice::UUIDList(), makeMACAddress(0x3))); |
| 424 discovery_generic_access->SetConnected(true); |
| 425 |
| 426 NiceMockBluetoothDevice* discovery_generic_access_ptr = |
| 427 discovery_generic_access.get(); |
| 428 adapter->AddMockDevice(std::move(discovery_generic_access)); |
| 429 |
| 430 ON_CALL(*adapter, StartDiscoverySessionWithFilterRaw(_, _, _)) |
| 431 .WillByDefault(RunCallbackWithResult<1 /* success_callback */>( |
| 432 [adapter_ptr, changing_battery_ptr, discovery_generic_access_ptr]() { |
| 433 if (adapter_ptr->GetDevices().size() == 4) { |
| 434 // Post task to add NewGlucoseDevice. |
| 435 std::unique_ptr<NiceMockBluetoothDevice> glucose_device( |
| 436 GetBaseDevice(adapter_ptr, "New Glucose Device", |
| 437 {BluetoothUUID(kGlucoseServiceUUID)}, |
| 438 makeMACAddress(0x4))); |
| 439 |
| 440 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 441 FROM_HERE, |
| 442 base::Bind(&AddDevice, make_scoped_refptr(adapter_ptr), |
| 443 base::Passed(&glucose_device))); |
| 444 |
| 445 // Add uuid and notify of device changed. |
| 446 changing_battery_ptr->AddUUID(BluetoothUUID(kBatteryServiceUUID)); |
| 447 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 448 FROM_HERE, base::Bind(&NotifyDeviceChanged, |
| 449 base::RetainedRef(adapter_ptr), |
| 450 changing_battery_ptr)); |
| 451 |
| 452 // Add uuid and notify of services discovered. |
| 453 discovery_generic_access_ptr->AddUUID( |
| 454 BluetoothUUID(kGenericAccessServiceUUID)); |
| 455 base::ThreadTaskRunnerHandle::Get()->PostTask( |
| 456 FROM_HERE, base::Bind(&NotifyServicesDiscovered, |
| 457 base::RetainedRef(adapter_ptr), |
| 458 discovery_generic_access_ptr)); |
| 459 } |
| 460 return GetDiscoverySession(); |
| 461 })); |
| 462 |
| 463 return adapter; |
| 464 } |
| 465 |
| 466 // static |
| 467 scoped_refptr<NiceMockBluetoothAdapter> |
369 LayoutTestBluetoothAdapterProvider::GetMissingServiceHeartRateAdapter() { | 468 LayoutTestBluetoothAdapterProvider::GetMissingServiceHeartRateAdapter() { |
370 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetEmptyAdapter()); | 469 scoped_refptr<NiceMockBluetoothAdapter> adapter(GetEmptyAdapter()); |
371 | 470 |
372 adapter->AddMockDevice(GetHeartRateDevice(adapter.get())); | 471 adapter->AddMockDevice(GetHeartRateDevice(adapter.get())); |
373 | 472 |
374 return adapter; | 473 return adapter; |
375 } | 474 } |
376 | 475 |
377 // static | 476 // static |
378 scoped_refptr<NiceMockBluetoothAdapter> | 477 scoped_refptr<NiceMockBluetoothAdapter> |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 | 845 |
747 // static | 846 // static |
748 std::unique_ptr<NiceMockBluetoothDevice> | 847 std::unique_ptr<NiceMockBluetoothDevice> |
749 LayoutTestBluetoothAdapterProvider::GetBaseDevice( | 848 LayoutTestBluetoothAdapterProvider::GetBaseDevice( |
750 MockBluetoothAdapter* adapter, | 849 MockBluetoothAdapter* adapter, |
751 const char* device_name, | 850 const char* device_name, |
752 device::BluetoothDevice::UUIDList uuids, | 851 device::BluetoothDevice::UUIDList uuids, |
753 const std::string& address) { | 852 const std::string& address) { |
754 std::unique_ptr<NiceMockBluetoothDevice> device(new NiceMockBluetoothDevice( | 853 std::unique_ptr<NiceMockBluetoothDevice> device(new NiceMockBluetoothDevice( |
755 adapter, 0x1F00 /* Bluetooth class */, device_name, address, | 854 adapter, 0x1F00 /* Bluetooth class */, device_name, address, |
756 true /* paired */, true /* connected */)); | 855 false /* paired */, false /* connected */)); |
757 | 856 |
758 ON_CALL(*device, GetUUIDs()).WillByDefault(Return(uuids)); | 857 for (const auto& uuid : uuids) { |
| 858 device->AddUUID(uuid); |
| 859 } |
759 | 860 |
760 // Using Invoke allows the device returned from this method to be futher | 861 // Using Invoke allows the device returned from this method to be futher |
761 // modified and have more services added to it. The call to ::GetGattServices | 862 // modified and have more services added to it. The call to ::GetGattServices |
762 // will invoke ::GetMockServices, returning all services added up to that | 863 // will invoke ::GetMockServices, returning all services added up to that |
763 // time. | 864 // time. |
764 ON_CALL(*device, GetGattServices()) | 865 ON_CALL(*device, GetGattServices()) |
765 .WillByDefault( | 866 .WillByDefault( |
766 Invoke(device.get(), &MockBluetoothDevice::GetMockServices)); | 867 Invoke(device.get(), &MockBluetoothDevice::GetMockServices)); |
767 // The call to BluetoothDevice::GetGattService will invoke ::GetMockService | 868 // The call to BluetoothDevice::GetGattService will invoke ::GetMockService |
768 // which returns a service matching the identifier provided if the service | 869 // which returns a service matching the identifier provided if the service |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1218 return BluetoothUUID(); | 1319 return BluetoothUUID(); |
1219 } | 1320 } |
1220 | 1321 |
1221 // static | 1322 // static |
1222 std::string LayoutTestBluetoothAdapterProvider::makeMACAddress(uint64_t addr) { | 1323 std::string LayoutTestBluetoothAdapterProvider::makeMACAddress(uint64_t addr) { |
1223 return BluetoothDevice::CanonicalizeAddress( | 1324 return BluetoothDevice::CanonicalizeAddress( |
1224 base::StringPrintf("%012" PRIx64, addr)); | 1325 base::StringPrintf("%012" PRIx64, addr)); |
1225 } | 1326 } |
1226 | 1327 |
1227 } // namespace content | 1328 } // namespace content |
OLD | NEW |