1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/memory/scoped_ptr.h"
6 #include "chrome/browser/extensions/extension_apitest.h"
7 #include "device/bluetooth/test/mock_bluetooth_adapter.h"
8 #include "device/bluetooth/test/mock_bluetooth_device.h"
9 #include "device/bluetooth/test/mock_bluetooth_gatt_characteristic.h"
10 #include "device/bluetooth/test/mock_bluetooth_gatt_connection.h"
11 #include "device/bluetooth/test/mock_bluetooth_gatt_descriptor.h"
12 #include "device/bluetooth/test/mock_bluetooth_gatt_notify_session.h"
13 #include "device/bluetooth/test/mock_bluetooth_gatt_service.h"
14 #include "extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.h"
15 #include "extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_event_router.h"
16 #include "extensions/common/test_util.h"
17 #include "extensions/test/extension_test_message_listener.h"
18 #include "extensions/test/result_catcher.h"
19 #include "testing/gmock/include/gmock/gmock.h"
21 using device::BluetoothUUID;
22 using device::BluetoothAdapter;
23 using device::BluetoothDevice;
24 using device::BluetoothGattCharacteristic;
25 using device::BluetoothGattConnection;
26 using device::BluetoothGattDescriptor;
27 using device::BluetoothGattService;
28 using device::BluetoothGattNotifySession;
29 using device::MockBluetoothAdapter;
30 using device::MockBluetoothDevice;
31 using device::MockBluetoothGattCharacteristic;
32 using device::MockBluetoothGattConnection;
33 using device::MockBluetoothGattDescriptor;
34 using device::MockBluetoothGattService;
35 using device::MockBluetoothGattNotifySession;
36 using extensions::BluetoothLowEnergyEventRouter;
37 using extensions::ResultCatcher;
38 using testing::Invoke;
39 using testing::Return;
40 using testing::ReturnRef;
41 using testing::ReturnRefOfCopy;
42 using testing::SaveArg;
47 // Test service constants.
48 const char kTestLeDeviceAddress0[] = "11:22:33:44:55:66";
49 const char kTestLeDeviceName0[] = "Test LE Device 0";
51 const char kTestLeDeviceAddress1[] = "77:88:99:AA:BB:CC";
52 const char kTestLeDeviceName1[] = "Test LE Device 1";
54 const char kTestServiceId0[] = "service_id0";
55 const char kTestServiceUuid0[] = "1234";
57 const char kTestServiceId1[] = "service_id1";
58 const char kTestServiceUuid1[] = "5678";
60 // Test characteristic constants.
61 const char kTestCharacteristicId0[] = "char_id0";
62 const char kTestCharacteristicUuid0[] = "1211";
63 const BluetoothGattCharacteristic::Properties kTestCharacteristicProperties0 =
64 BluetoothGattCharacteristic::kPropertyBroadcast |
65 BluetoothGattCharacteristic::kPropertyRead |
66 BluetoothGattCharacteristic::kPropertyWriteWithoutResponse |
67 BluetoothGattCharacteristic::kPropertyIndicate;
68 const uint8 kTestCharacteristicDefaultValue0[] = {0x01, 0x02, 0x03, 0x04, 0x05};
70 const char kTestCharacteristicId1[] = "char_id1";
71 const char kTestCharacteristicUuid1[] = "1212";
72 const BluetoothGattCharacteristic::Properties kTestCharacteristicProperties1 =
73 BluetoothGattCharacteristic::kPropertyRead |
74 BluetoothGattCharacteristic::kPropertyWrite |
75 BluetoothGattCharacteristic::kPropertyNotify;
76 const uint8 kTestCharacteristicDefaultValue1[] = {0x06, 0x07, 0x08};
78 const char kTestCharacteristicId2[] = "char_id2";
79 const char kTestCharacteristicUuid2[] = "1213";
80 const BluetoothGattCharacteristic::Properties kTestCharacteristicProperties2 =
81 BluetoothGattCharacteristic::kPropertyNone;
83 // Test descriptor constants.
84 const char kTestDescriptorId0[] = "desc_id0";
85 const char kTestDescriptorUuid0[] = "1221";
86 const uint8 kTestDescriptorDefaultValue0[] = {0x01, 0x02, 0x03};
88 const char kTestDescriptorId1[] = "desc_id1";
89 const char kTestDescriptorUuid1[] = "1222";
90 const uint8 kTestDescriptorDefaultValue1[] = {0x04, 0x05};
92 class BluetoothLowEnergyApiTest : public ExtensionApiTest {
94 BluetoothLowEnergyApiTest() {}
96 virtual ~BluetoothLowEnergyApiTest() {}
98 virtual void SetUpOnMainThread() OVERRIDE {
99 ExtensionApiTest::SetUpOnMainThread();
100 empty_extension_ = extensions::test_util::CreateEmptyExtension();
104 virtual void TearDownOnMainThread() OVERRIDE {
105 EXPECT_CALL(*mock_adapter_, RemoveObserver(_));
109 mock_adapter_ = new testing::StrictMock<MockBluetoothAdapter>();
110 EXPECT_CALL(*mock_adapter_, GetDevices())
111 .WillOnce(Return(BluetoothAdapter::ConstDeviceList()));
113 event_router()->SetAdapterForTesting(mock_adapter_);
116 new testing::NiceMock<MockBluetoothDevice>(mock_adapter_,
119 kTestLeDeviceAddress0,
121 true /* connected */));
124 new testing::NiceMock<MockBluetoothDevice>(mock_adapter_,
127 kTestLeDeviceAddress1,
129 false /* connected */));
131 service0_.reset(new testing::NiceMock<MockBluetoothGattService>(
134 BluetoothUUID(kTestServiceUuid0),
135 true /* is_primary */,
136 false /* is_local */));
138 service1_.reset(new testing::NiceMock<MockBluetoothGattService>(
141 BluetoothUUID(kTestServiceUuid1),
142 false /* is_primary */,
143 false /* is_local */));
145 // Assign characteristics some random properties and permissions. They don't
146 // need to reflect what the characteristic is actually capable of, since
147 // the JS API just passes values through from
148 // device::BluetoothGattCharacteristic.
149 std::vector<uint8> default_value;
150 chrc0_.reset(new testing::NiceMock<MockBluetoothGattCharacteristic>(
152 kTestCharacteristicId0,
153 BluetoothUUID(kTestCharacteristicUuid0),
154 false /* is_local */,
155 kTestCharacteristicProperties0,
156 BluetoothGattCharacteristic::kPermissionNone));
157 default_value.assign(kTestCharacteristicDefaultValue0,
158 (kTestCharacteristicDefaultValue0 +
159 sizeof(kTestCharacteristicDefaultValue0)));
160 ON_CALL(*chrc0_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value));
162 chrc1_.reset(new testing::NiceMock<MockBluetoothGattCharacteristic>(
164 kTestCharacteristicId1,
165 BluetoothUUID(kTestCharacteristicUuid1),
166 false /* is_local */,
167 kTestCharacteristicProperties1,
168 BluetoothGattCharacteristic::kPermissionNone));
169 default_value.assign(kTestCharacteristicDefaultValue1,
170 (kTestCharacteristicDefaultValue1 +
171 sizeof(kTestCharacteristicDefaultValue1)));
172 ON_CALL(*chrc1_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value));
174 chrc2_.reset(new testing::NiceMock<MockBluetoothGattCharacteristic>(
176 kTestCharacteristicId2,
177 BluetoothUUID(kTestCharacteristicUuid2),
178 false /* is_local */,
179 kTestCharacteristicProperties2,
180 BluetoothGattCharacteristic::kPermissionNone));
182 desc0_.reset(new testing::NiceMock<MockBluetoothGattDescriptor>(
185 BluetoothUUID(kTestDescriptorUuid0),
186 false /* is_local */,
187 BluetoothGattCharacteristic::kPermissionNone));
188 default_value.assign(
189 kTestDescriptorDefaultValue0,
190 (kTestDescriptorDefaultValue0 + sizeof(kTestDescriptorDefaultValue0)));
191 ON_CALL(*desc0_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value));
193 desc1_.reset(new testing::NiceMock<MockBluetoothGattDescriptor>(
196 BluetoothUUID(kTestDescriptorUuid1),
197 false /* is_local */,
198 BluetoothGattCharacteristic::kPermissionNone));
199 default_value.assign(
200 kTestDescriptorDefaultValue1,
201 (kTestDescriptorDefaultValue1 + sizeof(kTestDescriptorDefaultValue1)));
202 ON_CALL(*desc1_, GetValue()).WillByDefault(ReturnRefOfCopy(default_value));
206 BluetoothLowEnergyEventRouter* event_router() {
207 return extensions::BluetoothLowEnergyAPI::Get(browser()->profile())
211 testing::StrictMock<MockBluetoothAdapter>* mock_adapter_;
212 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device0_;
213 scoped_ptr<testing::NiceMock<MockBluetoothDevice> > device1_;
214 scoped_ptr<testing::NiceMock<MockBluetoothGattService> > service0_;
215 scoped_ptr<testing::NiceMock<MockBluetoothGattService> > service1_;
216 scoped_ptr<testing::NiceMock<MockBluetoothGattCharacteristic> > chrc0_;
217 scoped_ptr<testing::NiceMock<MockBluetoothGattCharacteristic> > chrc1_;
218 scoped_ptr<testing::NiceMock<MockBluetoothGattCharacteristic> > chrc2_;
219 scoped_ptr<testing::NiceMock<MockBluetoothGattDescriptor> > desc0_;
220 scoped_ptr<testing::NiceMock<MockBluetoothGattDescriptor> > desc1_;
223 scoped_refptr<extensions::Extension> empty_extension_;
226 ACTION_TEMPLATE(InvokeCallbackArgument,
227 HAS_1_TEMPLATE_PARAMS(int, k),
228 AND_0_VALUE_PARAMS()) {
229 ::std::tr1::get<k>(args).Run();
232 ACTION_TEMPLATE(InvokeCallbackArgument,
233 HAS_1_TEMPLATE_PARAMS(int, k),
234 AND_1_VALUE_PARAMS(p0)) {
235 ::std::tr1::get<k>(args).Run(p0);
238 ACTION_TEMPLATE(InvokeCallbackWithScopedPtrArg,
239 HAS_2_TEMPLATE_PARAMS(int, k, typename, T),
240 AND_1_VALUE_PARAMS(p0)) {
241 ::std::tr1::get<k>(args).Run(scoped_ptr<T>(p0));
244 BluetoothGattConnection* CreateGattConnection(
245 const std::string& device_address,
246 bool expect_disconnect) {
247 testing::NiceMock<MockBluetoothGattConnection>* conn =
248 new testing::NiceMock<MockBluetoothGattConnection>(device_address);
250 if (expect_disconnect) {
251 EXPECT_CALL(*conn, Disconnect(_))
253 .WillOnce(InvokeCallbackArgument<0>());
255 EXPECT_CALL(*conn, Disconnect(_)).Times(0);
261 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetServices) {
262 ResultCatcher catcher;
263 catcher.RestrictToBrowserContext(browser()->profile());
265 std::vector<BluetoothGattService*> services;
266 services.push_back(service0_.get());
267 services.push_back(service1_.get());
269 EXPECT_CALL(*mock_adapter_, GetDevice(_))
271 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL)))
272 .WillRepeatedly(Return(device0_.get()));
274 EXPECT_CALL(*device0_, GetGattServices())
276 .WillOnce(Return(std::vector<BluetoothGattService*>()))
277 .WillOnce(Return(services));
279 // Load and wait for setup.
280 ExtensionTestMessageListener listener("ready", true);
281 ASSERT_TRUE(LoadExtension(
282 test_data_dir_.AppendASCII("bluetooth_low_energy/get_services")));
283 EXPECT_TRUE(listener.WaitUntilSatisfied());
285 listener.Reply("go");
287 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
290 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetService) {
291 ResultCatcher catcher;
292 catcher.RestrictToBrowserContext(browser()->profile());
294 event_router()->GattServiceAdded(
295 mock_adapter_, device0_.get(), service0_.get());
297 EXPECT_CALL(*mock_adapter_, GetDevice(_))
299 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL)))
300 .WillRepeatedly(Return(device0_.get()));
302 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
304 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL)))
305 .WillOnce(Return(service0_.get()));
307 // Load and wait for setup.
308 ExtensionTestMessageListener listener("ready", true);
309 ASSERT_TRUE(LoadExtension(
310 test_data_dir_.AppendASCII("bluetooth_low_energy/get_service")));
311 EXPECT_TRUE(listener.WaitUntilSatisfied());
313 listener.Reply("go");
315 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
317 event_router()->GattServiceRemoved(
318 mock_adapter_, device0_.get(), service0_.get());
321 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ServiceEvents) {
322 ResultCatcher catcher;
323 catcher.RestrictToBrowserContext(browser()->profile());
325 // Load the extension and let it set up.
326 ExtensionTestMessageListener listener("ready", true);
327 ASSERT_TRUE(LoadExtension(
328 test_data_dir_.AppendASCII("bluetooth_low_energy/service_events")));
330 // These will create the identifier mappings.
331 event_router()->GattServiceAdded(
332 mock_adapter_, device0_.get(), service0_.get());
333 event_router()->GattServiceAdded(
334 mock_adapter_, device0_.get(), service1_.get());
336 // These will send the onServiceAdded event to apps.
337 event_router()->GattDiscoveryCompleteForService(mock_adapter_,
339 event_router()->GattDiscoveryCompleteForService(mock_adapter_,
342 // This will send the onServiceChanged event to apps.
343 event_router()->GattServiceChanged(mock_adapter_, service1_.get());
345 // This will send the onServiceRemoved event to apps.
346 event_router()->GattServiceRemoved(
347 mock_adapter_, device0_.get(), service0_.get());
349 EXPECT_TRUE(listener.WaitUntilSatisfied());
350 listener.Reply("go");
352 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
353 event_router()->GattServiceRemoved(
354 mock_adapter_, device0_.get(), service1_.get());
357 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetRemovedService) {
358 ResultCatcher catcher;
359 catcher.RestrictToBrowserContext(browser()->profile());
361 // Load the extension and let it set up.
362 ASSERT_TRUE(LoadExtension(
363 test_data_dir_.AppendASCII("bluetooth_low_energy/get_removed_service")));
365 // 1. getService success.
366 EXPECT_CALL(*mock_adapter_, GetDevice(_))
368 .WillOnce(Return(device0_.get()));
369 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
371 .WillOnce(Return(service0_.get()));
373 event_router()->GattServiceAdded(
374 mock_adapter_, device0_.get(), service0_.get());
375 event_router()->GattDiscoveryCompleteForService(mock_adapter_,
378 ExtensionTestMessageListener get_service_success_listener("getServiceSuccess",
380 EXPECT_TRUE(get_service_success_listener.WaitUntilSatisfied());
381 testing::Mock::VerifyAndClearExpectations(mock_adapter_);
382 testing::Mock::VerifyAndClearExpectations(device0_.get());
384 // 2. getService fail.
385 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(0);
386 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0)).Times(0);
388 event_router()->GattServiceRemoved(
389 mock_adapter_, device0_.get(), service0_.get());
391 ExtensionTestMessageListener get_service_fail_listener("getServiceFail",
393 EXPECT_TRUE(get_service_fail_listener.WaitUntilSatisfied());
394 testing::Mock::VerifyAndClearExpectations(mock_adapter_);
395 testing::Mock::VerifyAndClearExpectations(device0_.get());
397 get_service_fail_listener.Reply("go");
399 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
402 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetIncludedServices) {
403 ResultCatcher catcher;
404 catcher.RestrictToBrowserContext(browser()->profile());
406 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
407 "bluetooth_low_energy/get_included_services")));
409 // Wait for initial call to end with failure as there is no mapping.
410 ExtensionTestMessageListener listener("ready", true);
411 EXPECT_TRUE(listener.WaitUntilSatisfied());
413 // Set up for the rest of the calls before replying. Included services can be
414 // returned even if there is no instance ID mapping for them yet, so no need
415 // to call GattServiceAdded for |service1_| here.
416 event_router()->GattServiceAdded(
417 mock_adapter_, device0_.get(), service0_.get());
419 std::vector<BluetoothGattService*> includes;
420 includes.push_back(service1_.get());
421 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0))
423 .WillRepeatedly(Return(device0_.get()));
424 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
426 .WillRepeatedly(Return(service0_.get()));
427 EXPECT_CALL(*service0_, GetIncludedServices())
429 .WillOnce(Return(std::vector<BluetoothGattService*>()))
430 .WillOnce(Return(includes));
432 listener.Reply("go");
435 EXPECT_TRUE(listener.WaitUntilSatisfied());
437 listener.Reply("go");
439 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
440 event_router()->GattServiceRemoved(
441 mock_adapter_, device0_.get(), service0_.get());
444 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetCharacteristics) {
445 ResultCatcher catcher;
446 catcher.RestrictToBrowserContext(browser()->profile());
448 std::vector<BluetoothGattCharacteristic*> characteristics;
449 characteristics.push_back(chrc0_.get());
450 characteristics.push_back(chrc1_.get());
452 event_router()->GattServiceAdded(
453 mock_adapter_, device0_.get(), service0_.get());
455 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(3).WillRepeatedly(
456 Return(device0_.get()));
457 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
459 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL)))
460 .WillRepeatedly(Return(service0_.get()));
461 EXPECT_CALL(*service0_, GetCharacteristics())
463 .WillOnce(Return(std::vector<BluetoothGattCharacteristic*>()))
464 .WillOnce(Return(characteristics));
466 ExtensionTestMessageListener listener("ready", true);
467 ASSERT_TRUE(LoadExtension(
468 test_data_dir_.AppendASCII("bluetooth_low_energy/get_characteristics")));
469 EXPECT_TRUE(listener.WaitUntilSatisfied());
471 listener.Reply("go");
473 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
474 event_router()->GattServiceRemoved(
475 mock_adapter_, device0_.get(), service0_.get());
478 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetCharacteristic) {
479 ResultCatcher catcher;
480 catcher.RestrictToBrowserContext(browser()->profile());
482 event_router()->GattServiceAdded(
483 mock_adapter_, device0_.get(), service0_.get());
484 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
486 EXPECT_CALL(*mock_adapter_, GetDevice(_))
488 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL)))
489 .WillRepeatedly(Return(device0_.get()));
491 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
493 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL)))
494 .WillRepeatedly(Return(service0_.get()));
496 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
498 .WillOnce(Return(static_cast<BluetoothGattCharacteristic*>(NULL)))
499 .WillOnce(Return(chrc0_.get()));
501 // Load the extension and wait for first test.
502 ExtensionTestMessageListener listener("ready", true);
503 ASSERT_TRUE(LoadExtension(
504 test_data_dir_.AppendASCII("bluetooth_low_energy/get_characteristic")));
505 EXPECT_TRUE(listener.WaitUntilSatisfied());
507 listener.Reply("go");
509 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
511 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
512 event_router()->GattServiceRemoved(
513 mock_adapter_, device0_.get(), service0_.get());
516 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, CharacteristicProperties) {
517 ResultCatcher catcher;
518 catcher.RestrictToBrowserContext(browser()->profile());
520 event_router()->GattServiceAdded(
521 mock_adapter_, device0_.get(), service0_.get());
522 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
524 EXPECT_CALL(*mock_adapter_, GetDevice(_))
526 .WillRepeatedly(Return(device0_.get()));
527 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
529 .WillRepeatedly(Return(service0_.get()));
530 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
532 .WillRepeatedly(Return(chrc0_.get()));
533 EXPECT_CALL(*chrc0_, GetProperties())
535 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyNone))
536 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyBroadcast))
537 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyRead))
539 Return(BluetoothGattCharacteristic::kPropertyWriteWithoutResponse))
540 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyWrite))
541 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyNotify))
542 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyIndicate))
544 BluetoothGattCharacteristic::kPropertyAuthenticatedSignedWrites))
546 Return(BluetoothGattCharacteristic::kPropertyExtendedProperties))
547 .WillOnce(Return(BluetoothGattCharacteristic::kPropertyReliableWrite))
549 Return(BluetoothGattCharacteristic::kPropertyWritableAuxiliaries))
551 BluetoothGattCharacteristic::kPropertyBroadcast |
552 BluetoothGattCharacteristic::kPropertyRead |
553 BluetoothGattCharacteristic::kPropertyWriteWithoutResponse |
554 BluetoothGattCharacteristic::kPropertyWrite |
555 BluetoothGattCharacteristic::kPropertyNotify |
556 BluetoothGattCharacteristic::kPropertyIndicate |
557 BluetoothGattCharacteristic::kPropertyAuthenticatedSignedWrites |
558 BluetoothGattCharacteristic::kPropertyExtendedProperties |
559 BluetoothGattCharacteristic::kPropertyReliableWrite |
560 BluetoothGattCharacteristic::kPropertyWritableAuxiliaries));
562 ExtensionTestMessageListener listener("ready", true);
563 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
564 "bluetooth_low_energy/characteristic_properties")));
565 EXPECT_TRUE(listener.WaitUntilSatisfied());
567 listener.Reply("go");
569 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
571 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
572 event_router()->GattServiceRemoved(
573 mock_adapter_, device0_.get(), service0_.get());
576 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetRemovedCharacteristic) {
577 ResultCatcher catcher;
578 catcher.RestrictToBrowserContext(browser()->profile());
580 EXPECT_CALL(*mock_adapter_, GetDevice(_))
582 .WillOnce(Return(device0_.get()));
583 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
585 .WillOnce(Return(service0_.get()));
586 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
588 .WillOnce(Return(chrc0_.get()));
590 event_router()->GattServiceAdded(
591 mock_adapter_, device0_.get(), service0_.get());
592 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
594 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
595 "bluetooth_low_energy/get_removed_characteristic")));
597 ExtensionTestMessageListener listener("ready", true);
598 EXPECT_TRUE(listener.WaitUntilSatisfied());
599 testing::Mock::VerifyAndClearExpectations(mock_adapter_);
600 testing::Mock::VerifyAndClearExpectations(device0_.get());
601 testing::Mock::VerifyAndClearExpectations(service0_.get());
603 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(0);
604 EXPECT_CALL(*device0_, GetGattService(_)).Times(0);
605 EXPECT_CALL(*service0_, GetCharacteristic(_)).Times(0);
607 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
609 listener.Reply("go");
611 EXPECT_TRUE(listener.WaitUntilSatisfied());
613 listener.Reply("go");
615 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
616 event_router()->GattServiceRemoved(
617 mock_adapter_, device0_.get(), service0_.get());
620 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, CharacteristicValueChanged) {
621 ResultCatcher catcher;
622 catcher.RestrictToBrowserContext(browser()->profile());
624 // Cause events to be sent to the extension.
625 event_router()->GattServiceAdded(
626 mock_adapter_, device0_.get(), service0_.get());
627 event_router()->GattServiceAdded(
628 mock_adapter_, device0_.get(), service1_.get());
629 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
630 event_router()->GattCharacteristicAdded(mock_adapter_, chrc2_.get());
632 EXPECT_CALL(*mock_adapter_, GetDevice(_))
634 .WillRepeatedly(Return(device0_.get()));
635 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
637 .WillOnce(Return(service0_.get()));
638 EXPECT_CALL(*device0_, GetGattService(kTestServiceId1))
640 .WillOnce(Return(service1_.get()));
641 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
643 .WillOnce(Return(chrc0_.get()));
644 EXPECT_CALL(*service1_, GetCharacteristic(kTestCharacteristicId2))
646 .WillOnce(Return(chrc2_.get()));
648 BluetoothGattNotifySession* session0 =
649 new testing::NiceMock<MockBluetoothGattNotifySession>(
650 kTestCharacteristicId0);
651 BluetoothGattNotifySession* session1 =
652 new testing::NiceMock<MockBluetoothGattNotifySession>(
653 kTestCharacteristicId2);
655 EXPECT_CALL(*chrc0_, StartNotifySession(_, _))
658 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>(
660 EXPECT_CALL(*chrc2_, StartNotifySession(_, _))
663 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>(
666 ExtensionTestMessageListener listener("ready", true);
667 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
668 "bluetooth_low_energy/characteristic_value_changed")));
670 EXPECT_TRUE(listener.WaitUntilSatisfied());
672 std::vector<uint8> value;
673 event_router()->GattCharacteristicValueChanged(
674 mock_adapter_, chrc0_.get(), value);
675 event_router()->GattCharacteristicValueChanged(
676 mock_adapter_, chrc2_.get(), value);
678 listener.Reply("go");
680 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
681 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc2_.get());
682 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
683 event_router()->GattServiceRemoved(
684 mock_adapter_, device0_.get(), service1_.get());
685 event_router()->GattServiceRemoved(
686 mock_adapter_, device0_.get(), service0_.get());
689 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ReadCharacteristicValue) {
690 ResultCatcher catcher;
691 catcher.RestrictToBrowserContext(browser()->profile());
693 event_router()->GattServiceAdded(
694 mock_adapter_, device0_.get(), service0_.get());
695 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
697 EXPECT_CALL(*mock_adapter_, GetDevice(_))
699 .WillRepeatedly(Return(device0_.get()));
701 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
703 .WillRepeatedly(Return(service0_.get()));
705 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
707 .WillRepeatedly(Return(chrc0_.get()));
709 std::vector<uint8> value;
710 EXPECT_CALL(*chrc0_, ReadRemoteCharacteristic(_, _))
712 .WillOnce(InvokeCallbackArgument<1>())
713 .WillOnce(InvokeCallbackArgument<0>(value));
715 ExtensionTestMessageListener listener("ready", true);
716 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
717 "bluetooth_low_energy/read_characteristic_value")));
718 EXPECT_TRUE(listener.WaitUntilSatisfied());
720 listener.Reply("go");
722 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
724 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
725 event_router()->GattServiceRemoved(
726 mock_adapter_, device0_.get(), service0_.get());
729 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, WriteCharacteristicValue) {
730 ResultCatcher catcher;
731 catcher.RestrictToBrowserContext(browser()->profile());
733 event_router()->GattServiceAdded(
734 mock_adapter_, device0_.get(), service0_.get());
735 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
737 EXPECT_CALL(*mock_adapter_, GetDevice(_))
739 .WillRepeatedly(Return(device0_.get()));
741 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
743 .WillRepeatedly(Return(service0_.get()));
745 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
747 .WillRepeatedly(Return(chrc0_.get()));
749 std::vector<uint8> write_value;
750 EXPECT_CALL(*chrc0_, WriteRemoteCharacteristic(_, _, _))
752 .WillOnce(InvokeCallbackArgument<2>())
753 .WillOnce(DoAll(SaveArg<0>(&write_value), InvokeCallbackArgument<1>()));
755 EXPECT_CALL(*chrc0_, GetValue()).Times(1).WillOnce(ReturnRef(write_value));
757 ExtensionTestMessageListener listener("ready", true);
758 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
759 "bluetooth_low_energy/write_characteristic_value")));
760 EXPECT_TRUE(listener.WaitUntilSatisfied());
762 listener.Reply("go");
764 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
766 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
767 event_router()->GattServiceRemoved(
768 mock_adapter_, device0_.get(), service0_.get());
771 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetDescriptors) {
772 ResultCatcher catcher;
773 catcher.RestrictToBrowserContext(browser()->profile());
775 std::vector<BluetoothGattDescriptor*> descriptors;
776 descriptors.push_back(desc0_.get());
777 descriptors.push_back(desc1_.get());
779 event_router()->GattServiceAdded(
780 mock_adapter_, device0_.get(), service0_.get());
781 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
783 EXPECT_CALL(*mock_adapter_, GetDevice(_))
785 .WillRepeatedly(Return(device0_.get()));
786 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
788 .WillRepeatedly(Return(service0_.get()));
789 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
791 .WillOnce(Return(static_cast<BluetoothGattCharacteristic*>(NULL)))
792 .WillRepeatedly(Return(chrc0_.get()));
793 EXPECT_CALL(*chrc0_, GetDescriptors())
795 .WillOnce(Return(std::vector<BluetoothGattDescriptor*>()))
796 .WillOnce(Return(descriptors));
798 ExtensionTestMessageListener listener("ready", true);
799 ASSERT_TRUE(LoadExtension(
800 test_data_dir_.AppendASCII("bluetooth_low_energy/get_descriptors")));
801 EXPECT_TRUE(listener.WaitUntilSatisfied());
803 listener.Reply("go");
805 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
807 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
808 event_router()->GattServiceRemoved(
809 mock_adapter_, device0_.get(), service0_.get());
812 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetDescriptor) {
813 ResultCatcher catcher;
814 catcher.RestrictToBrowserContext(browser()->profile());
816 event_router()->GattServiceAdded(
817 mock_adapter_, device0_.get(), service0_.get());
818 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
819 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
821 EXPECT_CALL(*mock_adapter_, GetDevice(_))
823 .WillOnce(Return(static_cast<BluetoothDevice*>(NULL)))
824 .WillRepeatedly(Return(device0_.get()));
826 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
828 .WillOnce(Return(static_cast<BluetoothGattService*>(NULL)))
829 .WillRepeatedly(Return(service0_.get()));
831 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
833 .WillOnce(Return(static_cast<BluetoothGattCharacteristic*>(NULL)))
834 .WillRepeatedly(Return(chrc0_.get()));
836 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0))
838 .WillOnce(Return(static_cast<BluetoothGattDescriptor*>(NULL)))
839 .WillOnce(Return(desc0_.get()));
841 // Load the extension and wait for first test.
842 ExtensionTestMessageListener listener("ready", true);
843 ASSERT_TRUE(LoadExtension(
844 test_data_dir_.AppendASCII("bluetooth_low_energy/get_descriptor")));
845 EXPECT_TRUE(listener.WaitUntilSatisfied());
847 listener.Reply("go");
849 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
851 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
852 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
853 event_router()->GattServiceRemoved(
854 mock_adapter_, device0_.get(), service0_.get());
857 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GetRemovedDescriptor) {
858 ResultCatcher catcher;
859 catcher.RestrictToBrowserContext(browser()->profile());
861 EXPECT_CALL(*mock_adapter_, GetDevice(_))
863 .WillOnce(Return(device0_.get()));
864 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
866 .WillOnce(Return(service0_.get()));
867 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
869 .WillOnce(Return(chrc0_.get()));
870 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0))
872 .WillOnce(Return(desc0_.get()));
874 event_router()->GattServiceAdded(
875 mock_adapter_, device0_.get(), service0_.get());
876 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
877 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
879 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
880 "bluetooth_low_energy/get_removed_descriptor")));
882 ExtensionTestMessageListener listener("ready", true);
883 EXPECT_TRUE(listener.WaitUntilSatisfied());
884 testing::Mock::VerifyAndClearExpectations(mock_adapter_);
885 testing::Mock::VerifyAndClearExpectations(device0_.get());
886 testing::Mock::VerifyAndClearExpectations(service0_.get());
887 testing::Mock::VerifyAndClearExpectations(chrc0_.get());
889 EXPECT_CALL(*mock_adapter_, GetDevice(_)).Times(0);
890 EXPECT_CALL(*device0_, GetGattService(_)).Times(0);
891 EXPECT_CALL(*service0_, GetCharacteristic(_)).Times(0);
892 EXPECT_CALL(*chrc0_, GetDescriptor(_)).Times(0);
894 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
896 listener.Reply("go");
898 EXPECT_TRUE(listener.WaitUntilSatisfied());
900 listener.Reply("go");
902 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
903 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
904 event_router()->GattServiceRemoved(
905 mock_adapter_, device0_.get(), service0_.get());
908 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, DescriptorValueChanged) {
909 ResultCatcher catcher;
910 catcher.RestrictToBrowserContext(browser()->profile());
912 event_router()->GattServiceAdded(
913 mock_adapter_, device0_.get(), service0_.get());
914 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
915 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
916 event_router()->GattDescriptorAdded(mock_adapter_, desc1_.get());
918 // Load the extension and let it set up.
919 ExtensionTestMessageListener listener("ready", true);
920 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
921 "bluetooth_low_energy/descriptor_value_changed")));
923 // Cause events to be sent to the extension.
924 std::vector<uint8> value;
925 event_router()->GattDescriptorValueChanged(
926 mock_adapter_, desc0_.get(), value);
927 event_router()->GattDescriptorValueChanged(
928 mock_adapter_, desc1_.get(), value);
930 EXPECT_TRUE(listener.WaitUntilSatisfied());
931 listener.Reply("go");
933 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
934 event_router()->GattDescriptorRemoved(mock_adapter_, desc1_.get());
935 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
936 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
937 event_router()->GattServiceRemoved(
938 mock_adapter_, device0_.get(), service0_.get());
941 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ReadDescriptorValue) {
942 ResultCatcher catcher;
943 catcher.RestrictToBrowserContext(browser()->profile());
945 event_router()->GattServiceAdded(
946 mock_adapter_, device0_.get(), service0_.get());
947 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
948 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
950 EXPECT_CALL(*mock_adapter_, GetDevice(_))
952 .WillRepeatedly(Return(device0_.get()));
954 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
956 .WillRepeatedly(Return(service0_.get()));
958 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
960 .WillRepeatedly(Return(chrc0_.get()));
962 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0))
964 .WillRepeatedly(Return(desc0_.get()));
966 std::vector<uint8> value;
967 EXPECT_CALL(*desc0_, ReadRemoteDescriptor(_, _))
969 .WillOnce(InvokeCallbackArgument<1>())
970 .WillOnce(InvokeCallbackArgument<0>(value));
972 ExtensionTestMessageListener listener("ready", true);
973 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
974 "bluetooth_low_energy/read_descriptor_value")));
975 EXPECT_TRUE(listener.WaitUntilSatisfied());
977 listener.Reply("go");
979 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
981 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
982 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
983 event_router()->GattServiceRemoved(
984 mock_adapter_, device0_.get(), service0_.get());
987 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, WriteDescriptorValue) {
988 ResultCatcher catcher;
989 catcher.RestrictToBrowserContext(browser()->profile());
991 event_router()->GattServiceAdded(
992 mock_adapter_, device0_.get(), service0_.get());
993 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
994 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
996 EXPECT_CALL(*mock_adapter_, GetDevice(_))
998 .WillRepeatedly(Return(device0_.get()));
1000 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
1002 .WillRepeatedly(Return(service0_.get()));
1004 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
1006 .WillRepeatedly(Return(chrc0_.get()));
1008 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0))
1010 .WillRepeatedly(Return(desc0_.get()));
1012 std::vector<uint8> write_value;
1013 EXPECT_CALL(*desc0_, WriteRemoteDescriptor(_, _, _))
1015 .WillOnce(InvokeCallbackArgument<2>())
1016 .WillOnce(DoAll(SaveArg<0>(&write_value), InvokeCallbackArgument<1>()));
1018 EXPECT_CALL(*desc0_, GetValue()).Times(1).WillOnce(ReturnRef(write_value));
1020 ExtensionTestMessageListener listener("ready", true);
1021 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1022 "bluetooth_low_energy/write_descriptor_value")));
1023 EXPECT_TRUE(listener.WaitUntilSatisfied());
1025 listener.Reply("go");
1027 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1029 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
1030 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
1031 event_router()->GattServiceRemoved(
1032 mock_adapter_, device0_.get(), service0_.get());
1035 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, PermissionDenied) {
1036 ResultCatcher catcher;
1037 catcher.RestrictToBrowserContext(browser()->profile());
1039 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1040 "bluetooth_low_energy/permission_denied")));
1041 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1044 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, UuidPermissionMethods) {
1045 ResultCatcher catcher;
1046 catcher.RestrictToBrowserContext(browser()->profile());
1048 event_router()->GattServiceAdded(
1049 mock_adapter_, device0_.get(), service0_.get());
1050 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
1051 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
1053 std::vector<BluetoothGattService*> services;
1054 services.push_back(service0_.get());
1056 EXPECT_CALL(*mock_adapter_, GetDevice(_))
1057 .WillRepeatedly(Return(device0_.get()));
1058 EXPECT_CALL(*device0_, GetGattServices()).WillOnce(Return(services));
1059 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
1060 .WillRepeatedly(Return(service0_.get()));
1061 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
1062 .WillRepeatedly(Return(chrc0_.get()));
1063 EXPECT_CALL(*chrc0_, GetDescriptor(kTestDescriptorId0))
1064 .WillRepeatedly(Return(desc0_.get()));
1066 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1067 "bluetooth_low_energy/uuid_permission_methods")));
1068 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1070 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
1071 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
1072 event_router()->GattServiceRemoved(
1073 mock_adapter_, device0_.get(), service0_.get());
1076 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, UuidPermissionEvents) {
1077 ResultCatcher catcher;
1078 catcher.RestrictToBrowserContext(browser()->profile());
1080 ExtensionTestMessageListener listener("ready", true);
1081 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1082 "bluetooth_low_energy/uuid_permission_events")));
1084 // Cause events to be sent to the extension.
1085 event_router()->GattServiceAdded(
1086 mock_adapter_, device0_.get(), service0_.get());
1087 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
1088 event_router()->GattDescriptorAdded(mock_adapter_, desc0_.get());
1090 std::vector<uint8> value;
1091 event_router()->GattCharacteristicValueChanged(
1092 mock_adapter_, chrc0_.get(), value);
1093 event_router()->GattDescriptorValueChanged(
1094 mock_adapter_, desc0_.get(), value);
1095 event_router()->GattServiceChanged(mock_adapter_, service0_.get());
1097 EXPECT_TRUE(listener.WaitUntilSatisfied());
1098 listener.Reply("go");
1099 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1101 event_router()->GattDescriptorRemoved(mock_adapter_, desc0_.get());
1102 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
1103 event_router()->GattServiceRemoved(
1104 mock_adapter_, device0_.get(), service0_.get());
1107 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, GattConnection) {
1108 ResultCatcher catcher;
1109 catcher.RestrictToBrowserContext(browser()->profile());
1111 EXPECT_CALL(*mock_adapter_, GetDevice(_))
1112 .WillRepeatedly(Return(static_cast<BluetoothDevice*>(NULL)));
1113 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0))
1114 .WillRepeatedly(Return(device0_.get()));
1115 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress1))
1116 .WillRepeatedly(Return(device1_.get()));
1117 EXPECT_CALL(*device0_, CreateGattConnection(_, _))
1119 .WillOnce(InvokeCallbackArgument<1>(BluetoothDevice::ERROR_FAILED))
1120 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>(
1121 CreateGattConnection(kTestLeDeviceAddress0,
1122 true /* expect_disconnect */)))
1123 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>(
1124 CreateGattConnection(kTestLeDeviceAddress0,
1125 false /* expect_disconnect */)));
1126 EXPECT_CALL(*device1_, CreateGattConnection(_, _))
1128 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>(
1129 CreateGattConnection(kTestLeDeviceAddress1,
1130 true /* expect_disconnect */)));
1132 ASSERT_TRUE(LoadExtension(
1133 test_data_dir_.AppendASCII("bluetooth_low_energy/gatt_connection")));
1134 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1137 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ReconnectAfterDisconnected) {
1138 ResultCatcher catcher;
1139 catcher.RestrictToBrowserContext(browser()->profile());
1141 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0))
1142 .WillRepeatedly(Return(device0_.get()));
1144 MockBluetoothGattConnection* first_conn =
1145 static_cast<MockBluetoothGattConnection*>(CreateGattConnection(
1146 kTestLeDeviceAddress0, false /* expect_disconnect */));
1147 EXPECT_CALL(*first_conn, IsConnected())
1149 .WillOnce(Return(true))
1150 .WillOnce(Return(false));
1152 EXPECT_CALL(*device0_, CreateGattConnection(_, _))
1154 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>(
1156 .WillOnce(InvokeCallbackWithScopedPtrArg<0, BluetoothGattConnection>(
1157 CreateGattConnection(kTestLeDeviceAddress0,
1158 false /* expect_disconnect */)));
1160 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1161 "bluetooth_low_energy/reconnect_after_disconnected")));
1162 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1165 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, ConnectInProgress) {
1166 ResultCatcher catcher;
1167 catcher.RestrictToBrowserContext(browser()->profile());
1169 EXPECT_CALL(*mock_adapter_, GetDevice(kTestLeDeviceAddress0))
1170 .WillRepeatedly(Return(device0_.get()));
1172 BluetoothDevice::GattConnectionCallback connect_callback;
1173 base::Closure disconnect_callback;
1175 testing::NiceMock<MockBluetoothGattConnection>* conn =
1176 new testing::NiceMock<MockBluetoothGattConnection>(
1177 kTestLeDeviceAddress0);
1178 scoped_ptr<BluetoothGattConnection> conn_ptr(conn);
1179 EXPECT_CALL(*conn, Disconnect(_))
1181 .WillOnce(SaveArg<0>(&disconnect_callback));
1183 EXPECT_CALL(*device0_, CreateGattConnection(_, _))
1185 .WillOnce(SaveArg<0>(&connect_callback));
1187 ExtensionTestMessageListener listener("ready", true);
1188 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1189 "bluetooth_low_energy/connect_in_progress")));
1191 listener.WaitUntilSatisfied();
1192 connect_callback.Run(conn_ptr.Pass());
1195 listener.WaitUntilSatisfied();
1196 disconnect_callback.Run();
1198 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1201 IN_PROC_BROWSER_TEST_F(BluetoothLowEnergyApiTest, StartStopNotifications) {
1202 ResultCatcher catcher;
1203 catcher.RestrictToBrowserContext(browser()->profile());
1205 event_router()->GattServiceAdded(
1206 mock_adapter_, device0_.get(), service0_.get());
1207 event_router()->GattServiceAdded(
1208 mock_adapter_, device0_.get(), service1_.get());
1209 event_router()->GattCharacteristicAdded(mock_adapter_, chrc0_.get());
1210 event_router()->GattCharacteristicAdded(mock_adapter_, chrc1_.get());
1211 event_router()->GattCharacteristicAdded(mock_adapter_, chrc2_.get());
1213 EXPECT_CALL(*mock_adapter_, GetDevice(_))
1214 .WillRepeatedly(Return(device0_.get()));
1215 EXPECT_CALL(*device0_, GetGattService(kTestServiceId0))
1216 .WillRepeatedly(Return(service0_.get()));
1217 EXPECT_CALL(*device0_, GetGattService(kTestServiceId1))
1218 .WillRepeatedly(Return(service1_.get()));
1219 EXPECT_CALL(*service1_, GetCharacteristic(kTestCharacteristicId2))
1221 .WillOnce(Return(chrc2_.get()));
1222 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId0))
1224 .WillRepeatedly(Return(chrc0_.get()));
1225 EXPECT_CALL(*service0_, GetCharacteristic(kTestCharacteristicId1))
1227 .WillOnce(Return(chrc1_.get()));
1229 BluetoothGattNotifySession* session0 =
1230 new testing::NiceMock<MockBluetoothGattNotifySession>(
1231 kTestCharacteristicId0);
1232 MockBluetoothGattNotifySession* session1 =
1233 new testing::NiceMock<MockBluetoothGattNotifySession>(
1234 kTestCharacteristicId1);
1236 EXPECT_CALL(*session1, Stop(_))
1238 .WillOnce(InvokeCallbackArgument<0>());
1240 EXPECT_CALL(*chrc0_, StartNotifySession(_, _))
1242 .WillOnce(InvokeCallbackArgument<1>())
1244 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>(
1246 EXPECT_CALL(*chrc1_, StartNotifySession(_, _))
1249 InvokeCallbackWithScopedPtrArg<0, BluetoothGattNotifySession>(
1252 ExtensionTestMessageListener listener("ready", true);
1253 ASSERT_TRUE(LoadExtension(test_data_dir_.AppendASCII(
1254 "bluetooth_low_energy/start_stop_notifications")));
1256 EXPECT_TRUE(listener.WaitUntilSatisfied());
1258 std::vector<uint8> value;
1259 event_router()->GattCharacteristicValueChanged(
1260 mock_adapter_, chrc0_.get(), value);
1261 event_router()->GattCharacteristicValueChanged(
1262 mock_adapter_, chrc1_.get(), value);
1263 event_router()->GattCharacteristicValueChanged(
1264 mock_adapter_, chrc2_.get(), value);
1266 listener.Reply("go");
1268 EXPECT_TRUE(catcher.GetNextResult()) << catcher.message();
1269 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc2_.get());
1270 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc1_.get());
1271 event_router()->GattCharacteristicRemoved(mock_adapter_, chrc0_.get());
1272 event_router()->GattServiceRemoved(
1273 mock_adapter_, device0_.get(), service1_.get());
1274 event_router()->GattServiceRemoved(
1275 mock_adapter_, device0_.get(), service0_.get());